diff --git a/.env.example b/.env.example index 7708d78..535dd2a 100644 --- a/.env.example +++ b/.env.example @@ -1 +1 @@ -BOT_TOKEN = "" \ No newline at end of file +BOT_TOKEN="" \ No newline at end of file diff --git a/go.mod b/go.mod index 12bd34b..8e69be0 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,12 @@ module github.com/vaporvee/tag-bot go 1.21.6 require ( - github.com/bwmarrin/discordgo v0.27.1 // indirect + github.com/bwmarrin/discordgo v0.27.1 + github.com/joho/godotenv v1.5.1 +) + +require ( github.com/gorilla/websocket v1.4.2 // indirect - github.com/joho/godotenv v1.5.1 // indirect golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect ) diff --git a/main.go b/main.go index b63532e..5925b43 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "log" "os" "os/signal" "syscall" @@ -12,29 +11,113 @@ import ( ) func main() { - err := godotenv.Load() - if err != nil { - log.Fatal("Error loading .env file: ", err) - } + godotenv.Load() discord, err := discordgo.New("Bot " + os.Getenv("BOT_TOKEN")) - log.Println(err) + if err != nil { + fmt.Println("error creating Discord session,", err) + return + } else { + fmt.Println("Discord session created") + } discord.Identify.Intents = discordgo.IntentsGuildMessages | discordgo.IntentsGuilds - discord.AddHandler(messageCreate) + defer removeCommandFromAllGuilds(discord) + discord.AddHandler(ready) + discord.AddHandler(interactionCreate) - fmt.Println("Bot is now running. Press CTRL-C to exit.") + err = discord.Open() + if err != nil { + fmt.Println("error opening connection,", err) + return + } + fmt.Printf("Bot is now running as \"%s\"!", discord.State.User.Username) sc := make(chan os.Signal, 1) - signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) <-sc + fmt.Println("\nShutting down...") + defer removeCommandFromAllGuilds(discord) discord.Close() } -func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { - if m.Author.ID == s.State.User.ID { //bot doesn't take its own messages - return +func ready(s *discordgo.Session, event *discordgo.Ready) { + commands := []*discordgo.ApplicationCommand{ + { + Name: "test", + Description: "A test command.", + }, + { + Name: "secondtest", + Description: "A second test command.", + Options: []*discordgo.ApplicationCommandOption{ + { + Type: discordgo.ApplicationCommandOptionString, + Name: "query", + Description: "The query to search for.", + Required: true, + }, + }, + }, } - if m.Message.Content == "test" { - s.ChannelMessageSendEmbed(m.ChannelID, &discordgo.MessageEmbed{ - Title: "TESTED WOOOWW", - }) + + for _, guild := range event.Guilds { + _, err := s.ApplicationCommandCreate(s.State.User.ID, guild.ID, commands[0]) + if err != nil { + fmt.Println("error creating command,", err) + continue // Continue to the next guild + } + + _, err = s.ApplicationCommandCreate(s.State.User.ID, guild.ID, commands[1]) + if err != nil { + fmt.Println("error creating command,", err) + continue // Continue to the next guild + } + } +} + +func interactionCreate(s *discordgo.Session, i *discordgo.InteractionCreate) { + if i.Type == discordgo.InteractionApplicationCommand { + if i.ApplicationCommandData().Name == "test" { + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: "You tested me!", + }, + }) + } + if i.ApplicationCommandData().Name == "secondtest" { + // Check if the command has options + if len(i.ApplicationCommandData().Options) > 0 { + // Loop through the options and handle them + for _, option := range i.ApplicationCommandData().Options { + switch option.Name { + case "query": + value := option.Value.(string) + response := fmt.Sprintf("You provided the query: %s", value) + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: response, + }, + }) + } + } + } + } + } +} + +func removeCommandFromAllGuilds(s *discordgo.Session) { + for _, guild := range s.State.Guilds { + existingCommands, err := s.ApplicationCommands(s.State.User.ID, guild.ID) + if err != nil { + fmt.Printf("error fetching existing commands for guild %s: %v\n", guild.Name, err) + continue + } + + for _, existingCommand := range existingCommands { + err := s.ApplicationCommandDelete(s.State.User.ID, guild.ID, existingCommand.ID) + if err != nil { + fmt.Printf("error deleting command %s for guild %s: %v\n", existingCommand.Name, guild.Name, err) + } + } } }