102 lines
2.3 KiB
Go
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)
|
|
}
|