diff options
| author | Fuwn <[email protected]> | 2021-07-05 20:39:35 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2021-07-05 20:39:35 -0700 |
| commit | f108736bebae3dee42c0526e6a6d860455c422ae (patch) | |
| tree | 85de064e4a8955797168f05bf8eba5143add6989 | |
| parent | docs(utilities): add stackoverflow link to signal handler (diff) | |
| download | munch-f108736bebae3dee42c0526e6a6d860455c422ae.tar.xz munch-f108736bebae3dee42c0526e6a6d860455c422ae.zip | |
feat(discord): rewrite in discordgo and migrate to application commands
| -rw-r--r-- | config.example.yml | 6 | ||||
| -rw-r--r-- | go.mod | 2 | ||||
| -rw-r--r-- | go.sum | 8 | ||||
| -rw-r--r-- | pkg/discord/bot.go | 24 | ||||
| -rw-r--r-- | pkg/discord/commands.go | 48 | ||||
| -rw-r--r-- | pkg/discord/discord.go | 19 | ||||
| -rw-r--r-- | pkg/discord/handler.go | 18 |
7 files changed, 102 insertions, 23 deletions
diff --git a/config.example.yml b/config.example.yml index c8b2831..dafa248 100644 --- a/config.example.yml +++ b/config.example.yml @@ -12,5 +12,9 @@ worlds: discord: enable: true - token: SoMetOKen22 + + account: + token: SoMetOKen22 + app_id: 861756414082678794 + prefix: m~ @@ -3,6 +3,6 @@ module github.com/Whirlsplash/munch go 1.16 require ( - github.com/diamondburned/arikawa/v2 v2.1.0 + github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 github.com/spf13/viper v1.8.1 ) @@ -45,6 +45,10 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/bwmarrin/discordgo v0.23.2 h1:BzrtTktixGHIu9Tt7dEE6diysEF9HWnXeHuoJEt2fH4= +github.com/bwmarrin/discordgo v0.23.2/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= +github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030 h1:JgAlPJlCqsrUqXcClndnvF6LOjV528hpU/l5YzN++PA= +github.com/bwmarrin/discordgo v0.23.3-0.20210627161652-421e14965030/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -148,6 +152,7 @@ github.com/gorilla/schema v1.1.0 h1:CamqUDOFUBqzrvxuz2vEwo8+SUdwsluFh7IlzJh30LY= github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -266,6 +271,7 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -276,6 +282,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= diff --git a/pkg/discord/bot.go b/pkg/discord/bot.go new file mode 100644 index 0000000..d6cd6ff --- /dev/null +++ b/pkg/discord/bot.go @@ -0,0 +1,24 @@ +package discord + +import ( + "github.com/bwmarrin/discordgo" + "github.com/spf13/viper" + "log" +) + +var s *discordgo.Session + +func SetupBot() { + var err error + s, err = discordgo.New("Bot " + viper.GetString("discord.account.token")) + if err != nil { + log.Fatalln("Unable to start Munch:", err) + } + + SetupHandler() + + if err := s.Open(); err != nil { + log.Fatalln("Unable to connect to Discord gateway:", err) + } + defer s.Close() +} diff --git a/pkg/discord/commands.go b/pkg/discord/commands.go index 3883db6..d306668 100644 --- a/pkg/discord/commands.go +++ b/pkg/discord/commands.go @@ -4,14 +4,50 @@ package discord import ( - "github.com/diamondburned/arikawa/v2/bot" - "github.com/diamondburned/arikawa/v2/gateway" + "github.com/bwmarrin/discordgo" + "log" ) -type Bot struct { - Ctx *bot.Context +var ( + commands = []*discordgo.ApplicationCommand{ + { + Name: "ping", + Description: "Pong!", + }, + } + commandHandlers = map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){ + "ping": func(s *discordgo.Session, i *discordgo.InteractionCreate) { + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: "Pong!", + }, + }) + }, + } +) + +func CleanupCommands() { + cmds, err := s.ApplicationCommands(s.State.User.ID, "") + if err != nil { + log.Panicln("Unable to obtain applications commands:", err) + } + + for _, e := range cmds { + if err := s.ApplicationCommandDelete(s.State.User.ID, "", e.ID); err != nil { + log.Panicf("Cannot delete command '%v': %v", e.Name, err) + } else { + log.Printf("Deleted command '%v'", e.Name) + } + } } -func (bot *Bot) Ping(*gateway.MessageCreateEvent) (string, error) { - return "Pong!", nil +func SetupCommands() { + for _, v := range commands { + if _, err := s.ApplicationCommandCreate(s.State.User.ID, "", v); err != nil { + log.Panicf("Cannot create command '%v': %v", v.Name, err) + } else { + log.Printf("Created command '%v'", v.Name) + } + } } diff --git a/pkg/discord/discord.go b/pkg/discord/discord.go index 27d2498..504ea60 100644 --- a/pkg/discord/discord.go +++ b/pkg/discord/discord.go @@ -3,21 +3,10 @@ package discord -import ( - "github.com/diamondburned/arikawa/v2/bot" - "github.com/spf13/viper" -) - func Do() { - commands := &Bot{} - - bot.Run( - viper.GetString("discord.token"), - commands, - func(ctx *bot.Context) error { - ctx.HasPrefix = bot.NewPrefix(viper.GetString("discord.prefix")) + SetupBot() + CleanupCommands() + SetupCommands() - return nil - }, - ) + select {} } diff --git a/pkg/discord/handler.go b/pkg/discord/handler.go new file mode 100644 index 0000000..f14388e --- /dev/null +++ b/pkg/discord/handler.go @@ -0,0 +1,18 @@ +package discord + +import ( + "github.com/bwmarrin/discordgo" + "log" +) + +func SetupHandler() { + s.AddHandler(func(s *discordgo.Session, r *discordgo.Ready) { + log.Println(r.User.Username, "is live!") + }) + + s.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { + if h, ok := commandHandlers[i.ApplicationCommandData().Name]; ok { + h(s, i) + } + }) +} |