From 44fc4e8dd16b25f87cd5e9dea4e8534ff388aa37 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Mon, 21 Oct 2024 23:50:17 -0600 Subject: [PATCH] Moved to discordgo --- command/hs.go | 36 ++++++++------- command/ping.go | 20 ++++----- go.mod | 7 ++- go.sum | 15 ++++++- main.go | 114 +++++++++++++++++++++++++++--------------------- 5 files changed, 111 insertions(+), 81 deletions(-) diff --git a/command/hs.go b/command/hs.go index b1d0705..454411d 100644 --- a/command/hs.go +++ b/command/hs.go @@ -1,26 +1,30 @@ package command import ( - "context" - "himbot/lib" + "fmt" - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/api/cmdroute" - "github.com/diamondburned/arikawa/v3/utils/json/option" + "github.com/bwmarrin/discordgo" ) -func HS(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { - var options struct { - Arg string `discord:"nickname"` +func HsCommand(s *discordgo.Session, i *discordgo.InteractionCreate) { + options := i.ApplicationCommandData().Options + nickname := options[0].StringValue() + + var username string + if i.Member != nil { + username = i.Member.User.Username + } else if i.User != nil { + username = i.User.Username + } else { + username = "User" } - if err := data.Options.Unmarshal(&options); err != nil { - return lib.ErrorResponse(err) - } + response := fmt.Sprintf("%s was %s's nickname in highschool!", nickname, username) - user := lib.GetUserObject(*data.Event) - - return &api.InteractionResponseData{ - Content: option.NewNullableString(options.Arg + " was " + user.DisplayName() + "'s nickname in highschool!"), - } + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: response, + }, + }) } diff --git a/command/ping.go b/command/ping.go index 3a894da..d579492 100644 --- a/command/ping.go +++ b/command/ping.go @@ -1,16 +1,12 @@ package command -import ( - "context" +import "github.com/bwmarrin/discordgo" - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/api/cmdroute" - "github.com/diamondburned/arikawa/v3/utils/json/option" -) - -func Ping(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { - // Command Logic - return &api.InteractionResponseData{ - Content: option.NewNullableString("Pong!"), - } +func PingCommand(s *discordgo.Session, i *discordgo.InteractionCreate) { + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: "Pong!", + }, + }) } diff --git a/go.mod b/go.mod index 207e872..8cb5ec8 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,13 @@ go 1.23.2 require github.com/diamondburned/arikawa/v3 v3.4.0 require ( + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/sys v0.26.0 // indirect +) + +require ( + github.com/bwmarrin/discordgo v0.28.1 github.com/gorilla/schema v1.4.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/joho/godotenv v1.5.1 - golang.org/x/time v0.7.0 // indirect ) diff --git a/go.sum b/go.sum index c4cbe40..6dc781e 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,21 @@ +github.com/bwmarrin/discordgo v0.28.1 h1:gXsuo2GBO7NbR6uqmrrBDplPUx2T3nzu775q/Rd1aG4= +github.com/bwmarrin/discordgo v0.28.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/diamondburned/arikawa/v3 v3.4.0 h1:wI3Qv8h2E2dkeddF1I35nv4T6OQ3RtA21rbghW/fnd0= github.com/diamondburned/arikawa/v3 v3.4.0/go.mod h1:WVkbdenUfsCCkptIlqSglF4eo2/HSXv74eCqGnOZaYY= github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/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/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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/main.go b/main.go index b78c599..b417d00 100644 --- a/main.go +++ b/main.go @@ -1,37 +1,41 @@ package main import ( - "context" "himbot/command" "log" "os" "os/signal" + "syscall" - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/api/cmdroute" - "github.com/diamondburned/arikawa/v3/discord" - "github.com/diamondburned/arikawa/v3/gateway" - "github.com/diamondburned/arikawa/v3/state" + "github.com/bwmarrin/discordgo" "github.com/joho/godotenv" ) -var commands = []api.CreateCommandData{ - { - Name: "ping", - Description: "ping pong!", - }, - { - Name: "hs", - Description: "This command was your nickname in highschool!", - Options: []discord.CommandOption{ - &discord.StringOption{ - OptionName: "nickname", - Description: "Your nickname in highschool.", - Required: true, +var ( + commands = []*discordgo.ApplicationCommand{ + { + Name: "ping", + Description: "ping pong!", + }, + { + Name: "hs", + Description: "This command was your nickname in highschool!", + Options: []*discordgo.ApplicationCommandOption{ + { + Type: discordgo.ApplicationCommandOptionString, + Name: "nickname", + Description: "Your nickname in highschool.", + Required: true, + }, }, }, - }, -} + } + + commandHandlers = map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){ + "ping": command.PingCommand, + "hs": command.HsCommand, + } +) func main() { godotenv.Load(".env") @@ -42,39 +46,49 @@ func main() { log.Fatalln("No $DISCORD_TOKEN given.") } - h := newHandler(state.New("Bot " + token)) - h.s.AddInteractionHandler(h) - h.s.AddIntents(gateway.IntentGuilds) - h.s.AddHandler(func(*gateway.ReadyEvent) { - me, _ := h.s.Me() - log.Println("connected to the gateway as", me.Tag()) - }) - - if err := cmdroute.OverwriteCommands(h.s, commands); err != nil { - log.Fatalln("cannot update commands:", err) + dg, err := discordgo.New("Bot " + token) + if err != nil { + log.Fatalf("Error creating Discord session: %v", err) } - ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) - defer cancel() + dg.AddHandler(ready) + dg.AddHandler(interactionCreate) - if err := h.s.Connect(ctx); err != nil { - log.Fatalln("cannot connect:", err) + dg.Identify.Intents = discordgo.IntentsGuilds + + err = dg.Open() + if err != nil { + log.Fatalf("Error opening connection: %v", err) + } + + log.Println("Bot is now running. Press CTRL-C to exit.") + registerCommands(dg) + + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) + <-sc + + dg.Close() +} + +func ready(s *discordgo.Session, event *discordgo.Ready) { + log.Printf("Logged in as: %v#%v", s.State.User.Username, s.State.User.Discriminator) +} + +func interactionCreate(s *discordgo.Session, i *discordgo.InteractionCreate) { + if h, ok := commandHandlers[i.ApplicationCommandData().Name]; ok { + h(s, i) } } -type handler struct { - *cmdroute.Router - s *state.State -} - -func newHandler(s *state.State) *handler { - h := &handler{s: s} - - h.Router = cmdroute.NewRouter() - // Automatically defer handles if they're slow. - h.Use(cmdroute.Deferrable(s, cmdroute.DeferOpts{})) - h.AddFunc("ping", command.Ping) - h.AddFunc("hs", command.HS) - - return h +func registerCommands(s *discordgo.Session) { + log.Println("Registering commands...") + registeredCommands := make([]*discordgo.ApplicationCommand, len(commands)) + for i, v := range commands { + cmd, err := s.ApplicationCommandCreate(s.State.User.ID, "", v) + if err != nil { + log.Panicf("Cannot create '%v' command: %v", v.Name, err) + } + registeredCommands[i] = cmd + } }