Lynxie/commands/tinyfox/tinyfox.go

156 lines
2.9 KiB
Go

package tinyfox
import (
"errors"
"flag"
"fmt"
"net/http"
"slices"
"strings"
"time"
"github.com/Fluffy-Bean/lynxie/app"
"github.com/Fluffy-Bean/lynxie/utils"
"github.com/bwmarrin/discordgo"
)
var client = http.Client{
Timeout: 10 * time.Second,
}
var animals = []string{
"fox",
"yeen",
"dog",
"guara",
"serval",
"ott",
"jackal",
"bleat",
"woof",
"chi",
"puma",
"skunk",
"tig",
"wah",
"manul",
"snep",
"jaguar",
"badger",
"chee",
"racc",
"bear",
"capy",
"bun",
"marten",
"caracal",
"snek",
"shiba",
"dook",
"leo",
"yote",
"poss",
"lynx",
}
var animalAliases = map[string]string{
"hyena": "yeen",
"serv": "serval",
"otter": "ott",
"deer": "bleat",
"wolf": "woof",
"tiger": "tig",
"red-panda": "wah",
"panda": "wah",
"manual": "manul",
"palas": "manul",
"palas-cat": "manul",
"snow-leopard": "snep",
"jag": "jaguar",
"cheetah": "chee",
"raccoon": "racc",
"rac": "racc",
"capybara": "capy",
"bunny": "bun",
"carac": "caracal",
"snake": "snek",
"ferret": "dook",
"leopard": "leo",
"coyote": "yote",
"possum": "poss",
"opossum": "poss",
}
func RegisterTinyfoxCommands(a *app.App) {
a.RegisterCommand("animal", registerAnimal(a))
a.RegisterCommandAlias("a", "animal")
}
func registerAnimal(a *app.App) app.Callback {
return func(h *app.Handler, args []string) app.Error {
var options struct {
Kind string
}
cmd := flag.NewFlagSet("", flag.ContinueOnError)
cmd.StringVar(&options.Kind, "kind", "", "Animal kind to search for")
cmd.Parse(args)
if options.Kind == "" {
return app.Error{
Msg: "Animal name is required!",
Err: errors.New("animal name is required"),
}
}
if !slices.Contains(animals, options.Kind) {
alias, ok := animalAliases[options.Kind]
if !ok {
return app.Error{
Msg: fmt.Sprintf("Animal \"%s\" is invalid. The following animals are supported:\n%s", options.Kind, strings.Join(animals, ", ")),
Err: errors.New("entered invalid animal name"),
}
}
options.Kind = alias
}
req, err := http.NewRequest(http.MethodGet, "https://api.tinyfox.dev/img?animal="+options.Kind, nil)
if err != nil {
return app.Error{
Msg: "Failed to make request",
Err: err,
}
}
res, err := client.Do(req)
if err != nil {
return app.Error{
Msg: "Failed to do request",
Err: err,
}
}
defer res.Body.Close()
h.Session.ChannelMessageSendComplex(h.Message.ChannelID, &discordgo.MessageSend{
Embed: &discordgo.MessageEmbed{
Title: "Animal",
Image: &discordgo.MessageEmbedImage{
URL: "attachment://image.png",
},
Color: utils.ColorFromRGB(255, 255, 255),
},
Files: []*discordgo.File{
{
Name: "image.png",
ContentType: "",
Reader: res.Body,
},
},
Reference: h.Reference,
})
return app.Error{}
}
}