plapkit/hook_handler.go

101 lines
2.2 KiB
Go

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)
}