all repos — honk @ 8f0b2616fe38e0e16ed887e23126277bbbee62ef

my fork of honk

configurable avatar colors
Ted Unangst tedu@tedunangst.com
Mon, 09 Dec 2019 21:20:35 -0500
commit

8f0b2616fe38e0e16ed887e23126277bbbee62ef

parent

5e120225c64ec68b029840d69c5672b3501a6fc8

7 files changed, 77 insertions(+), 27 deletions(-)

jump to
M admin.goadmin.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.goavatar.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.txtdocs/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.8docs/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 honk.gohonk.go

@@ -262,9 +262,9 @@ log.Fatal("need an argument: debug (on|off)")

} switch args[1] { case "on": - updateconfig("debug", 1) + setconfig("debug", 1) case "off": - updateconfig("debug", 0) + setconfig("debug", 0) default: log.Fatal("argument must be on or off") }
M util.goutil.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.goweb.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 {