adds funbot
This commit is contained in:
parent
1a8de9b9fd
commit
6111381133
1 changed files with 202 additions and 0 deletions
202
cmd/funbot/main.go
Normal file
202
cmd/funbot/main.go
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"github.com/disgoorg/disgo"
|
||||||
|
"github.com/disgoorg/disgo/bot"
|
||||||
|
"github.com/disgoorg/disgo/cache"
|
||||||
|
"github.com/disgoorg/disgo/discord"
|
||||||
|
"github.com/disgoorg/disgo/events"
|
||||||
|
"github.com/disgoorg/disgo/gateway"
|
||||||
|
"github.com/disgoorg/log"
|
||||||
|
"github.com/disgoorg/snowflake/v2"
|
||||||
|
"io"
|
||||||
|
"math/rand"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
token = os.Getenv("disgo_token")
|
||||||
|
apiImgurKey = os.Getenv("disgo_imgur")
|
||||||
|
registerGuildID = snowflake.GetEnv("disgo_guild_id")
|
||||||
|
|
||||||
|
// TODO: add jokes
|
||||||
|
commands = []discord.ApplicationCommandCreate{
|
||||||
|
discord.SlashCommandCreate{
|
||||||
|
Name: "img",
|
||||||
|
Description: "get a funny or cute image",
|
||||||
|
Options: []discord.ApplicationCommandOption{
|
||||||
|
discord.ApplicationCommandOptionString{
|
||||||
|
Name: "type",
|
||||||
|
Description: "what do you want?",
|
||||||
|
Required: true,
|
||||||
|
Choices: []discord.ApplicationCommandOptionChoiceString{
|
||||||
|
{
|
||||||
|
Name: "facedesk",
|
||||||
|
Value: "imgur-I5Q4U",
|
||||||
|
}, {
|
||||||
|
Name: "hug",
|
||||||
|
Value: "imgur-jHJOc",
|
||||||
|
}, {
|
||||||
|
Name: "pat",
|
||||||
|
Value: "imgur-WiPTl",
|
||||||
|
}, {
|
||||||
|
Name: "roll",
|
||||||
|
Value: "imgur-lrEwS",
|
||||||
|
}, {
|
||||||
|
Name: "wombat",
|
||||||
|
Value: "imgur-mnhzS",
|
||||||
|
}, {
|
||||||
|
Name: "capybara",
|
||||||
|
Value: "imgur-hfL80",
|
||||||
|
}, {
|
||||||
|
Name: "quokka",
|
||||||
|
Value: "imgur-WvjQA",
|
||||||
|
}, {
|
||||||
|
Name: "otter",
|
||||||
|
Value: "imgur-BL2MW",
|
||||||
|
}, {
|
||||||
|
Name: "seal",
|
||||||
|
Value: "imgur-jE3IoCU",
|
||||||
|
}, {
|
||||||
|
Name: "shepherd",
|
||||||
|
Value: "imgur-XSAIPVF",
|
||||||
|
}, {
|
||||||
|
Name: "firework",
|
||||||
|
Value: "imgur-g228Sf1",
|
||||||
|
}, {
|
||||||
|
Name: "marblefox",
|
||||||
|
Value: "imgur-yQlGBLE",
|
||||||
|
}, {
|
||||||
|
Name: "chibird",
|
||||||
|
Value: "imgur-zHsrxFr",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.SetLevel(log.LevelDebug)
|
||||||
|
log.Info("starting funbot...")
|
||||||
|
log.Info("disgo version: ", disgo.Version)
|
||||||
|
|
||||||
|
// permissions:
|
||||||
|
// intent:
|
||||||
|
client, err := disgo.New(token,
|
||||||
|
bot.WithGatewayConfigOpts(
|
||||||
|
gateway.WithIntents(gateway.IntentsNone),
|
||||||
|
),
|
||||||
|
bot.WithCacheConfigOpts(
|
||||||
|
cache.WithCaches(
|
||||||
|
cache.FlagsNone,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
bot.WithEventListenerFunc(commandListener),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("error while building disgo instance: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer client.Close(context.TODO())
|
||||||
|
|
||||||
|
if _, err = client.Rest().SetGuildCommands(client.ApplicationID(), registerGuildID, commands); err != nil {
|
||||||
|
log.Fatal("error while registering commands: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = client.OpenGateway(context.TODO()); err != nil {
|
||||||
|
log.Fatal("error while connecting to gateway: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("funbot is now running. Press CTRL-C to exit.")
|
||||||
|
s := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(s, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
|
||||||
|
<-s
|
||||||
|
}
|
||||||
|
|
||||||
|
func commandListener(event *events.ApplicationCommandInteractionCreate) {
|
||||||
|
data := event.SlashCommandInteractionData()
|
||||||
|
if data.CommandName() == "img" {
|
||||||
|
commandHandlerImg(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func commandHandlerImg(event *events.ApplicationCommandInteractionCreate) {
|
||||||
|
data := event.SlashCommandInteractionData()
|
||||||
|
value := data.String("type")
|
||||||
|
|
||||||
|
link, err := func(value string) (string, error) {
|
||||||
|
switch {
|
||||||
|
case strings.HasPrefix(value, "imgur-"):
|
||||||
|
link, err := getRandomImgur(strings.TrimPrefix(value, "imgur-"))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return link, nil
|
||||||
|
default:
|
||||||
|
return "", errors.New("value not found")
|
||||||
|
}
|
||||||
|
}(value)
|
||||||
|
if err != nil {
|
||||||
|
event.Client().Logger().Error("error on getting link: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = event.CreateMessage(discord.NewMessageCreateBuilder().
|
||||||
|
SetContent(link).
|
||||||
|
SetEphemeral(false).Build())
|
||||||
|
if err != nil {
|
||||||
|
event.Client().Logger().Error("error on sending response: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type imgurApiBody struct {
|
||||||
|
Data []struct {
|
||||||
|
Link string `json:"link"`
|
||||||
|
} `json:"data"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func getRandomImgur(album string) (string, error) {
|
||||||
|
apiUrl := fmt.Sprintf("https://api.imgur.com/3/album/%v/images", album)
|
||||||
|
|
||||||
|
client := &http.Client{}
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", apiUrl, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
req.Header.Set("User-Agent", "https://sst.place")
|
||||||
|
req.Header.Set("Authorization", apiImgurKey)
|
||||||
|
res, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
body, err := io.ReadAll(res.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var data imgurApiBody
|
||||||
|
err = json.Unmarshal(body, &data)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
randomIndex := rand.Intn(len(data.Data))
|
||||||
|
link := data.Data[randomIndex].Link
|
||||||
|
|
||||||
|
return link, nil
|
||||||
|
}
|
Loading…
Reference in a new issue