Features: Add Custom Joinable/Leavable Roles

master
Marc Egerton 2020-09-18 12:32:19 +01:00
parent 10a29a6afc
commit fc19d1fe3f
No known key found for this signature in database
GPG Key ID: A11F9CA36DF845E0
8 changed files with 189 additions and 2 deletions

View File

@ -23,6 +23,10 @@
{ "color": "pink", "id": "697965484313935966" } { "color": "pink", "id": "697965484313935966" }
], ],
"custom_roles": [
{ "name": "WiFi Pineapple Beta", "short_name": "pineapple", "id": "756469985030832158" }
],
"ignored_users": [], "ignored_users": [],
"logging_channel": "714369335254188053" "logging_channel": "714369335254188053"

View File

@ -3,7 +3,10 @@ package features
import ( import (
"errors" "errors"
discordgo "github.com/bwmarrin/discord.go" discordgo "github.com/bwmarrin/discord.go"
"log"
"os"
"strings" "strings"
"time"
) )
func (f *Features) handleSetStatus(s *discordgo.Session, m *discordgo.MessageCreate) error { func (f *Features) handleSetStatus(s *discordgo.Session, m *discordgo.MessageCreate) error {
@ -31,3 +34,50 @@ func (f *Features) handleSetStatus(s *discordgo.Session, m *discordgo.MessageCre
return nil return nil
} }
func (f *Features) handleDisconnect(s *discordgo.Session, m *discordgo.MessageCreate) error {
if !f.Permissions.CheckAdminRole(m.Member) {
return errors.New("I'm sorry Dave, I'm afraid I can't do that.")
}
msg := f.CreateDefinedEmbed("Disconnect", "Attempting Disconnect...", "", m.Author)
_, err := s.ChannelMessageSendEmbed(m.ChannelID, msg)
if err != nil {
return err
}
err = s.Close()
if err != nil {
return err
}
os.Exit(0)
return nil
}
func (f *Features) handleReconnect(s *discordgo.Session, m *discordgo.MessageCreate) error {
if !f.Permissions.CheckAdminRole(m.Member) {
return errors.New("You do not have permissions to use that command.")
}
t := time.Now()
err := s.Close()
if err != nil {
return err
}
err = s.Open()
if err != nil {
log.Fatal(err)
}
msg := f.CreateDefinedEmbed("Reconnect", "Reconnected Successfully.\nTime: `"+time.Since(t).String()+"`.", "success", m.Author)
_, err = s.ChannelMessageSendEmbed(m.ChannelID, msg)
if err != nil {
return err
}
return nil
}

116
features/customroles.go Normal file
View File

@ -0,0 +1,116 @@
package features
import (
discordgo "github.com/bwmarrin/discord.go"
"strings"
)
func (f *Features) handleListCustomRoles(s *discordgo.Session, m *discordgo.MessageCreate) error {
msgC := "You can choose from the following roles:\n\n"
for _, v := range f.Config.CustomRoles {
msgC += "<@&" + v.ID + "> (" + v.ShortName + ")\n"
}
msgC += "\n\n Use `" + f.Config.CommandKey + "joinrole <role_name>` to join a role.\n"
msgC += "Example: `" + f.Config.CommandKey + "joinrole pineapple`.\n"
msg := f.CreateDefinedEmbed("Joinable Roles", msgC, "", m.Author)
_, err := s.ChannelMessageSendEmbed(m.ChannelID, msg)
if err != nil {
return err
}
return nil
}
func (f *Features) handleJoinCustomRole(s *discordgo.Session, m *discordgo.MessageCreate) error {
var err error
rUserID := m.Author.ID
userInput := strings.Split(m.Content, " ")
if len(userInput) < 2 {
err = f.handleListCustomRoles(s, m)
return err
}
desiredRole := userInput[1]
desiredRole = strings.ToLower(desiredRole)
desiredRoleID := ""
for _, role := range f.Config.CustomRoles {
if role.ShortName == desiredRole {
desiredRoleID = role.ID
break
}
}
if len(desiredRoleID) == 0 {
err = f.handleListCustomRoles(s, m)
return err
}
err = s.GuildMemberRoleAdd(m.GuildID, rUserID, desiredRoleID)
if err != nil {
return err
} else {
msg := f.CreateDefinedEmbed("Join Role", "<@"+m.Author.ID+">: You have joined <@&"+desiredRoleID+">!", "success", m.Author)
_, err = s.ChannelMessageSendEmbed(m.ChannelID, msg)
if err != nil {
return err
}
}
err = s.ChannelMessageDelete(m.ChannelID, m.ID)
if err != nil {
return err
}
return nil
}
func (f *Features) handleLeaveCustomRole(s *discordgo.Session, m *discordgo.MessageCreate) error {
var err error
rUserID := m.Author.ID
userInput := strings.Split(m.Content, " ")
if len(userInput) < 2 {
err = f.handleListCustomRoles(s, m)
return err
}
desiredRole := userInput[1]
desiredRole = strings.ToLower(desiredRole)
desiredRoleID := ""
for _, role := range f.Config.CustomRoles {
if role.ShortName == desiredRole {
desiredRoleID = role.ID
break
}
}
if len(desiredRoleID) == 0 {
err = f.handleListCustomRoles(s, m)
return err
}
err = s.GuildMemberRoleRemove(m.GuildID, rUserID, desiredRoleID)
if err != nil {
return err
} else {
msg := f.CreateDefinedEmbed("Leave Role", "<@"+m.Author.ID+">: You have left <@&"+desiredRoleID+">!", "success", m.Author)
_, err = s.ChannelMessageSendEmbed(m.ChannelID, msg)
if err != nil {
return err
}
}
err = s.ChannelMessageDelete(m.ChannelID, m.ID)
if err != nil {
return err
}
return nil
}

View File

@ -29,6 +29,9 @@ func (f *Features) RegisterHandlers() {
// User Settings // User Settings
f.RegisterCommand("colors", f.handleUserColors) f.RegisterCommand("colors", f.handleUserColors)
f.RegisterCommand("color", f.handleUserColor) f.RegisterCommand("color", f.handleUserColor)
f.RegisterCommand("listroles", f.handleListCustomRoles)
f.RegisterCommand("joinrole", f.handleJoinCustomRole)
f.RegisterCommand("leaverole", f.handleLeaveCustomRole)
// Conversion Helpers // Conversion Helpers
f.RegisterCommand("ctof", f.handleCtoF) f.RegisterCommand("ctof", f.handleCtoF)

View File

@ -51,12 +51,15 @@ func (f *Features) CreateDefinedEmbed(title string, desc string, status string,
} }
func (f *Features) CreateCustomEmbed(embedData *models.CustomEmbed) *discordgo.MessageEmbed { func (f *Features) CreateCustomEmbed(embedData *models.CustomEmbed) *discordgo.MessageEmbed {
var typ discordgo.EmbedType
var ftr discordgo.MessageEmbedFooter var ftr discordgo.MessageEmbedFooter
var img discordgo.MessageEmbedImage var img discordgo.MessageEmbedImage
var thm discordgo.MessageEmbedThumbnail var thm discordgo.MessageEmbedThumbnail
var prv discordgo.MessageEmbedProvider var prv discordgo.MessageEmbedProvider
var atr discordgo.MessageEmbedAuthor var atr discordgo.MessageEmbedAuthor
typ = discordgo.EmbedType(embedData.Type)
ftr.Text = embedData.FooterText ftr.Text = embedData.FooterText
ftr.IconURL = embedData.FooterImageURL ftr.IconURL = embedData.FooterImageURL
@ -77,7 +80,7 @@ func (f *Features) CreateCustomEmbed(embedData *models.CustomEmbed) *discordgo.M
msg := discordgo.MessageEmbed{ msg := discordgo.MessageEmbed{
URL: embedData.URL, URL: embedData.URL,
Type: embedData.Type, Type: typ,
Title: embedData.Title, Title: embedData.Title,
Description: embedData.Desc, Description: embedData.Desc,
Timestamp: "", Timestamp: "",

View File

@ -299,6 +299,9 @@ func (f *Features) handleHelp(s *discordgo.Session, m *discordgo.MessageCreate)
desc += "\n__User Settings__\n" desc += "\n__User Settings__\n"
desc += "`colors` - Available color roles\n" desc += "`colors` - Available color roles\n"
desc += "`color` - Set an available color role\n" desc += "`color` - Set an available color role\n"
desc += "`listroles` - List available roles\n"
desc += "`joinrole` - Join an available role\n"
desc += "`leaverole` - Leave a joined role\n"
desc += "\n__Conversion Helpers__\n" desc += "\n__Conversion Helpers__\n"
desc += "`ctof` - Convert Celsius to Farenheit\n" desc += "`ctof` - Convert Celsius to Farenheit\n"

View File

@ -49,6 +49,7 @@ func (f *Features) handleUserColor(s *discordgo.Session, m *discordgo.MessageCre
for _, role := range f.Config.ColorRoles { for _, role := range f.Config.ColorRoles {
if role.Name == roleColorName { if role.Name == roleColorName {
roleColorID = role.ID roleColorID = role.ID
break
} }
} }
if len(roleColorID) == 0 { if len(roleColorID) == 0 {

View File

@ -7,6 +7,12 @@ type ColorRole struct {
ID string `json:"id"` ID string `json:"id"`
} }
type CustomRole struct {
Name string `json:"role_name"`
ShortName string `json:"short_name"`
ID string `json:"id"`
}
type CommandRestriction struct { type CommandRestriction struct {
Command string `json:"command"` Command string `json:"command"`
Mode string `json:"mode"` Mode string `json:"mode"`
@ -27,7 +33,8 @@ type Configuration struct {
CommandRestrictions []CommandRestriction `json:"command_restrictions"` CommandRestrictions []CommandRestriction `json:"command_restrictions"`
ColorRoles []ColorRole `json:"color_roles"` ColorRoles []ColorRole `json:"color_roles"`
CustomRoles []CustomRole `json:"custom_roles"`
IgnoredUsers []string `json:"ignored_users"` IgnoredUsers []string `json:"ignored_users"`