identicond/cmd/identicond/main.go

56 lines
1.2 KiB
Go

package main
import (
"bytes"
"image/png"
"net/http"
"os"
"github.com/Xe/ln"
"github.com/Xe/ln/ex"
"github.com/golang/groupcache"
qidenticon "github.com/jakobvarmose/go-qidenticon"
chi "gopkg.in/chi.v3"
)
const (
avatarWidth = 512
fiftyMegs = 1024 * 1024 * 50
)
func makeQidenticon(ctx groupcache.Context, key string, dest groupcache.Sink) error {
img := qidenticon.Render(qidenticon.Code(key), avatarWidth, qidenticon.DefaultSettings())
buf := bytes.NewBuffer(nil)
err := png.Encode(buf, img)
if err != nil {
return err
}
dest.SetBytes(buf.Bytes())
return nil
}
func main() {
g := groupcache.NewGroup("identicons", fiftyMegs, groupcache.GetterFunc(makeQidenticon))
r := chi.NewRouter()
r.Use(ex.HTTPLog)
r.Get("/{hash}", func(w http.ResponseWriter, r *http.Request) {
var bs []byte
sink := groupcache.AllocatingByteSliceSink(&bs)
hash := chi.URLParam(r, "hash")
err := g.Get(r.Context(), hash, sink)
if err != nil {
ln.Error(r.Context(), err, ln.Action("can't get hash"), ln.F{"hash": hash})
http.Error(w, "internal server error, please contact the admin", http.StatusInternalServerError)
return
}
w.Header().Add("Content-Type", "image/png")
w.Write(bs)
})
http.ListenAndServe(":"+os.Getenv("PORT"), r)
}