package main import ( "encoding/json" "fmt" "log" "net/http" ) type HookPayload struct { Type string `json:"type"` SigningToken string `json:"signing_token"` SystemID string `json:"system_id"` ID string `json:"id,omitempty"` Data map[string]interface{} `json:"data,omitempty"` } type hookHandler func(h HookPayload) var ( hookHandlers map[string]hookHandler = map[string]hookHandler{ "CREATE_SWITCH": handleHookCreateSwitch, "CREATE_MESSAGE": handleHookCreateMessage, } ) func postGetHookToken(rw http.ResponseWriter, req *http.Request) { if req.Method != "POST" { errMethodNotAllowed(rw) return } var payload HookPayload err := json.NewDecoder(req.Body).Decode(&payload) if err != nil { log.Println("[postGetHookToken] decode failed", err) errBadRequest(rw) return } if payload.SigningToken != SigningToken { log.Println("[postGetHookToken] signing token did not match") errUnauthorized(rw) return } if payload.Type == "PING" { log.Println("[postGetHookToken] PING from PluralKit") basicOk(rw) return } handler, ok := hookHandlers[payload.Type] if !ok { log.Println("[postGetHookToken] no handler for event", payload.Type) basicNoContent(rw) return } go handler(payload) } func handleHookCreateSwitch(h HookPayload) { sw, err := pkApi.GetSwitch(h.SystemID, h.ID) if err != nil { log.Println("[handleHookCreateSwitch] switch fetch failed:", err) return } log.Println("[handleHookCreateSwitch] got switch", sw.Members) log.Println("[handleHookCreateSwitch] system id", h.SystemID, " -- switch id", h.ID) front := &PluralKitMember{ UUID: "00000000-0000-0000-0000-000000000000", Name: "???", } if len(sw.Members) != 0 { front = sw.Members[0] } extra := "" alt, ok := fediAlts[front.Name] if ok { extra = fmt.Sprintf(" (%s)", alt) } go dsiApi.UpdateFrontField(front.Name + extra) go promCountSwitches(h.SystemID, sw.Members) // TODO: discord nickname updates } func handleHookCreateMessage(h HookPayload) { _, ok := h.Data["member"].(map[string]interface{}) if !ok { log.Println("[handleHookCreateMessage] rejected, missing member", h.Data) return } go promCountMessage(h) }