138 lines
2.7 KiB
Go
138 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
|
|
"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/hhhapz/doc"
|
|
"github.com/hhhapz/doc/godocs"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type botState struct {
|
|
appID discord.AppID
|
|
searcher *doc.CachedSearcher
|
|
state *state.State
|
|
}
|
|
|
|
func (b *botState) OnCommand(e *gateway.InteractionCreateEvent) {
|
|
if e.GuildID != 0 {
|
|
e.User = &e.Member.User
|
|
}
|
|
|
|
switch e.Data.Name {
|
|
case "docs":
|
|
b.handleDocs(e)
|
|
case "info":
|
|
b.handleInfo(e)
|
|
}
|
|
|
|
if data, ok := interactionMap[e.Data.CustomID]; ok {
|
|
b.onDocsComponent(e, data)
|
|
return
|
|
}
|
|
}
|
|
|
|
var update bool
|
|
|
|
func main() {
|
|
updateVar := flag.Bool("update", false, "update all commands, regardless of if they are present or not")
|
|
flag.Parse()
|
|
update = *updateVar
|
|
|
|
cfg := config()
|
|
if cfg.Token == "" {
|
|
log.Fatal("no token provided")
|
|
}
|
|
|
|
s, err := state.New("Bot " + cfg.Token)
|
|
if err != nil {
|
|
log.Fatalln(errors.Wrap(err, "could not open session"))
|
|
}
|
|
|
|
searcher := doc.New(http.DefaultClient, godocs.Parser)
|
|
cs := doc.WithCache(searcher)
|
|
b := botState{
|
|
searcher: cs,
|
|
state: s,
|
|
}
|
|
s.AddHandler(b.OnCommand)
|
|
s.AddIntents(gateway.IntentGuildMessageReactions)
|
|
|
|
if err := s.Open(context.Background()); err != nil {
|
|
log.Fatalln("failed to open:", err)
|
|
}
|
|
defer s.Close()
|
|
|
|
log.Println("Gateway connection established.")
|
|
me, err := s.Me()
|
|
if err != nil {
|
|
log.Println("Could not get me:", err)
|
|
return
|
|
}
|
|
b.appID = discord.AppID(me.ID)
|
|
|
|
log.Println("Logged in as ", me.Tag())
|
|
|
|
if err := loadCommands(s, me.ID); err != nil {
|
|
log.Println("Could not load commands:", err)
|
|
return
|
|
}
|
|
|
|
go gcInteractionData()
|
|
select {}
|
|
}
|
|
|
|
func loadCommands(s *state.State, me discord.UserID) error {
|
|
appID := discord.AppID(me)
|
|
registered, err := s.Commands(appID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
registeredMap := map[string]bool{}
|
|
if !update {
|
|
for _, c := range registered {
|
|
registeredMap[c.Name] = true
|
|
log.Println("Registered command:", c.Name)
|
|
}
|
|
}
|
|
|
|
for _, c := range commands {
|
|
if registeredMap[c.Name] {
|
|
continue
|
|
}
|
|
if _, err := s.CreateCommand(appID, c); err != nil {
|
|
return errors.Wrap(err, "could not register "+c.Name)
|
|
}
|
|
log.Println("Created command:", c.Name)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
var commands = []api.CreateCommandData{
|
|
{
|
|
Name: "docs",
|
|
Description: "Base command",
|
|
Options: []discord.CommandOption{
|
|
{
|
|
Name: "query",
|
|
Description: "Search query",
|
|
Type: discord.StringOption,
|
|
Required: true,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
Name: "info",
|
|
Description: "Generic bot information",
|
|
},
|
|
}
|