Properly block pinging normally unmentionable roles

This commit is contained in:
Ske 2020-07-18 17:06:02 +02:00
parent fd0e46f40d
commit 5d3e159f54
2 changed files with 10 additions and 3 deletions

View File

@ -66,7 +66,7 @@ namespace PluralKit.Bot
var dwb = new DiscordWebhookBuilder(); var dwb = new DiscordWebhookBuilder();
dwb.WithUsername(FixClyde(name).Truncate(80)); dwb.WithUsername(FixClyde(name).Truncate(80));
dwb.WithContent(content); dwb.WithContent(content);
dwb.AddMentions(content.ParseAllMentions(allowEveryone)); dwb.AddMentions(content.ParseAllMentions(allowEveryone, channel.Guild));
if (avatarUrl != null) dwb.WithAvatarUrl(avatarUrl); if (avatarUrl != null) dwb.WithAvatarUrl(avatarUrl);
var attachmentChunks = ChunkAttachmentsOrThrow(attachments, 8 * 1024 * 1024); var attachmentChunks = ChunkAttachmentsOrThrow(attachments, 8 * 1024 * 1024);

View File

@ -183,13 +183,20 @@ namespace PluralKit.Bot
return false; return false;
} }
public static IEnumerable<IMention> ParseAllMentions(this string input, bool allowEveryone = false) public static IEnumerable<IMention> ParseAllMentions(this string input, bool allowEveryone = false, DiscordGuild guild = null)
{ {
var mentions = new List<IMention>(); var mentions = new List<IMention>();
mentions.AddRange(USER_MENTION.Matches(input) mentions.AddRange(USER_MENTION.Matches(input)
.Select(x => new UserMention(ulong.Parse(x.Groups[1].Value)) as IMention)); .Select(x => new UserMention(ulong.Parse(x.Groups[1].Value)) as IMention));
// Only allow role mentions through where the role is actually listed as *mentionable*
// (ie. any user can @ them, regardless of permissions)
// Still let the allowEveryone flag override this though (privileged users can @ *any* role)
// Original fix by Gwen
mentions.AddRange(ROLE_MENTION.Matches(input) mentions.AddRange(ROLE_MENTION.Matches(input)
.Select(x => new RoleMention(ulong.Parse(x.Groups[1].Value)) as IMention)); .Select(x => ulong.Parse(x.Groups[1].Value))
.Where(x => allowEveryone || guild != null && guild.GetRole(x).IsMentionable)
.Select(x => new RoleMention(x) as IMention));
if (EVERYONE_HERE_MENTION.IsMatch(input) && allowEveryone) if (EVERYONE_HERE_MENTION.IsMatch(input) && allowEveryone)
mentions.Add(new EveryoneMention()); mentions.Add(new EveryoneMention());
return mentions; return mentions;