101 lines
2.2 KiB
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 (%s)", front.Name, 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)
|
|
}
|