diff --git a/cmd_autojoinroles.go b/cmd_autojoinroles.go index 56e8a14..8331a14 100644 --- a/cmd_autojoinroles.go +++ b/cmd_autojoinroles.go @@ -34,13 +34,18 @@ var autojoinroles_command Command = Command{ }, }, Interact: func(s *discordgo.Session, i *discordgo.InteractionCreate) { + var role string option := i.ApplicationCommandData().Options[0].Name - role := i.ApplicationCommandData().Options[0].Options[0].RoleValue(s, i.GuildID).ID var content string - if setAutoJoinRole(i.GuildID, option, role) { - content = "Setup auto join role for " + option + "s as <@&" + role + ">" - } else { - content = "Updated auto join role for " + option + "s as <@&" + role + ">" + if len(i.ApplicationCommandData().Options[0].Options) == 1 { + role = i.ApplicationCommandData().Options[0].Options[0].RoleValue(s, i.GuildID).ID + if setAutoJoinRole(i.GuildID, option, role) { + content = "Updated auto join role for " + option + "s as <@&" + role + ">" + } else { + content = "Setup auto join role for " + option + "s as <@&" + role + ">" + } + } else if setAutoJoinRole(i.GuildID, option, role) { + content = "Deleted auto join role for " + option + "s" } s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, @@ -49,6 +54,6 @@ var autojoinroles_command Command = Command{ Flags: discordgo.MessageFlagsEphemeral, }, }) - + purgeUnusedAutoJoinRoles(i.GuildID) }, } diff --git a/handle_messages.go b/handle_messages.go deleted file mode 100644 index cc2bbcd..0000000 --- a/handle_messages.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "github.com/bwmarrin/discordgo" -) - -func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { - if len(m.Embeds) == 0 || m.Embeds[0].Footer == nil || m.Embeds[0].Footer.Text != "📌 Sticky message" { - if hasSticky(m.GuildID, m.ChannelID) { - s.ChannelMessageDelete(m.ChannelID, getStickyMessageID(m.GuildID, m.ChannelID)) - stickyMessage, _ := s.ChannelMessageSendEmbed(m.ChannelID, &discordgo.MessageEmbed{ - Type: discordgo.EmbedTypeArticle, - Footer: &discordgo.MessageEmbedFooter{ - Text: "📌 Sticky message", - }, - Color: hexToDecimal(color["primary"]), - Description: getStickyMessageContent(m.GuildID, m.ChannelID), - }) - updateStickyMessageID(m.GuildID, m.ChannelID, stickyMessage.ID) - } - } -} diff --git a/register_commands.go b/handlers.go similarity index 80% rename from register_commands.go rename to handlers.go index a4d3e41..e49945b 100644 --- a/register_commands.go +++ b/handlers.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" "os" "slices" "strings" @@ -106,3 +107,27 @@ func removeOldCommandFromAllGuilds(s *discordgo.Session) { } } } + +func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { + if len(m.Embeds) == 0 || m.Embeds[0].Footer == nil || m.Embeds[0].Footer.Text != "📌 Sticky message" { + if hasSticky(m.GuildID, m.ChannelID) { + s.ChannelMessageDelete(m.ChannelID, getStickyMessageID(m.GuildID, m.ChannelID)) + stickyMessage, _ := s.ChannelMessageSendEmbed(m.ChannelID, &discordgo.MessageEmbed{ + Type: discordgo.EmbedTypeArticle, + Footer: &discordgo.MessageEmbedFooter{ + Text: "📌 Sticky message", + }, + Color: hexToDecimal(color["primary"]), + Description: getStickyMessageContent(m.GuildID, m.ChannelID), + }) + updateStickyMessageID(m.GuildID, m.ChannelID, stickyMessage.ID) + } + } +} + +func guildMemberJoin(s *discordgo.Session, m *discordgo.GuildMemberAdd) { + err := s.GuildMemberRoleAdd(m.GuildID, m.User.ID, getAutoJoinRole(m.GuildID, m.User.Bot)) + if err != nil { + log.Println(err) + } +} diff --git a/main.go b/main.go index 3762847..48d9584 100644 --- a/main.go +++ b/main.go @@ -38,10 +38,11 @@ func main() { } else { fmt.Println("Discord session created") } - discord.Identify.Intents = discordgo.IntentsGuildMessages | discordgo.IntentsGuilds | discordgo.IntentMessageContent + discord.Identify.Intents = discordgo.IntentsGuildMessages | discordgo.IntentsGuilds | discordgo.IntentMessageContent | discordgo.IntentGuildMembers discord.AddHandler(ready) discord.AddHandler(interactionCreate) discord.AddHandler(messageCreate) + discord.AddHandler(guildMemberJoin) err = discord.Open() if err != nil { fmt.Println("error opening connection,", err) diff --git a/manage_data.go b/manage_data.go index e9049d8..e20401c 100644 --- a/manage_data.go +++ b/manage_data.go @@ -237,12 +237,17 @@ func getFormType(formManageID string) string { } func setAutoJoinRole(guildID string, option string, roleID string) bool { - var exists bool - err := db.QueryRow("SELECT EXISTS (SELECT 1 FROM autojoinroles WHERE guild_id = $1)", guildID).Scan(&exists) + var role_exists bool + var autojoinroles_exists bool + err := db.QueryRow("SELECT EXISTS (SELECT 1 FROM autojoinroles WHERE guild_id = $1)", guildID).Scan(&autojoinroles_exists) if err != nil { log.Println(err) } - if exists { + err = db.QueryRow("SELECT EXISTS (SELECT 1 FROM autojoinroles WHERE guild_id = $1 AND "+option+"_role IS NOT NULL AND "+option+"_role != '')", guildID).Scan(&role_exists) + if err != nil { + log.Println(err) + } + if autojoinroles_exists { _, err = db.Exec("UPDATE autojoinroles SET "+option+"_role = $1 WHERE guild_id = $2", roleID, guildID) if err != nil { log.Println(err) @@ -253,5 +258,27 @@ func setAutoJoinRole(guildID string, option string, roleID string) bool { log.Println(err) } } - return exists + return role_exists +} + +func purgeUnusedAutoJoinRoles(guildID string) { + _, err := db.Exec("DELETE FROM autojoinroles WHERE guild_id = $1 AND user_role = '' OR user_role IS NULL AND bot_role = '' OR bot_role IS NULL", guildID) + if err != nil { + log.Println(err) + } +} + +func getAutoJoinRole(guildID string, isBot bool) string { + var isBotString string + var role string + if isBot { + isBotString = "bot" + } else { + isBotString = "user" + } + err := db.QueryRow("SELECT "+isBotString+"_role FROM autojoinroles WHERE guild_id = $1", guildID).Scan(&role) + if err != nil { + log.Println(err, guildID) + } + return role }