package bot import ( "context" "errors" "jinx/pkg/discord" "github.com/rs/zerolog" ) type Bot struct { client *discord.Discord logger *zerolog.Logger cancelContext context.CancelFunc } func NewBot(token string, logger *zerolog.Logger) *Bot { return &Bot{ client: discord.NewClient(token, logger), logger: logger, cancelContext: nil, } } func (b *Bot) Start() error { var err error ctx, cancel := context.WithCancel(context.Background()) b.cancelContext = cancel defer func() { if err != nil { cancel() } }() b.client.AddEventHandler(discord.DISCORD_EVENT_READY, func(_ any) { b.logger.Info().Msg("ready!") }) b.client.AddEventHandler(discord.DISCORD_EVENT_MESSAGE, func(m any) { msg := m.(discord.GatewayMessageCreateEvent) b.logger.Debug().Msgf("message: %s", msg.Content) if msg.Content == "ping" { if err := b.client.SendMessage(msg.ChannelID, "pong"); err != nil { b.logger.Error().Err(err).Msg("error sending message") } } }) if err := b.client.Connect(ctx); err != nil { return err } return nil } func (b *Bot) Stop() error { if b.cancelContext == nil { return errors.New("bot has no context") } b.cancelContext() return b.client.Disconnect() }