Add a command router #2

Merged
ryanc merged 2 commits from add-command-router into develop 2022-09-06 12:49:19 +00:00
2 changed files with 89 additions and 0 deletions
Showing only changes of commit 0345b1cba1 - Show all commits

87
bot/command.go Normal file
View File

@ -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))
}
}

View File

@ -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()