You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
3.9 KiB
Go

package main
import (
"fmt"
"log"
"github.com/bwmarrin/discordgo"
)
type RoleReaction struct {
RoleName string
RoleId string
EmojiName string
EmojiId string
}
type ServerRoleAssignConfig struct {
GuildId string
RoleReactionMap map[string]RoleReaction
Message *discordgo.Message
}
type ServerConfigOptionFunction func(s *discordgo.Session) ServerRoleAssignConfig
func InitRoleReactions(s *discordgo.Session) {
addHubbubRoleHandlers(s)
addHubbubPronounHandlers(s)
}
func addHubbubRoleHandlers(s *discordgo.Session) {
hubbubId := "827958531659530301"
roleAssignChannelId := "855923187354959872"
roleMap := map[string]RoleReaction{
"🤓": {
RoleName: "Streamer",
RoleId: "827959638267002880",
EmojiName: "nerd",
EmojiId: "🤓",
},
"😎": {
RoleName: "Viewer",
RoleId: "857793953125629992",
EmojiName: "sunglasses",
EmojiId: "😎",
},
}
serverConfig := getServerConfig(
s,
hubbubId,
roleAssignChannelId,
"React to this message to get a role!",
roleMap,
)
s.AddHandler(roleAddHandler(serverConfig))
s.AddHandler(roleRemoveHandler(serverConfig))
}
func addHubbubPronounHandlers(s *discordgo.Session) {
hubbubId := "827958531659530301"
roleAssignChannelId := "932432742547869726"
roleMap := map[string]RoleReaction{
"🇭": {
RoleName: "He/Him",
RoleId: "932433573292699699",
EmojiName: "regional_indicator_h",
EmojiId: "🇭",
},
"🇫": {
RoleName: "She/Her",
RoleId: "932433721750081587",
EmojiName: "regional_indicator_f",
EmojiId: "🇫",
},
"🇹": {
RoleName: "They/Them",
RoleId: "932433758290853908",
EmojiName: "regional_indicator_t",
EmojiId: "🇹",
},
}
serverConfig := getServerConfig(
s,
hubbubId,
roleAssignChannelId,
"React to this message to assign pronouns! You are allowed to select multiple.",
roleMap,
)
s.AddHandler(roleAddHandler(serverConfig))
s.AddHandler(roleRemoveHandler(serverConfig))
}
func getServerConfig(
s *discordgo.Session,
guildId string,
roleAssignChannelId string,
roleAssignMessage string,
roleMap map[string]RoleReaction,
) ServerRoleAssignConfig {
serverConfig := ServerRoleAssignConfig{
GuildId: guildId,
RoleReactionMap: roleMap,
}
messages, err := s.ChannelMessages(roleAssignChannelId, 1, "", "", "")
if err != nil {
log.Fatal(err)
}
if len(messages) == 0 {
content := fmt.Sprintf("%s\n", roleAssignMessage)
for emote, role := range roleMap {
content += fmt.Sprintf("%s : %s\n", emote, role.RoleName)
}
message, err := s.ChannelMessageSend(roleAssignChannelId, content)
if err != nil {
log.Fatal(err)
}
for _, role := range roleMap {
err := s.MessageReactionAdd(roleAssignChannelId, message.ID, role.EmojiId)
if err != nil {
log.Fatal(err)
}
}
serverConfig.Message = message
} else {
serverConfig.Message = messages[0]
}
return serverConfig
}
func roleAddHandler(
serverConfig ServerRoleAssignConfig,
) func(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
return func(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
if r.MessageID != serverConfig.Message.ID {
return
}
if role, ok := serverConfig.RoleReactionMap[r.Emoji.Name]; ok {
err := s.GuildMemberRoleAdd(serverConfig.GuildId, r.UserID, role.RoleId)
if err != nil {
log.Println(err)
}
}
}
}
func roleRemoveHandler(
serverConfig ServerRoleAssignConfig,
) func(s *discordgo.Session, r *discordgo.MessageReactionRemove) {
return func(s *discordgo.Session, r *discordgo.MessageReactionRemove) {
if r.MessageID != serverConfig.Message.ID {
return
}
if role, ok := serverConfig.RoleReactionMap[r.Emoji.Name]; ok {
err := s.GuildMemberRoleRemove(serverConfig.GuildId, r.UserID, role.RoleId)
if err != nil {
log.Println(err)
}
}
}
}