Skip to content

Commit 3b08860

Browse files
Fix mass mention filter for AutoMod-blocked messages
1 parent e153455 commit 3b08860

File tree

4 files changed

+20
-5
lines changed

4 files changed

+20
-5
lines changed

Constants/RegexConstants.cs

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class RegexConstants
99
readonly public static Regex bold_rx = new("\\*\\*(.*?)\\*\\*");
1010
readonly public static Regex discord_link_rx = new(@".*discord(?:app)?.com\/channels\/((?:@)?[a-z0-9]*)\/([0-9]*)(?:\/)?([0-9]*)");
1111
readonly public static Regex channel_rx = new("<#([0-9]+)>");
12+
readonly public static Regex user_rx = new("<@([0-9]+)>");
1213
readonly public static Regex warn_msg_rx = new($"{Program.cfgjson.Emoji.Warning} <@!?[0-9]+> was warned");
1314
readonly public static Regex auto_warn_msg_rx = new($"{Program.cfgjson.Emoji.Denied} <@!?[0-9]+> was automatically warned");
1415
readonly public static Regex mute_msg_rx = new($"{Program.cfgjson.Emoji.Muted} <@!?[0-9]+> has been muted");

Events/AutoModEvents.cs

+11-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,17 @@ public static async Task AutoModerationRuleExecuted(DiscordClient client, AutoMo
1616
var channel = await client.GetChannelAsync(e.Rule.ChannelId!.Value);
1717

1818
// Create a "mock" message object to pass to the message handler, since we don't have the actual message object
19-
var message = new MockDiscordMessage(author: author, channel: channel, channelId: channel.Id, content: e.Rule.Content);
19+
var mentionedUsers = new List<ulong>();
20+
if (e.Rule.Content is not null)
21+
{
22+
foreach (var match in Constants.RegexConstants.user_rx.Matches(e.Rule.Content))
23+
{
24+
var id = Convert.ToUInt64(((Match)match).Groups[1].ToString());
25+
if (!mentionedUsers.Contains(id))
26+
mentionedUsers.Add(id);
27+
}
28+
}
29+
var message = new MockDiscordMessage(author: author, channel: channel, channelId: channel.Id, content: e.Rule.Content, mentionedUsersCount: mentionedUsers.Count);
2030

2131
// Pass to the message handler
2232
await MessageEvent.MessageHandlerAsync(client, message, channel, false, true, true);

Events/MessageEvent.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public static async Task MessageHandlerAsync(DiscordClient client, MockDiscordMe
285285
}
286286
}
287287

288-
if (message.MentionedUsers is not null && message.MentionedUsers.Count > Program.cfgjson.MassMentionBanThreshold)
288+
if ((message.MentionedUsers is not null && message.MentionedUsers.Count > Program.cfgjson.MassMentionBanThreshold) || (message.MentionedUsersCount > Program.cfgjson.MassMentionBanThreshold))
289289
{
290290
if (wasAutoModBlock)
291291
{
@@ -298,7 +298,8 @@ public static async Task MessageHandlerAsync(DiscordClient client, MockDiscordMe
298298
}
299299

300300
_ = channel.Guild.BanMemberAsync(message.Author, TimeSpan.FromDays(7), $"Mentioned more than {Program.cfgjson.MassMentionBanThreshold} users in one message.");
301-
string content = $"{Program.cfgjson.Emoji.Banned} {message.Author.Mention} was automatically banned for mentioning **{message.MentionedUsers.Count}** users.";
301+
var mentionCount = message.MentionedUsers is not null && message.MentionedUsers.Count > 0 ? message.MentionedUsers.Count : message.MentionedUsersCount;
302+
string content = $"{Program.cfgjson.Emoji.Banned} {message.Author.Mention} was automatically banned for mentioning **{mentionCount}** users.";
302303
var chatMsg = await channel.SendMessageAsync(content);
303304
_ = InvestigationsHelpers.SendInfringingMessaageAsync("investigations", message, "Mass mentions (Ban threshold)", DiscordHelpers.MessageLink(chatMsg), content: content, wasAutoModBlock: wasAutoModBlock);
304305
_ = InvestigationsHelpers.SendInfringingMessaageAsync("mod", message, "Mass mentions (Ban threshold)", DiscordHelpers.MessageLink(chatMsg), content: content, wasAutoModBlock: wasAutoModBlock);
@@ -666,7 +667,7 @@ public static async Task MessageHandlerAsync(DiscordClient client, MockDiscordMe
666667
}
667668

668669
// Mass mentions
669-
if (message.MentionedUsers is not null && message.MentionedUsers.Count >= Program.cfgjson.MassMentionThreshold && (await GetPermLevelAsync(member)) < ServerPermLevel.Tier3)
670+
if (((message.MentionedUsers is not null && message.MentionedUsers.Count >= Program.cfgjson.MassMentionThreshold) || (message.MentionedUsersCount >= Program.cfgjson.MassMentionThreshold)) && (await GetPermLevelAsync(member)) < ServerPermLevel.Tier3)
670671
{
671672
if (wasAutoModBlock)
672673
{

Events/MockDiscordMessage.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ public MockDiscordMessage(DiscordMessage baseMessage)
1919
Id = baseMessage.Id;
2020
JumpLink = baseMessage.JumpLink;
2121
MentionedUsers = baseMessage.MentionedUsers;
22+
MentionedUsersCount = baseMessage.MentionedUsers.Count;
2223
Reactions = baseMessage.Reactions;
2324
ReferencedMessage = baseMessage.ReferencedMessage;
2425
Stickers = baseMessage.Stickers;
2526
Timestamp = baseMessage.Timestamp;
2627
}
2728

28-
public MockDiscordMessage(IReadOnlyList<DiscordAttachment> attachments = default, DiscordUser author = default, DiscordChannel channel = default, ulong channelId = default, string content = default, IReadOnlyList<DiscordEmbed> embeds = default, ulong id = default, Uri jumpLink = default, IReadOnlyList<DiscordUser> mentionedUsers = default, IReadOnlyList<DiscordReaction> reactions = default, DiscordMessage referencedMessage = default, IReadOnlyList<DiscordMessageSticker> stickers = default, DateTimeOffset? timestamp = default)
29+
public MockDiscordMessage(IReadOnlyList<DiscordAttachment> attachments = default, DiscordUser author = default, DiscordChannel channel = default, ulong channelId = default, string content = default, IReadOnlyList<DiscordEmbed> embeds = default, ulong id = default, Uri jumpLink = default, IReadOnlyList<DiscordUser> mentionedUsers = default, int mentionedUsersCount = default, IReadOnlyList<DiscordReaction> reactions = default, DiscordMessage referencedMessage = default, IReadOnlyList<DiscordMessageSticker> stickers = default, DateTimeOffset? timestamp = default)
2930
{
3031
Attachments = attachments;
3132
Author = author;
@@ -36,6 +37,7 @@ public MockDiscordMessage(IReadOnlyList<DiscordAttachment> attachments = default
3637
Id = id;
3738
JumpLink = jumpLink;
3839
MentionedUsers = mentionedUsers;
40+
MentionedUsersCount = mentionedUsersCount;
3941
Reactions = reactions;
4042
ReferencedMessage = referencedMessage;
4143
Stickers = stickers;
@@ -52,6 +54,7 @@ public MockDiscordMessage(IReadOnlyList<DiscordAttachment> attachments = default
5254
public ulong Id { get; }
5355
public Uri JumpLink { get; set; }
5456
public IReadOnlyList<DiscordUser> MentionedUsers { get; }
57+
public int MentionedUsersCount { get; }
5558
public IReadOnlyList<DiscordReaction> Reactions { get; set; }
5659
public DiscordMessage ReferencedMessage { get; set; }
5760
public IReadOnlyList<DiscordMessageSticker> Stickers { get; set; }

0 commit comments

Comments
 (0)