configurable avatar colors
Ted Unangst tedu@tedunangst.com
Mon, 09 Dec 2019 21:20:35 -0500
7 files changed,
77 insertions(+),
27 deletions(-)
M
admin.go
→
admin.go
@@ -36,6 +36,9 @@ esc := "\x1b"
smcup := esc + "[?1049h" rmcup := esc + "[?1049l" + var avatarColors string + getconfig("avatarcolors", &avatarColors) + messages := []*struct { name string label string@@ -55,6 +58,11 @@ {
name: "loginmsg", label: "login", text: string(loginMsg), + }, + { + name: "avatarcolors", + label: "avatar colors (4 RGBA hex numbers)", + text: string(avatarColors), }, } cursel := 0@@ -239,7 +247,7 @@ }
stdout.Flush() } editing = false - updateconfig(m.name, m.text) + setconfig(m.name, m.text) hidecursor() drawscreen() }
M
avatar.go
→
avatar.go
@@ -16,13 +16,52 @@
package main import ( + "bufio" "bytes" "crypto/sha512" "image" "image/png" + "log" + "strconv" + "strings" ) -func avatar(name string) []byte { +var avatarcolors = [4][4]byte{ + {16, 0, 48, 255}, + {48, 0, 96, 255}, + {72, 0, 144, 255}, + {96, 0, 192, 255}, +} + +func loadAvatarColors() { + var colors string + getconfig("avatarcolors", &colors) + if colors == "" { + return + } + r := bufio.NewReader(strings.NewReader(colors)) + for i := 0; i < 4; i++ { + l, _ := r.ReadString(' ') + for l == " " { + l, _ = r.ReadString(' ') + } + l = strings.Trim(l, "# \n") + if len(l) == 6 { + l = l + "ff" + } + c, err := strconv.ParseUint(l, 16, 32) + if err != nil { + log.Printf("error reading avatar color %d: %s", i, err) + continue + } + avatarcolors[i][0] = byte(c >> 24 & 0xff) + avatarcolors[i][1] = byte(c >> 16 & 0xff) + avatarcolors[i][2] = byte(c >> 8 & 0xff) + avatarcolors[i][3] = byte(c >> 0 & 0xff) + } +} + +func genAvatar(name string) []byte { h := sha512.New() h.Write([]byte(name)) s := h.Sum(nil)@@ -33,25 +72,25 @@ p := i*img.Stride + j*4
xx := i/16*16 + j/16 x := s[xx] if x < 64 { - img.Pix[p+0] = 16 - img.Pix[p+1] = 0 - img.Pix[p+2] = 48 - img.Pix[p+3] = 255 + img.Pix[p+0] = avatarcolors[0][0] + img.Pix[p+1] = avatarcolors[0][1] + img.Pix[p+2] = avatarcolors[0][2] + img.Pix[p+3] = avatarcolors[0][3] } else if x < 128 { - img.Pix[p+0] = 48 - img.Pix[p+1] = 0 - img.Pix[p+2] = 96 - img.Pix[p+3] = 255 + img.Pix[p+0] = avatarcolors[1][0] + img.Pix[p+1] = avatarcolors[1][1] + img.Pix[p+2] = avatarcolors[1][2] + img.Pix[p+3] = avatarcolors[1][3] } else if x < 192 { - img.Pix[p+0] = 72 - img.Pix[p+1] = 0 - img.Pix[p+2] = 144 - img.Pix[p+3] = 255 + img.Pix[p+0] = avatarcolors[2][0] + img.Pix[p+1] = avatarcolors[2][1] + img.Pix[p+2] = avatarcolors[2][2] + img.Pix[p+3] = avatarcolors[2][3] } else { - img.Pix[p+0] = 96 - img.Pix[p+1] = 0 - img.Pix[p+2] = 192 - img.Pix[p+3] = 255 + img.Pix[p+0] = avatarcolors[3][0] + img.Pix[p+1] = avatarcolors[3][1] + img.Pix[p+2] = avatarcolors[3][2] + img.Pix[p+3] = avatarcolors[3][3] } } }
M
docs/changelog.txt
→
docs/changelog.txt
@@ -2,6 +2,8 @@ changelog
-- next ++ Configurable avatar colors. + + Optional pleroma color scheme for the home sick... + Rebalance colors slightly. Looks a little fresher now?
M
docs/honk.8
→
docs/honk.8
@@ -100,6 +100,8 @@ .It about
Displayed on the about page. .It login Displayed about the login form. +.It avatar colors +Four 32-bit hex colors (RGBA). .El .Pp .Ss User Admin
M
util.go
→
util.go
@@ -391,13 +391,8 @@ }
func setconfig(key string, val interface{}) error { db := opendatabase() + db.Exec("delete from config where key = ?", key) _, err := db.Exec("insert into config (key, value) values (?, ?)", key, val) - return err -} - -func updateconfig(key string, val interface{}) error { - db := opendatabase() - _, err := db.Exec("update config set value = ? where key = ?", val, key) return err }
M
web.go
→
web.go
@@ -1988,8 +1988,11 @@ return fmt.Sprintf("%d", secs)
} func avatate(w http.ResponseWriter, r *http.Request) { + if debugMode { + loadAvatarColors() + } n := r.FormValue("a") - a := avatar(n) + a := genAvatar(n) w.Header().Set("Cache-Control", "max-age="+somedays()) w.Write(a) }@@ -2261,6 +2264,7 @@ assets := []string{viewDir + "/views/style.css", dataDir + "/views/local.css", viewDir + "/views/honkpage.js"}
for _, s := range assets { savedassetparams[s] = getassetparam(s) } + loadAvatarColors() } for _, h := range preservehooks {