Compare commits
2 Commits
c68fcfe439
...
2c84e6b79c
Author | SHA1 | Date |
---|---|---|
Elara | 2c84e6b79c | |
Elara | 52038b4765 |
|
@ -0,0 +1,7 @@
|
||||||
|
/* change the string delimeter from comma to Unit Separator, to allow commas */
|
||||||
|
/* to be used in polls and the like */
|
||||||
|
UPDATE reactions SET reaction = REPLACE(reaction, ',', X'1F');
|
||||||
|
UPDATE polls SET opt_emojis = REPLACE(opt_emojis, ',', X'1F');
|
||||||
|
UPDATE polls SET opt_text = REPLACE(opt_text, ',', X'1F');
|
||||||
|
UPDATE reaction_role_categories SET emoji = REPLACE(emoji, ',', X'1F');
|
||||||
|
UPDATE reaction_role_categories SET roles = REPLACE(roles, ',', X'1F');
|
|
@ -56,6 +56,10 @@ func GetPoll(msgID string) (*Poll, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddPollOptionText(msgID string, text string) error {
|
func AddPollOptionText(msgID string, text string) error {
|
||||||
|
if strings.Contains(text, "\x1F") {
|
||||||
|
return errors.New("option string cannot contain unit separator")
|
||||||
|
}
|
||||||
|
|
||||||
var optText string
|
var optText string
|
||||||
err := db.QueryRow("SELECT opt_text FROM polls WHERE msg_id = ?", msgID).Scan(&optText)
|
err := db.QueryRow("SELECT opt_text FROM polls WHERE msg_id = ?", msgID).Scan(&optText)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -65,11 +69,15 @@ func AddPollOptionText(msgID string, text string) error {
|
||||||
splitText := splitOptions(optText)
|
splitText := splitOptions(optText)
|
||||||
splitText = append(splitText, text)
|
splitText = append(splitText, text)
|
||||||
|
|
||||||
_, err = db.Exec("UPDATE polls SET opt_text = ? WHERE msg_id = ?", strings.Join(splitText, ","), msgID)
|
_, err = db.Exec("UPDATE polls SET opt_text = ? WHERE msg_id = ?", strings.Join(splitText, "\x1F"), msgID)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddPollOptionEmoji(msgID string, emoji string) error {
|
func AddPollOptionEmoji(msgID string, emoji string) error {
|
||||||
|
if strings.Contains(emoji, "\x1F") {
|
||||||
|
return errors.New("emoji string cannot contain unit separator")
|
||||||
|
}
|
||||||
|
|
||||||
var optEmojis string
|
var optEmojis string
|
||||||
err := db.QueryRow("SELECT opt_emojis FROM polls WHERE msg_id = ?", msgID).Scan(&optEmojis)
|
err := db.QueryRow("SELECT opt_emojis FROM polls WHERE msg_id = ?", msgID).Scan(&optEmojis)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -82,7 +90,7 @@ func AddPollOptionEmoji(msgID string, emoji string) error {
|
||||||
}
|
}
|
||||||
splitEmojis = append(splitEmojis, emoji)
|
splitEmojis = append(splitEmojis, emoji)
|
||||||
|
|
||||||
_, err = db.Exec("UPDATE polls SET opt_emojis = ? WHERE msg_id = ?", strings.Join(splitEmojis, ","), msgID)
|
_, err = db.Exec("UPDATE polls SET opt_emojis = ? WHERE msg_id = ?", strings.Join(splitEmojis, "\x1F"), msgID)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,5 +127,5 @@ func splitOptions(s string) []string {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return strings.Split(s, ",")
|
return strings.Split(s, "\x1F")
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -41,8 +42,8 @@ func AddReactionRoleCategory(channelID string, rrc ReactionRoleCategory) error {
|
||||||
channelID,
|
channelID,
|
||||||
rrc.Name,
|
rrc.Name,
|
||||||
rrc.Description,
|
rrc.Description,
|
||||||
strings.Join(rrc.Emoji, ","),
|
strings.Join(rrc.Emoji, "\x1F"),
|
||||||
strings.Join(rrc.Roles, ","),
|
strings.Join(rrc.Roles, "\x1F"),
|
||||||
)
|
)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -74,6 +75,10 @@ func DeleteReactionRoleCategory(channelID, name string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddReactionRole(channelID, category, emoji string, role *discordgo.Role) error {
|
func AddReactionRole(channelID, category, emoji string, role *discordgo.Role) error {
|
||||||
|
if strings.Contains(category, "\x1F") || strings.Contains(emoji, "\x1F") {
|
||||||
|
return errors.New("reaction roles cannot contain unit separator")
|
||||||
|
}
|
||||||
|
|
||||||
var oldEmoji, oldRoles string
|
var oldEmoji, oldRoles string
|
||||||
err := db.QueryRow("SELECT emoji, roles FROM reaction_role_categories WHERE name = ? AND channel_id = ?", category, channelID).Scan(&oldEmoji, &oldRoles)
|
err := db.QueryRow("SELECT emoji, roles FROM reaction_role_categories WHERE name = ? AND channel_id = ?", category, channelID).Scan(&oldEmoji, &oldRoles)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -86,8 +91,8 @@ func AddReactionRole(channelID, category, emoji string, role *discordgo.Role) er
|
||||||
|
|
||||||
_, err = db.Exec(
|
_, err = db.Exec(
|
||||||
"UPDATE reaction_role_categories SET emoji = ?, roles = ? WHERE name = ? AND channel_id = ?",
|
"UPDATE reaction_role_categories SET emoji = ?, roles = ? WHERE name = ? AND channel_id = ?",
|
||||||
strings.Join(splitEmoji, ","),
|
strings.Join(splitEmoji, "\x1F"),
|
||||||
strings.Join(splitRoles, ","),
|
strings.Join(splitRoles, "\x1F"),
|
||||||
category,
|
category,
|
||||||
channelID,
|
channelID,
|
||||||
)
|
)
|
||||||
|
@ -111,8 +116,8 @@ func DeleteReactionRole(channelID, category string, role *discordgo.Role) error
|
||||||
|
|
||||||
_, err = db.Exec(
|
_, err = db.Exec(
|
||||||
"UPDATE reaction_role_categories SET emoji = ?, roles = ? WHERE name = ? AND channel_id = ?",
|
"UPDATE reaction_role_categories SET emoji = ?, roles = ? WHERE name = ? AND channel_id = ?",
|
||||||
strings.Join(splitEmoji, ","),
|
strings.Join(splitEmoji, "\x1F"),
|
||||||
strings.Join(splitRoles, ","),
|
strings.Join(splitRoles, "\x1F"),
|
||||||
category,
|
category,
|
||||||
channelID,
|
channelID,
|
||||||
)
|
)
|
||||||
|
|
|
@ -77,6 +77,8 @@ func reactionsAddCmd(s *discordgo.Session, i *discordgo.InteractionCreate) error
|
||||||
if err := validateEmoji(reaction.Reaction); err != nil {
|
if err := validateEmoji(reaction.Reaction); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// Use the correct delimeter for the DB
|
||||||
|
reaction.Reaction = strings.ReplaceAll(reaction.Reaction, ",", "\x1F")
|
||||||
}
|
}
|
||||||
|
|
||||||
err := db.AddReaction(i.GuildID, reaction)
|
err := db.AddReaction(i.GuildID, reaction)
|
||||||
|
@ -140,6 +142,8 @@ func validateEmoji(s string) error {
|
||||||
return fmt.Errorf("invalid reaction emoji: %s", emojiStr)
|
return fmt.Errorf("invalid reaction emoji: %s", emojiStr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if strings.Contains(s, "\x1F") {
|
||||||
|
return fmt.Errorf("emoji string cannot contain unit separator")
|
||||||
} else {
|
} else {
|
||||||
if _, ok := emoji.Parse(s); !ok {
|
if _, ok := emoji.Parse(s); !ok {
|
||||||
return fmt.Errorf("invalid reaction emoji: %s", s)
|
return fmt.Errorf("invalid reaction emoji: %s", s)
|
||||||
|
|
|
@ -397,3 +397,31 @@ func onVettingResponse(s *discordgo.Session, i *discordgo.InteractionCreate) err
|
||||||
|
|
||||||
return db.RemoveVettingReq(i.GuildID, i.Message.ID)
|
return db.RemoveVettingReq(i.GuildID, i.Message.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func onMemberLeave(s *discordgo.Session, gmr *discordgo.GuildMemberRemove) {
|
||||||
|
msgID, err := db.VettingReqMsgID(gmr.GuildID, gmr.Member.User.ID)
|
||||||
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
|
return
|
||||||
|
} else if err != nil {
|
||||||
|
log.Error("Error getting vetting request ID after member leave").Str("user-id", gmr.Member.User.ID).Err(err).Send()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guild, err := db.GuildByID(gmr.GuildID)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Error getting guild").Str("guild-id", gmr.GuildID).Err(err).Send()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if guild.VettingReqChanID != "" {
|
||||||
|
err = s.ChannelMessageDelete(guild.VettingReqChanID, msgID)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Error deleting vetting request message after member leave").Str("msg-id", msgID).Err(err).Send()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = db.RemoveVettingReq(gmr.GuildID, msgID)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Error removing vetting request after member leave").Str("user-id", gmr.Member.User.ID).Err(err).Send()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ func Init(s *discordgo.Session) error {
|
||||||
s.AddHandler(onMemberJoin)
|
s.AddHandler(onMemberJoin)
|
||||||
s.AddHandler(util.InteractionErrorHandler("on-vetting-req", onVettingRequest))
|
s.AddHandler(util.InteractionErrorHandler("on-vetting-req", onVettingRequest))
|
||||||
s.AddHandler(util.InteractionErrorHandler("on-vetting-resp", onVettingResponse))
|
s.AddHandler(util.InteractionErrorHandler("on-vetting-resp", onVettingResponse))
|
||||||
|
s.AddHandler(onMemberLeave)
|
||||||
|
|
||||||
commands.Register(s, onMakeVettingMsg, &discordgo.ApplicationCommand{
|
commands.Register(s, onMakeVettingMsg, &discordgo.ApplicationCommand{
|
||||||
Name: "Make Vetting Message",
|
Name: "Make Vetting Message",
|
||||||
|
|
Loading…
Reference in New Issue