From 0345b1cba172760574c89f6a1cdd5e0718e92cf2 Mon Sep 17 00:00:00 2001 From: Ryan Cavicchioni Date: Mon, 5 Sep 2022 16:55:07 -0500 Subject: [PATCH] Add a command router This will only required one handler for all of the commands --- bot/command.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ cmd/bb/main.go | 2 ++ 2 files changed, 89 insertions(+) create mode 100644 bot/command.go diff --git a/bot/command.go b/bot/command.go new file mode 100644 index 0000000..92f796f --- /dev/null +++ b/bot/command.go @@ -0,0 +1,87 @@ +package bot + +import ( + "fmt" + + "git.kill0.net/chill9/beepboop/lib" + "github.com/bwmarrin/discordgo" + log "github.com/sirupsen/logrus" +) + +var ( + DefaultCommander *Commander +) + +type ( + Commander struct { + commands map[string]*Command + } + + Command struct { + Name string + Config Config + Func func(cmd *Command, args []string) error + Session *discordgo.Session + Message *discordgo.MessageCreate + } +) + +func init() { + DefaultCommander = NewCommander() +} + +func NewCommander() *Commander { + cmdr := new(Commander) + cmdr.commands = make(map[string]*Command) + return cmdr +} + +func (cmdr *Commander) AddCommand(cmd *Command) { + cmdr.commands[cmd.Name] = cmd +} + +func (cmdr *Commander) GetCommand(name string) (*Command, bool) { + cmd, ok := cmdr.commands[name] + return cmd, ok +} + +func AddCommand(cmd *Command) { + DefaultCommander.AddCommand(cmd) +} + +func GetCommand(name string) (*Command, bool) { + cmd, ok := DefaultCommander.GetCommand(name) + return cmd, ok +} + +func NewCommandHandler(config Config) func(s *discordgo.Session, m *discordgo.MessageCreate) { + return func(s *discordgo.Session, m *discordgo.MessageCreate) { + var cmd *Command + + if m.Author.ID == s.State.User.ID { + return + } + + if !lib.HasCommand(m.Content, config.Prefix) { + return + } + + cmdName, args := lib.SplitCommandAndArgs(m.Content, config.Prefix) + + cmd, ok := GetCommand(cmdName) + if ok { + cmd.Config = config + cmd.Name = cmdName + cmd.Session = s + cmd.Message = m + + log.Debugf("command: %+v, args: %+v", cmd.Name, args) + cmd.Func(cmd, args) + + return + } + + log.Warnf("unknown command: %+v, args: %+v", cmdName, args) + s.ChannelMessageSend(m.ChannelID, fmt.Sprintf("unknown command: %s", cmdName)) + } +} diff --git a/cmd/bb/main.go b/cmd/bb/main.go index 395cb02..8fbf3ba 100644 --- a/cmd/bb/main.go +++ b/cmd/bb/main.go @@ -55,6 +55,8 @@ func main() { dg.AddHandler(h.Handle) } + dg.AddHandler(bot.NewCommandHandler(C)) + dg.Identify.Intents = discordgo.IntentsGuildMessages | discordgo.IntentsDirectMessages err = dg.Open()