plapkit/hook_handler.go
2024-06-25 22:46:58 -04:00

102 lines
2.3 KiB
Go

package main
import (
"encoding/json"
"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)
}
const SwitchOut = "00000000-0000-0000-0000-000000000000"
func handleHookCreateSwitch(h HookPayload) {
members, ok := h.Data["members"].([]interface{})
if !ok {
log.Println("[handleHookCreateSwitch] ERR rejected, missing members", h.Data)
return
}
log.Println("[handleHookCreateSwitch] got switch", members, h)
// switch out, stop
front := SwitchOut
if len(members) != 0 {
front, ok = members[0].(string)
if !ok {
log.Println("[handleHookCreateSwitch] ERR rejected, first member wasn't a string", members)
return
}
}
member, err := pkApi.GetMember(front)
if err != nil {
log.Printf("[handleHookCreateSwitch] pk member fetch failed, skipping named requirements")
} else {
go dsiApi.UpdateFrontField(member.Name)
}
go promCountSwitches(h, 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)
}