diff --git a/activity.go b/activity.go
index a147920..9a8daa4 100644
--- a/activity.go
+++ b/activity.go
@@ -1151,7 +1151,7 @@ func jonkjonk(user *WhatAbout, h *Honk) (junk.Junk, junk.Junk) {
t["icon"] = i
tags = append(tags, t)
}
- for _, e := range bloat_fixupflags(h) {
+ for _, e := range fixupflags(h) {
t := junk.New()
t["id"] = e.ID
t["type"] = "Emoji"
diff --git a/avatar.go b/avatar.go
index 46bcdcd..4294f50 100644
--- a/avatar.go
+++ b/avatar.go
@@ -19,11 +19,16 @@ import (
"bufio"
"bytes"
"crypto/sha512"
+ "fmt"
"image"
"image/png"
"log"
+ "net/http"
+ "regexp"
"strconv"
"strings"
+
+ "github.com/gorilla/mux"
)
var avatarcolors = [4][4]byte{
@@ -98,3 +103,83 @@ func genAvatar(name string) []byte {
png.Encode(&buf, img)
return buf.Bytes()
}
+
+func showflag(writer http.ResponseWriter, req *http.Request) {
+ code := mux.Vars(req)["code"]
+ colors := strings.Split(code, ",")
+ numcolors := len(colors)
+ vert := false
+ if colors[0] == "vert" {
+ vert = true
+ colors = colors[1:]
+ numcolors--
+ if numcolors == 0 {
+ http.Error(writer, "bad flag", 400)
+ return
+ }
+ }
+ pixels := make([][4]byte, numcolors)
+ for i := 0; i < numcolors; i++ {
+ hex := colors[i]
+ if len(hex) == 3 {
+ hex = fmt.Sprintf("%c%c%c%c%c%c",
+ hex[0], hex[0], hex[1], hex[1], hex[2], hex[2])
+ }
+ c, _ := strconv.ParseUint(hex, 16, 32)
+ r := byte(c >> 16 & 0xff)
+ g := byte(c >> 8 & 0xff)
+ b := byte(c >> 0 & 0xff)
+ pixels[i][0] = r
+ pixels[i][1] = g
+ pixels[i][2] = b
+ pixels[i][3] = 255
+ }
+
+ h := 128
+ w := h * 3 / 2
+ img := image.NewRGBA(image.Rect(0, 0, w, h))
+ if vert {
+ for j := 0; j < w; j++ {
+ pix := pixels[j*numcolors/w][:]
+ for i := 0; i < h; i++ {
+ p := i*img.Stride + j*4
+ copy(img.Pix[p:], pix)
+ }
+ }
+ } else {
+ for i := 0; i < h; i++ {
+ pix := pixels[i*numcolors/h][:]
+ for j := 0; j < w; j++ {
+ p := i*img.Stride + j*4
+ copy(img.Pix[p:], pix)
+ }
+ }
+ }
+
+ writer.Header().Set("Cache-Control", "max-age="+somedays())
+ png.Encode(writer, img)
+}
+
+var re_flags = regexp.MustCompile("flag:[[:alnum:],]+")
+
+func fixupflags(h *Honk) []Emu {
+ var emus []Emu
+ count := 0
+ h.Noise = re_flags.ReplaceAllStringFunc(h.Noise, func(m string) string {
+ count++
+ var e Emu
+ e.Name = fmt.Sprintf(":flag%d:", count)
+ e.ID = fmt.Sprintf("https://%s/flag/%s", serverName, m[5:])
+ emus = append(emus, e)
+ return e.Name
+ })
+ return emus
+}
+
+func renderflags(h *Honk) {
+ h.Noise = re_flags.ReplaceAllStringFunc(h.Noise, func(m string) string {
+ code := m[5:]
+ src := fmt.Sprintf("https://%s/flag/%s", serverName, code)
+ return fmt.Sprintf(``, "flag", src)
+ })
+}
diff --git a/bloat.go b/bloat.go
index dea2068..e89675f 100644
--- a/bloat.go
+++ b/bloat.go
@@ -14,95 +14,3 @@
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package main
-
-import (
- "fmt"
- "image"
- "image/png"
- "net/http"
- "regexp"
- "strconv"
- "strings"
-
- "github.com/gorilla/mux"
-)
-
-func bloat_showflag(writer http.ResponseWriter, req *http.Request) {
- code := mux.Vars(req)["code"]
- colors := strings.Split(code, ",")
- numcolors := len(colors)
- vert := false
- if colors[0] == "vert" {
- vert = true
- colors = colors[1:]
- numcolors--
- if numcolors == 0 {
- http.Error(writer, "bad flag", 400)
- return
- }
- }
- pixels := make([][4]byte, numcolors)
- for i := 0; i < numcolors; i++ {
- hex := colors[i]
- if len(hex) == 3 {
- hex = fmt.Sprintf("%c%c%c%c%c%c",
- hex[0], hex[0], hex[1], hex[1], hex[2], hex[2])
- }
- c, _ := strconv.ParseUint(hex, 16, 32)
- r := byte(c >> 16 & 0xff)
- g := byte(c >> 8 & 0xff)
- b := byte(c >> 0 & 0xff)
- pixels[i][0] = r
- pixels[i][1] = g
- pixels[i][2] = b
- pixels[i][3] = 255
- }
-
- h := 128
- w := h * 3 / 2
- img := image.NewRGBA(image.Rect(0, 0, w, h))
- if vert {
- for j := 0; j < w; j++ {
- pix := pixels[j*numcolors/w][:]
- for i := 0; i < h; i++ {
- p := i*img.Stride + j*4
- copy(img.Pix[p:], pix)
- }
- }
- } else {
- for i := 0; i < h; i++ {
- pix := pixels[i*numcolors/h][:]
- for j := 0; j < w; j++ {
- p := i*img.Stride + j*4
- copy(img.Pix[p:], pix)
- }
- }
- }
-
- writer.Header().Set("Cache-Control", "max-age="+somedays())
- png.Encode(writer, img)
-}
-
-var re_flags = regexp.MustCompile("flag:[[:alnum:],]+")
-
-func bloat_fixupflags(h *Honk) []Emu {
- var emus []Emu
- count := 0
- h.Noise = re_flags.ReplaceAllStringFunc(h.Noise, func(m string) string {
- count++
- var e Emu
- e.Name = fmt.Sprintf(":flag%d:", count)
- e.ID = fmt.Sprintf("https://%s/flag/%s", serverName, m[5:])
- emus = append(emus, e)
- return e.Name
- })
- return emus
-}
-
-func bloat_renderflags(h *Honk) {
- h.Noise = re_flags.ReplaceAllStringFunc(h.Noise, func(m string) string {
- code := m[5:]
- src := fmt.Sprintf("https://%s/flag/%s", serverName, code)
- return fmt.Sprintf(``, "flag", src)
- })
-}
diff --git a/docs/honk.5 b/docs/honk.5
index 3200567..2028ace 100644
--- a/docs/honk.5
+++ b/docs/honk.5
@@ -104,6 +104,11 @@ operator followed by the file name.
A full list of emoji and memes may be found in the
.Pa funzone .
.Pp
+Custom flag emoji may be generated on the fly by specifying comma separated
+hexadecimal RGB values, one for each stripe.
+.Dl flag:306,002,dcf
+Vertical stripes may be selected by specfying "vert" for the first value.
+.Pp
There are no length restrictions, but remember, somebody is going to have
to read this noise.
.Pp
diff --git a/fun.go b/fun.go
index ea09c5e..1b427bd 100644
--- a/fun.go
+++ b/fun.go
@@ -139,7 +139,7 @@ func reverbolate(userid int64, honks []*Honk) {
}
return e
}
- bloat_renderflags(h)
+ renderflags(h)
h.Precis = re_emus.ReplaceAllStringFunc(h.Precis, emuxifier)
h.Noise = re_emus.ReplaceAllStringFunc(h.Noise, emuxifier)
diff --git a/web.go b/web.go
index bf75030..5ae79c0 100644
--- a/web.go
+++ b/web.go
@@ -2477,7 +2477,7 @@ func serve() {
getters.HandleFunc("/meme/{meme:[^.]*[^/]+}", servememe)
getters.HandleFunc("/.well-known/webfinger", fingerlicker)
- getters.HandleFunc("/flag/{code:.+}", bloat_showflag)
+ getters.HandleFunc("/flag/{code:.+}", showflag)
getters.HandleFunc("/server", serveractor)
posters.HandleFunc("/server/inbox", serverinbox)