catbase/plugins/cowboy/cowboy.go

197 lines
5.2 KiB
Go
Raw Normal View History

2022-07-21 15:25:10 +00:00
package cowboy
import (
2022-07-21 15:39:50 +00:00
"fmt"
2022-07-23 04:17:44 +00:00
"github.com/bwmarrin/discordgo"
"github.com/velour/catbase/plugins/emojy"
2022-07-21 15:25:10 +00:00
"regexp"
2022-07-22 21:06:55 +00:00
"github.com/velour/catbase/connectors/discord"
2022-07-21 15:25:10 +00:00
"github.com/rs/zerolog/log"
"github.com/velour/catbase/bot"
"github.com/velour/catbase/config"
)
type Cowboy struct {
b bot.Bot
c *config.Config
emojyPath string
baseEmojyURL string
2022-07-21 15:25:10 +00:00
}
2022-07-23 04:17:44 +00:00
var defaultOverlays = map[string]string{"hat": "hat"}
2022-07-21 15:25:10 +00:00
func New(b bot.Bot) *Cowboy {
emojyPath := b.Config().Get("emojy.path", "emojy")
baseURL := b.Config().Get("emojy.baseURL", "/emojy/file")
2022-07-21 15:25:10 +00:00
c := Cowboy{
b: b,
c: b.Config(),
emojyPath: emojyPath,
baseEmojyURL: baseURL,
2022-07-21 15:25:10 +00:00
}
c.register()
c.registerWeb()
return &c
}
func (p *Cowboy) register() {
tbl := bot.HandlerTable{
2022-07-23 04:17:44 +00:00
{
Kind: bot.Startup, IsCmd: false,
Regex: regexp.MustCompile(`.*`),
Handler: func(r bot.Request) bool {
log.Debug().Msgf("Got bot.Startup")
switch conn := r.Conn.(type) {
case *discord.Discord:
log.Debug().Msg("Found a discord connection")
p.registerCmds(conn)
}
return false
},
},
2022-07-22 21:06:55 +00:00
{
Kind: bot.Message, IsCmd: true,
Regex: regexp.MustCompile(`(?i)^:cowboy_clear_cache:$`),
Handler: func(r bot.Request) bool {
cowboyClearCache()
p.b.Send(r.Conn, bot.Ephemeral, r.Msg.Channel, r.Msg.User.ID, ":cowboy_cache_cleared:")
return true
},
},
2022-07-21 15:25:10 +00:00
{
Kind: bot.Message, IsCmd: false,
Regex: regexp.MustCompile(`(?i)^:cowboy_(?P<what>.+):$`),
Handler: func(r bot.Request) bool {
p.makeCowboy(r)
return true
},
},
}
p.b.RegisterTable(p, tbl)
}
func (p *Cowboy) makeCowboy(r bot.Request) {
2022-07-22 21:06:55 +00:00
what := r.Values["what"]
// This'll add the image to the cowboy_cache before discord tries to access it over http
2022-07-23 04:17:44 +00:00
overlays := p.c.GetMap("cowboy.overlays", defaultOverlays)
hat := overlays["hat"]
i, err := cowboy(p.emojyPath, p.baseEmojyURL, hat, what)
2022-07-22 21:06:55 +00:00
if err != nil {
log.Error().Err(err).Msg(":cowboy_fail:")
p.b.Send(r.Conn, bot.Ephemeral, r.Msg.Channel, r.Msg.User.ID, "Hey cowboy, that image wasn't there.")
return
}
2022-07-21 15:25:10 +00:00
log.Debug().Msgf("makeCowboy: %s", r.Values["what"])
base := p.c.Get("baseURL", "http://127.0.0.1:1337")
u := base + "/cowboy/img/" + r.Values["what"]
2022-07-21 15:39:50 +00:00
p.b.Send(r.Conn, bot.Delete, r.Msg.Channel, r.Msg.ID)
2022-07-21 15:25:10 +00:00
p.b.Send(r.Conn, bot.Message, r.Msg.Channel, "", bot.ImageAttachment{
URL: u,
2022-07-21 15:39:50 +00:00
AltTxt: fmt.Sprintf("%s: %s", r.Msg.User.Name, r.Msg.Body),
2022-07-22 22:27:20 +00:00
Width: i.Bounds().Max.X,
Height: i.Bounds().Max.Y,
2022-07-21 15:25:10 +00:00
})
}
2022-07-22 21:04:51 +00:00
func (p *Cowboy) registerCmds(d *discord.Discord) {
2022-07-23 04:17:44 +00:00
log.Debug().Msg("About to register some startup commands")
cmd := discordgo.ApplicationCommand{
Name: "cowboy",
Description: "cowboy-ify an emojy",
Options: []*discordgo.ApplicationCommandOption{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "emojy",
Description: "which emojy you want cowboied",
Required: true,
},
},
}
overlays := p.c.GetMap("cowboy.overlays", defaultOverlays)
hat := overlays["hat"]
if err := d.RegisterSlashCmd(cmd, p.mkOverlayCB(hat)); err != nil {
log.Error().Err(err).Msg("could not register cowboy command")
}
if p.c.GetInt("cowboy.overlaysEnabled", 0) == 0 {
return
}
2022-07-23 04:17:44 +00:00
cmd = discordgo.ApplicationCommand{
Name: "overlay",
Description: "overlay-ify an emojy",
Options: []*discordgo.ApplicationCommandOption{
{
Type: discordgo.ApplicationCommandOptionString,
Name: "overlay",
Description: "which overlay you want",
Required: true,
},
{
Type: discordgo.ApplicationCommandOptionString,
Name: "emojy",
Description: "which emojy you want overlaid",
Required: true,
},
},
}
if err := d.RegisterSlashCmd(cmd, p.mkOverlayCB("")); err != nil {
log.Error().Err(err).Msg("could not register cowboy command")
}
}
func (p *Cowboy) mkOverlayCB(overlay string) func(s *discordgo.Session, i *discordgo.InteractionCreate) {
return func(s *discordgo.Session, i *discordgo.InteractionCreate) {
log.Debug().Msg("got a cowboy command")
lastEmojy := p.c.Get("cowboy.lastEmojy", "rust")
emojyPlugin := emojy.NewAPI(p.b)
name := i.ApplicationCommandData().Options[0].StringValue()
if overlay == "" {
overlay = name
name = i.ApplicationCommandData().Options[1].StringValue()
}
msg := fmt.Sprintf("You asked for %s overlaid by %s", name, overlay)
newEmojy, err := cowboy(p.emojyPath, p.baseEmojyURL, overlay, name)
if err != nil {
msg = err.Error()
goto resp
}
err = emojyPlugin.RmEmojy(p.b.DefaultConnector(), lastEmojy)
if err != nil {
msg = err.Error()
goto resp
}
// Look, I don't love it as a workaround either
if overlay == "hat" {
overlay = "cowboy"
}
name = emojy.SanitizeName(overlay + "_" + name)
err = emojyPlugin.UploadEmojyImage(p.b.DefaultConnector(), name, newEmojy)
if err != nil {
msg = err.Error()
goto resp
}
p.c.Set("cowboy.lastEmojy", name)
msg = fmt.Sprintf("You replaced %s with a new emojy %s, pardner!", lastEmojy, name)
resp:
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Content: msg,
Flags: uint64(discordgo.MessageFlagsEphemeral),
},
})
}
2022-07-22 21:04:51 +00:00
}