From a3c55c8be88e1f8a734460b3b9664489236ae2c6 Mon Sep 17 00:00:00 2001 From: morrigan Date: Sun, 27 Apr 2025 13:10:44 +0200 Subject: [PATCH] welcome command --- micobot.go | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/micobot.go b/micobot.go index 01309f4..432c181 100644 --- a/micobot.go +++ b/micobot.go @@ -3,33 +3,112 @@ package main import ( "flag" "fmt" + "log" + "os" + "os/signal" + "slices" + "syscall" "github.com/bwmarrin/discordgo" ) // Variables used for command line parameters var ( - Token string + Token string + MemberRole string + GuildID string +) + +// Command vairables +var ( + commands = []*discordgo.ApplicationCommand{ + { + Name: "welcome", + Description: "Welcome a new member to the Server, giving them full membership permission.", + Options: []*discordgo.ApplicationCommandOption{ + { + Name: "user", + Description: "User to welcome as a new member.", + Type: discordgo.ApplicationCommandOptionUser, + Required: true, + }, + }, + }, + } + + commandHandlers = map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){ + "welcome": func(s *discordgo.Session, i *discordgo.InteractionCreate) { + caller, err := s.GuildMember(i.GuildID, i.Member.User.ID) + if err != nil { + fmt.Println("Could not get Guild Member,", err) + } + if !slices.Contains(caller.Roles, MemberRole) { + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: "Only Members are allowed to run this command", + }, + }) + return + } + + options := i.ApplicationCommandData().Options + new := options[0].UserValue(s) + + s.GuildMemberRoleAdd(i.GuildID, new.ID, MemberRole) + + s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Content: fmt.Sprintf("Welcome %s, you are now a member!", new.Mention()), + }, + }) + }, + } ) func init() { flag.StringVar(&Token, "t", "", "Bot Token") + flag.StringVar(&MemberRole, "r", "", "ID of the member role") + flag.StringVar(&GuildID, "g", "", "Id of the Guild") + flag.Parse() } func main() { - dg, err := discordgo.New("Bot " + Token) + bot, err := discordgo.New("Bot " + Token) if err != nil { fmt.Println("Thats not good!") } + bot.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) { + if h, ok := commandHandlers[i.ApplicationCommandData().Name]; ok { + h(s, i) + } + }) + // Open a websocket connection to Discord and begin listening. - err = dg.Open() + err = bot.Open() if err != nil { fmt.Println("error opening connection,", err) return } - dg.Close() + log.Println("Adding commands...") + registeredCommands := make([]*discordgo.ApplicationCommand, len(commands)) + for i, v := range commands { + cmd, err := bot.ApplicationCommandCreate(bot.State.User.ID, GuildID, v) + if err != nil { + log.Panicf("Cannot create '%v' command: %v", v.Name, err) + } + registeredCommands[i] = cmd + } + + fmt.Println("Bot is now running. Press CTRL-C to exit.") + sc := make(chan os.Signal, 1) + signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) + <-sc + + bot.Close() }