package main import ( "flag" "fmt" "log" "os" "os/signal" "slices" "syscall" "github.com/bwmarrin/discordgo" ) // Variables used for command line parameters var ( 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() { 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 = bot.Open() if err != nil { fmt.Println("error opening connection,", err) return } 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() }