package discord import ( "strings" "go.etztech.xyz/sedbot/config" "go.etztech.xyz/sedbot/database" "github.com/bwmarrin/discordgo" "go.jolheiser.com/beaver" ) // Register commands to this map var commands = make(map[string]command) type commandInit struct { session *discordgo.Session message *discordgo.Message config *config.Config database *database.Database } type command struct { validate func(cmd commandInit) bool run func(cmd commandInit) error help string } func Bot(cfg *config.Config, db *database.Database) (*discordgo.Session, error) { bot, err := discordgo.New("Bot " + cfg.Token) if err != nil { return nil, err } Links(cfg) bot.AddHandler(commandHandler(cfg, db)) bot.AddHandler(messageHandler(cfg, db)) beaver.Info("https://discord.com/api/oauth2/authorize?client_id=718905104643784825&permissions=0&redirect_uri=https%3A%2F%2Fbirbmc.com&scope=bot") return bot, nil } func sendTyping(s *discordgo.Session, channelID string) { if err := s.ChannelTyping(channelID); err != nil { beaver.Errorf("could not send typing status: %v", err) } } func sendMessage(s *discordgo.Session, channelID, content string) *discordgo.Message { msg, err := s.ChannelMessageSend(channelID, content) if err != nil { beaver.Errorf("could not send message: %v", err) return nil } return msg } func isStaff(authorRoleIDs, staffRoleIDs []string) bool { for _, aRole := range authorRoleIDs { for _, sRole := range staffRoleIDs { if aRole == sRole { return true } } } return false } func commandHandler(cfg *config.Config, db *database.Database) func(s *discordgo.Session, m *discordgo.MessageCreate) { return func(s *discordgo.Session, m *discordgo.MessageCreate) { // Ignore bots if m.Author.Bot { return } // Check prefix if !strings.HasPrefix(m.Content, cfg.Prefix) { return } content := m.Content[1:] args := strings.Fields(content) if len(args) == 0 { return } cmdArg := strings.ToLower(args[0]) isHelp := strings.EqualFold(cmdArg, "help") cmd, ok := commands[cmdArg] if !ok && !isHelp { return } if isHelp { sendMessage(s, m.ChannelID, cmd.help) return } cmdInit := commandInit{ session: s, message: m.Message, config: cfg, database: db, } if !cmd.validate(cmdInit) { sendMessage(s, m.ChannelID, "You cannot run this command.") return } if err := cmd.run(cmdInit); err != nil { sendMessage(s, m.ChannelID, err.Error()) } } } func messageHandler(cfg *config.Config, db *database.Database) func(s *discordgo.Session, m *discordgo.MessageCreate) { return func(s *discordgo.Session, m *discordgo.MessageCreate) { // Ignore bots if m.Author.Bot { return } // [FIRED] increment for _, role := range m.MentionRoles { if cfg.FiredRole == role { if err := db.IncrementPing(cfg.FiredRole); err != nil { beaver.Errorf("could not increment ping for %s: %v", cfg.FiredRole, err) } } } } }