ticket-pimp/client/discord/discord_router/router.go

102 lines
1.9 KiB
Go

package discord_router
import "github.com/bwmarrin/discordgo"
type HandlerFunc func(*discordgo.Session, *discordgo.InteractionCreate)
type RouteEntry struct {
CommandName string
Handler HandlerFunc
}
func (re *RouteEntry) Match(i *discordgo.InteractionCreate) bool {
switch i.Type {
case discordgo.InteractionApplicationCommand:
if i.ApplicationCommandData().Name != re.CommandName {
return false
}
case discordgo.InteractionMessageComponent:
if i.MessageComponentData().CustomID != re.CommandName {
return false
}
}
return true
}
type Router struct {
session *discordgo.Session
routes []RouteEntry
group []Group
}
func NewApp(s *discordgo.Session) *Router {
return &Router{
session: s,
}
}
func (r *Router) Route(cmd string, handlerFunc HandlerFunc) *Router {
r.routes = append(r.routes, RouteEntry{
CommandName: cmd,
Handler: handlerFunc,
})
return r
}
func (r *Router) Serve(s *discordgo.Session, i *discordgo.InteractionCreate) {
for _, e := range r.routes {
ok := e.Match(i)
if ok {
e.Handler(s, i)
}
}
for _, g := range r.group {
for _, e := range g.routes {
ok := e.Match(i)
if ok {
if len(g.middleware) < 1 {
e.Handler(s, i)
}
wrapped := e.Handler
// loop in reverse to preserve middleware order
for i := len(g.middleware) - 1; i >= 0; i-- {
wrapped = g.middleware[i](wrapped)
}
wrapped(s, i)
}
}
}
}
type Middleware func(HandlerFunc) HandlerFunc
type Group struct {
routes []RouteEntry
middleware []Middleware
}
func (r *Router) Use(m ...Middleware) *Group {
r.group = append(r.group, Group{
routes: []RouteEntry{},
middleware: m,
})
return &r.group[len(r.group)-1]
}
func (g *Group) Route(cmd string, handlerFunc HandlerFunc) *Group {
g.routes = append(g.routes, RouteEntry{
CommandName: cmd,
Handler: handlerFunc,
})
return g
}