Files
2026-05-10 18:07:51 +02:00

103 lines
3.1 KiB
Go

package discord
import (
"log/slog"
"strings"
"github.com/bwmarrin/discordgo"
"github.com/leolionad58/ticketbot/internal/discord/commands"
"github.com/leolionad58/ticketbot/internal/discord/components"
)
// Router dispatches Discord interactions to the appropriate handler.
type Router struct {
PanelCmd *commands.PanelCommand
TicketCmd *commands.TicketCommand
ConvocCmd *commands.ConvocationCommand
PanelComp *components.PanelComponent
TicketComp *components.TicketComponent
ConvocComp *components.ConvocationComponent
IsGuildAllowed func(guildID string) bool
}
func (r *Router) Handle(s *discordgo.Session, i *discordgo.InteractionCreate) {
if r.IsGuildAllowed != nil && !r.IsGuildAllowed(i.GuildID) {
slog.Debug("ignoring interaction from unlisted guild", "guild_id", i.GuildID)
return
}
switch i.Type {
case discordgo.InteractionApplicationCommand:
r.routeCommand(s, i)
case discordgo.InteractionMessageComponent:
r.routeComponent(s, i)
case discordgo.InteractionModalSubmit:
r.routeModal(s, i)
}
}
func (r *Router) routeCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
name := i.ApplicationCommandData().Name
slog.Debug("command received", "name", name, "user_id", memberUserID(i), "guild_id", i.GuildID)
switch name {
case "panel_send":
r.PanelCmd.Handle(s, i)
case "ticket":
r.TicketCmd.Handle(s, i)
case "convocation":
r.ConvocCmd.Handle(s, i)
default:
slog.Warn("unknown command", "name", name)
}
}
func (r *Router) routeComponent(s *discordgo.Session, i *discordgo.InteractionCreate) {
customID := i.MessageComponentData().CustomID
slog.Debug("component received", "custom_id", customID, "user_id", memberUserID(i))
switch {
case strings.HasPrefix(customID, "panel:open:"):
r.PanelComp.Handle(s, i)
case strings.HasPrefix(customID, "claim:take:"):
r.TicketComp.HandleClaim(s, i)
case strings.HasPrefix(customID, "ticket:delete:confirm:"):
r.TicketComp.HandleDeleteConfirm(s, i)
case strings.HasPrefix(customID, "ticket:delete:yes:"):
r.TicketComp.HandleDeleteYes(s, i)
case customID == "ticket:delete:cancel":
r.TicketComp.HandleDeleteCancel(s, i)
case strings.HasPrefix(customID, "convoc:delete:"):
r.TicketComp.HandleConvocationDelete(s, i)
case strings.HasPrefix(customID, "convoc:panel:"):
if r.ConvocComp != nil {
r.ConvocComp.HandlePanel(s, i)
}
default:
slog.Warn("unknown component", "custom_id", customID)
}
}
func (r *Router) routeModal(s *discordgo.Session, i *discordgo.InteractionCreate) {
customID := i.ModalSubmitData().CustomID
slog.Debug("modal received", "custom_id", customID, "user_id", memberUserID(i))
switch {
case strings.HasPrefix(customID, "modal:ticket:"):
r.PanelComp.HandleModalSubmit(s, i)
case strings.HasPrefix(customID, "modal:convoc:"):
if r.ConvocComp != nil {
r.ConvocComp.HandleModalSubmit(s, i)
}
default:
slog.Warn("unknown modal", "custom_id", customID)
}
}
func memberUserID(i *discordgo.InteractionCreate) string {
if i.Member != nil && i.Member.User != nil {
return i.Member.User.ID
}
if i.User != nil {
return i.User.ID
}
return ""
}