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 {
|
||||
if strings.Contains(text, "\x1F") {
|
||||
return errors.New("option string cannot contain unit separator")
|
||||
}
|
||||
|
||||
var optText string
|
||||
err := db.QueryRow("SELECT opt_text FROM polls WHERE msg_id = ?", msgID).Scan(&optText)
|
||||
if err != nil {
|
||||
|
@ -65,11 +69,15 @@ func AddPollOptionText(msgID string, text string) error {
|
|||
splitText := splitOptions(optText)
|
||||
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
|
||||
}
|
||||
|
||||
func AddPollOptionEmoji(msgID string, emoji string) error {
|
||||
if strings.Contains(emoji, "\x1F") {
|
||||
return errors.New("emoji string cannot contain unit separator")
|
||||
}
|
||||
|
||||
var optEmojis string
|
||||
err := db.QueryRow("SELECT opt_emojis FROM polls WHERE msg_id = ?", msgID).Scan(&optEmojis)
|
||||
if err != nil {
|
||||
|
@ -82,7 +90,7 @@ func AddPollOptionEmoji(msgID string, emoji string) error {
|
|||
}
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -119,5 +127,5 @@ func splitOptions(s string) []string {
|
|||
if s == "" {
|
||||
return nil
|
||||
}
|
||||
return strings.Split(s, ",")
|
||||
return strings.Split(s, "\x1F")
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package db
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
|
@ -41,8 +42,8 @@ func AddReactionRoleCategory(channelID string, rrc ReactionRoleCategory) error {
|
|||
channelID,
|
||||
rrc.Name,
|
||||
rrc.Description,
|
||||
strings.Join(rrc.Emoji, ","),
|
||||
strings.Join(rrc.Roles, ","),
|
||||
strings.Join(rrc.Emoji, "\x1F"),
|
||||
strings.Join(rrc.Roles, "\x1F"),
|
||||
)
|
||||
return err
|
||||
}
|
||||
|
@ -74,6 +75,10 @@ func DeleteReactionRoleCategory(channelID, name string) 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
|
||||
err := db.QueryRow("SELECT emoji, roles FROM reaction_role_categories WHERE name = ? AND channel_id = ?", category, channelID).Scan(&oldEmoji, &oldRoles)
|
||||
if err != nil {
|
||||
|
@ -86,8 +91,8 @@ func AddReactionRole(channelID, category, emoji string, role *discordgo.Role) er
|
|||
|
||||
_, err = db.Exec(
|
||||
"UPDATE reaction_role_categories SET emoji = ?, roles = ? WHERE name = ? AND channel_id = ?",
|
||||
strings.Join(splitEmoji, ","),
|
||||
strings.Join(splitRoles, ","),
|
||||
strings.Join(splitEmoji, "\x1F"),
|
||||
strings.Join(splitRoles, "\x1F"),
|
||||
category,
|
||||
channelID,
|
||||
)
|
||||
|
@ -111,8 +116,8 @@ func DeleteReactionRole(channelID, category string, role *discordgo.Role) error
|
|||
|
||||
_, err = db.Exec(
|
||||
"UPDATE reaction_role_categories SET emoji = ?, roles = ? WHERE name = ? AND channel_id = ?",
|
||||
strings.Join(splitEmoji, ","),
|
||||
strings.Join(splitRoles, ","),
|
||||
strings.Join(splitEmoji, "\x1F"),
|
||||
strings.Join(splitRoles, "\x1F"),
|
||||
category,
|
||||
channelID,
|
||||
)
|
||||
|
|
|
@ -77,6 +77,8 @@ func reactionsAddCmd(s *discordgo.Session, i *discordgo.InteractionCreate) error
|
|||
if err := validateEmoji(reaction.Reaction); err != nil {
|
||||
return err
|
||||
}
|
||||
// Use the correct delimeter for the DB
|
||||
reaction.Reaction = strings.ReplaceAll(reaction.Reaction, ",", "\x1F")
|
||||
}
|
||||
|
||||
err := db.AddReaction(i.GuildID, reaction)
|
||||
|
@ -140,6 +142,8 @@ func validateEmoji(s string) error {
|
|||
return fmt.Errorf("invalid reaction emoji: %s", emojiStr)
|
||||
}
|
||||
}
|
||||
} else if strings.Contains(s, "\x1F") {
|
||||
return fmt.Errorf("emoji string cannot contain unit separator")
|
||||
} else {
|
||||
if _, ok := emoji.Parse(s); !ok {
|
||||
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)
|
||||
}
|
||||
|
||||
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(util.InteractionErrorHandler("on-vetting-req", onVettingRequest))
|
||||
s.AddHandler(util.InteractionErrorHandler("on-vetting-resp", onVettingResponse))
|
||||
s.AddHandler(onMemberLeave)
|
||||
|
||||
commands.Register(s, onMakeVettingMsg, &discordgo.ApplicationCommand{
|
||||
Name: "Make Vetting Message",
|
||||
|
|
Loading…
Reference in New Issue