Moved to discordgo

This commit is contained in:
Atridad Lahiji 2024-10-21 23:50:17 -06:00
parent e76a886d5b
commit 44fc4e8dd1
Signed by: atridad
SSH key fingerprint: SHA256:LGomp8Opq0jz+7kbwNcdfTcuaLRb5Nh0k5AchDDb438
5 changed files with 111 additions and 81 deletions

View file

@ -1,26 +1,30 @@
package command package command
import ( import (
"context" "fmt"
"himbot/lib"
"github.com/diamondburned/arikawa/v3/api" "github.com/bwmarrin/discordgo"
"github.com/diamondburned/arikawa/v3/api/cmdroute"
"github.com/diamondburned/arikawa/v3/utils/json/option"
) )
func HS(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { func HsCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
var options struct { options := i.ApplicationCommandData().Options
Arg string `discord:"nickname"` 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 { response := fmt.Sprintf("%s was %s's nickname in highschool!", nickname, username)
return lib.ErrorResponse(err)
}
user := lib.GetUserObject(*data.Event) s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
return &api.InteractionResponseData{ Data: &discordgo.InteractionResponseData{
Content: option.NewNullableString(options.Arg + " was " + user.DisplayName() + "'s nickname in highschool!"), Content: response,
} },
})
} }

View file

@ -1,16 +1,12 @@
package command package command
import ( import "github.com/bwmarrin/discordgo"
"context"
"github.com/diamondburned/arikawa/v3/api" func PingCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
"github.com/diamondburned/arikawa/v3/api/cmdroute" s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
"github.com/diamondburned/arikawa/v3/utils/json/option" Type: discordgo.InteractionResponseChannelMessageWithSource,
) Data: &discordgo.InteractionResponseData{
Content: "Pong!",
func Ping(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { },
// Command Logic })
return &api.InteractionResponseData{
Content: option.NewNullableString("Pong!"),
}
} }

7
go.mod
View file

@ -5,8 +5,13 @@ go 1.23.2
require github.com/diamondburned/arikawa/v3 v3.4.0 require github.com/diamondburned/arikawa/v3 v3.4.0
require ( 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/schema v1.4.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect github.com/gorilla/websocket v1.5.3 // indirect
github.com/joho/godotenv v1.5.1 github.com/joho/godotenv v1.5.1
golang.org/x/time v0.7.0 // indirect
) )

15
go.sum
View file

@ -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 h1:wI3Qv8h2E2dkeddF1I35nv4T6OQ3RtA21rbghW/fnd0=
github.com/diamondburned/arikawa/v3 v3.4.0/go.mod h1:WVkbdenUfsCCkptIlqSglF4eo2/HSXv74eCqGnOZaYY= 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 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E=
github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= 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 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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=

114
main.go
View file

@ -1,37 +1,41 @@
package main package main
import ( import (
"context"
"himbot/command" "himbot/command"
"log" "log"
"os" "os"
"os/signal" "os/signal"
"syscall"
"github.com/diamondburned/arikawa/v3/api" "github.com/bwmarrin/discordgo"
"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/joho/godotenv" "github.com/joho/godotenv"
) )
var commands = []api.CreateCommandData{ var (
{ commands = []*discordgo.ApplicationCommand{
Name: "ping", {
Description: "ping pong!", Name: "ping",
}, Description: "ping pong!",
{ },
Name: "hs", {
Description: "This command was your nickname in highschool!", Name: "hs",
Options: []discord.CommandOption{ Description: "This command was your nickname in highschool!",
&discord.StringOption{ Options: []*discordgo.ApplicationCommandOption{
OptionName: "nickname", {
Description: "Your nickname in highschool.", Type: discordgo.ApplicationCommandOptionString,
Required: true, 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() { func main() {
godotenv.Load(".env") godotenv.Load(".env")
@ -42,39 +46,49 @@ func main() {
log.Fatalln("No $DISCORD_TOKEN given.") log.Fatalln("No $DISCORD_TOKEN given.")
} }
h := newHandler(state.New("Bot " + token)) dg, err := discordgo.New("Bot " + token)
h.s.AddInteractionHandler(h) if err != nil {
h.s.AddIntents(gateway.IntentGuilds) log.Fatalf("Error creating Discord session: %v", err)
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)
} }
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) dg.AddHandler(ready)
defer cancel() dg.AddHandler(interactionCreate)
if err := h.s.Connect(ctx); err != nil { dg.Identify.Intents = discordgo.IntentsGuilds
log.Fatalln("cannot connect:", err)
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 { func registerCommands(s *discordgo.Session) {
*cmdroute.Router log.Println("Registering commands...")
s *state.State registeredCommands := make([]*discordgo.ApplicationCommand, len(commands))
} for i, v := range commands {
cmd, err := s.ApplicationCommandCreate(s.State.User.ID, "", v)
func newHandler(s *state.State) *handler { if err != nil {
h := &handler{s: s} log.Panicf("Cannot create '%v' command: %v", v.Name, err)
}
h.Router = cmdroute.NewRouter() registeredCommands[i] = cmd
// 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
} }