stonebot/discord/discord.go

97 lines
2.5 KiB
Go

package discord
import (
"bytes"
"fmt"
"strings"
"git.canopymc.net/Etzelia/stonebot/assets"
"git.canopymc.net/Etzelia/stonebot/database"
"github.com/bwmarrin/discordgo"
"go.jolheiser.com/beaver"
)
func New(token, prefix string, db *database.Database) (*discordgo.Session, error) {
bot, err := discordgo.New("Bot " + token)
if err != nil {
return nil, err
}
bot.Identify.Intents = discordgo.IntentsAllWithoutPrivileged
bot.AddHandler(Ready)
bot.AddHandler(CommandHandler(prefix, db))
bot.AddHandler(MessageHandler(prefix, db))
return bot, nil
}
func CommandHandler(prefix string, db *database.Database) func(session *discordgo.Session, message *discordgo.MessageCreate) {
return func(session *discordgo.Session, message *discordgo.MessageCreate) {
// Ignore non-prefix
if !strings.HasPrefix(message.Content, prefix) {
return
}
// Ignore bots
if message.Author.Bot {
return
}
args := strings.Fields(message.Content[1:])
switch strings.ToLower(args[0]) {
case "rocks", "stones":
rocks, err := db.Rocks()
if err != nil {
beaver.Errorf("could not count rocks: %v", err)
return
}
if _, err := session.ChannelMessageSend(message.ChannelID, fmt.Sprintf("%d ROCKS", rocks)); err != nil {
beaver.Errorf("could not send message: %v", err)
return
}
}
}
}
func MessageHandler(prefix string, db *database.Database) func(session *discordgo.Session, message *discordgo.MessageCreate) {
return func(session *discordgo.Session, message *discordgo.MessageCreate) {
// Ignore prefix
if strings.HasPrefix(message.Content, prefix) {
return
}
// Ignore bots
if message.Author.Bot {
return
}
rocks := strings.Count(message.Content, "rock")
rocks += strings.Count(message.Content, "stone")
if err := db.Rock(rocks); err != nil {
beaver.Errorf("could not add rocks: %v", err)
}
if rocks > 0 {
if _, err := session.ChannelMessageSendComplex(message.ChannelID, &discordgo.MessageSend{
Files: []*discordgo.File{
{
Name: "rocks.gif",
ContentType: "multipart/form-data",
Reader: bytes.NewReader(assets.RocksGif),
},
},
}); err != nil {
beaver.Errorf("could not send rocks gif: %v", err)
}
}
}
}
func Ready(session *discordgo.Session, ready *discordgo.Ready) {
beaver.Infof("https://discord.com/api/oauth2/authorize?client_id=%s&permissions=0&redirect_uri=https://stone.land&scope=bot", ready.User.ID)
if err := session.UpdateGameStatus(0, "with ROCKS"); err != nil {
beaver.Errorf("could not update status: %v", err)
}
}