package bot import ( "jinx/pkg/discord" "jinx/pkg/discord/events" "strings" "github.com/rs/zerolog" ) const PREFIX = "!" type Bot struct { client *discord.Discord logger *zerolog.Logger } func NewBot(token string, logger *zerolog.Logger) *Bot { return &Bot{ client: discord.New(token, logger), logger: logger, } } func (b *Bot) Start() error { b.client.On(events.READY, func(_ any) { b.logger.Info().Msg("ready!") }) b.client.On(events.MESSAGE, func(m any) { msg := m.(events.Message) b.onMessage(msg) }) if err := b.client.Connect(); err != nil { return err } return nil } func (b *Bot) Stop() error { return b.client.Disconnect() } func (b *Bot) onMessage(msg events.Message) { b.logger.Debug().Msgf("message: %s", msg.Content) if strings.HasPrefix(msg.Content, PREFIX) { cmd := strings.TrimPrefix(msg.Content, PREFIX) cmd = strings.Fields(cmd)[0] rest := strings.TrimPrefix(msg.Content, PREFIX+cmd) b.onCommand(cmd, rest, msg) } } func (b *Bot) onCommand(name string, rest string, msg events.Message) { if cmd, ok := nameToCmd[name]; ok { b.logger.Debug().Msg("executing command...") if err := cmd(b, rest, msg); err != nil { b.logger.Error().Err(err).Msg("error executing command") b.client.SendMessage(msg.ChannelID, "error executing command") } } else { b.logger.Debug().Msgf("unknown command: %s", name) b.client.SendMessage(msg.ChannelID, "unknown command") } }