mirror of
https://github.com/diamondburned/arikawa.git
synced 2024-12-03 12:23:02 +00:00
331ec59dec
This commit gets rid of contain-it-all structs and instead opt for interface union types containing underlying concrete types with no overloading. The code is much more verbose by doing this, but the API is much nicer to use. The only disadvantage in that regard is the interface assertion being too verbose and risky for users at times.
93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/diamondburned/arikawa/v3/api"
|
|
"github.com/diamondburned/arikawa/v3/discord"
|
|
"github.com/diamondburned/arikawa/v3/gateway"
|
|
"github.com/diamondburned/arikawa/v3/state"
|
|
"github.com/diamondburned/arikawa/v3/utils/json/option"
|
|
)
|
|
|
|
// To run, do `GUILD_ID="GUILD ID" BOT_TOKEN="TOKEN HERE" go run .`
|
|
|
|
func main() {
|
|
guildID := discord.GuildID(mustSnowflakeEnv("GUILD_ID"))
|
|
|
|
token := os.Getenv("BOT_TOKEN")
|
|
if token == "" {
|
|
log.Fatalln("No $BOT_TOKEN given.")
|
|
}
|
|
|
|
s, err := state.New("Bot " + token)
|
|
if err != nil {
|
|
log.Fatalln("Session failed:", err)
|
|
return
|
|
}
|
|
|
|
app, err := s.CurrentApplication()
|
|
if err != nil {
|
|
log.Fatalln("Failed to get application ID:", err)
|
|
}
|
|
|
|
s.AddHandler(func(e *gateway.InteractionCreateEvent) {
|
|
data := api.InteractionResponse{
|
|
Type: api.MessageInteractionWithSource,
|
|
Data: &api.InteractionResponseData{
|
|
Content: option.NewNullableString("Pong!"),
|
|
},
|
|
}
|
|
|
|
if err := s.RespondInteraction(e.ID, e.Token, data); err != nil {
|
|
log.Println("failed to send interaction callback:", err)
|
|
}
|
|
})
|
|
|
|
s.AddIntents(gateway.IntentGuilds)
|
|
s.AddIntents(gateway.IntentGuildMessages)
|
|
|
|
if err := s.Open(context.Background()); err != nil {
|
|
log.Fatalln("failed to open:", err)
|
|
}
|
|
defer s.Close()
|
|
|
|
log.Println("Gateway connected. Getting all guild commands.")
|
|
|
|
commands, err := s.GuildCommands(app.ID, guildID)
|
|
if err != nil {
|
|
log.Fatalln("failed to get guild commands:", err)
|
|
}
|
|
|
|
for _, command := range commands {
|
|
log.Println("Existing command", command.Name, "found.")
|
|
}
|
|
|
|
newCommands := []api.CreateCommandData{
|
|
{
|
|
Name: "ping",
|
|
Description: "Basic ping command.",
|
|
},
|
|
}
|
|
|
|
for _, command := range newCommands {
|
|
_, err := s.CreateGuildCommand(app.ID, guildID, command)
|
|
if err != nil {
|
|
log.Fatalln("failed to create guild command:", err)
|
|
}
|
|
}
|
|
|
|
// Block forever.
|
|
select {}
|
|
}
|
|
|
|
func mustSnowflakeEnv(env string) discord.Snowflake {
|
|
s, err := discord.ParseSnowflake(os.Getenv(env))
|
|
if err != nil {
|
|
log.Fatalf("Invalid snowflake for $%s: %v", env, err)
|
|
}
|
|
return s
|
|
}
|