diff --git a/examples/your_first_go_bot/go.mod b/examples/your_first_go_bot/go.mod new file mode 100644 index 0000000..ed25cff --- /dev/null +++ b/examples/your_first_go_bot/go.mod @@ -0,0 +1,11 @@ +module gitlab.com/grom-gleam/grom/examples/your_first_go_bot + +go 1.25.4 + +require ( + github.com/bwmarrin/discordgo v0.29.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/joho/godotenv v1.5.1 // indirect + golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect + golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect +) diff --git a/examples/your_first_go_bot/go.sum b/examples/your_first_go_bot/go.sum new file mode 100644 index 0000000..04715b6 --- /dev/null +++ b/examples/your_first_go_bot/go.sum @@ -0,0 +1,14 @@ +github.com/bwmarrin/discordgo v0.29.0 h1:FmWeXFaKUwrcL3Cx65c20bTRW+vOb6k8AnaP+EgjDno= +github.com/bwmarrin/discordgo v0.29.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/examples/your_first_go_bot/main.go b/examples/your_first_go_bot/main.go new file mode 100644 index 0000000..ab6d3dd --- /dev/null +++ b/examples/your_first_go_bot/main.go @@ -0,0 +1,89 @@ +package main + +import ( + "fmt" + "log/slog" + "os" + "os/signal" + + "github.com/bwmarrin/discordgo" + "github.com/joho/godotenv" +) + +func main() { + godotenv.Load() + token := os.Getenv("BOT_TOKEN") + + discord, err := discordgo.New("Bot " + token) + if err != nil { + slog.Error("couldn't create the discord session", "err", err) + os.Exit(1) + } + + discord.AddHandler(onReady) + discord.AddHandler(onInteractionCreate) + + err = discord.Open() + if err != nil { + slog.Error("couldn't start the gateway", "err", err) + os.Exit(1) + } + defer discord.Close() + + signalInterrupt := make(chan os.Signal, 1) + signal.Notify(signalInterrupt, os.Interrupt) + <-signalInterrupt +} + +func onReady(discord *discordgo.Session, ready *discordgo.Ready) { + slog.Info("Ready!") + + commands := []*discordgo.ApplicationCommand{ + { + Name: "ping", + Description: "Ping-pong! 🏓", + }, + } + + _, err := discord.ApplicationCommandBulkOverwrite(ready.Application.ID, "", commands) + if err == nil { + slog.Info(fmt.Sprintf("Overwrote the commands for %s", ready.Application.ID)) + } else { + slog.Error("Couldn't bulk overwrite global commands", "err", err) + } + + err = discord.UpdateWatchStatus(0, "the gateway connection") + if err != nil { + slog.Error("Couldn't update the status", "err", err) + } +} + +func onInteractionCreate(discord *discordgo.Session, interactionCreate *discordgo.InteractionCreate) { + if interactionCreate.Type == discordgo.InteractionApplicationCommand { + onCommandExecute(discord, interactionCreate) + } +} + +func onCommandExecute(discord *discordgo.Session, interactionCreate *discordgo.InteractionCreate) { + if interactionCreate.ApplicationCommandData().CommandType == discordgo.ChatApplicationCommand { + onSlashCommandExecute(discord, interactionCreate) + } +} + +func onSlashCommandExecute(discord *discordgo.Session, interactionCreate *discordgo.InteractionCreate) { + switch interactionCreate.ApplicationCommandData().Name { + case "ping": + onPingCommand(discord, interactionCreate) + } +} + +func onPingCommand(discord *discordgo.Session, interactionCreate *discordgo.InteractionCreate) { + response := &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: "Pong!", + }, + } + + discord.InteractionRespond(interactionCreate.Interaction, response) +}