detect fucked up user names

This commit is contained in:
13xforever
2019-03-13 23:14:00 +05:00
parent 9624c632af
commit 7dbf0c53ae
3 changed files with 90 additions and 2 deletions

View File

@@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using CompatApiClient.Utils;
using CompatBot.Utils;
using DSharpPlus;
using DSharpPlus.Entities;
using DSharpPlus.EventArgs;
using HomoglyphConverter;
using Microsoft.Extensions.Caching.Memory;
namespace CompatBot.EventHandlers
{
internal static class UsernameZalgoMonitor
{
public static async Task OnUserUpdated(UserUpdateEventArgs args)
{
var m = args.Client.GetMember(args.UserAfter);
if (NeedsRename(m.DisplayName))
await args.Client.ReportAsync("Potential display name issue",
$"User {m.GetMentionWithNickname()} has changed their __username__ from " +
$"**{args.UserBefore.Username.Sanitize()}#{args.UserBefore.Discriminator}** to " +
$"**{args.UserAfter.Username.Sanitize()}#{args.UserAfter.Discriminator}**",
null,
ReportSeverity.Medium);
}
public static async Task OnMemberUpdated(GuildMemberUpdateEventArgs args)
{
if (NeedsRename(args.NicknameAfter))
await args.Client.ReportAsync("Potential display name issue",
$"Member {args.Member.GetMentionWithNickname()} has changed their __display name__ from " +
$"**{(args.NicknameBefore ?? args.Member.Username).Sanitize()}** to " +
$"**{args.Member.DisplayName.Sanitize()}**",
null,
ReportSeverity.Medium);
}
public static async Task OnMemberAdded(GuildMemberAddEventArgs args)
{
if (NeedsRename(args.Member.DisplayName))
await args.Client.ReportAsync("Potential display name issue",
$"New member joined the server: {args.Member.GetMentionWithNickname()}",
null,
ReportSeverity.Medium);
}
private static bool NeedsRename(string displayName)
{
displayName = displayName?.Normalize().TrimEager();
if (string.IsNullOrEmpty(displayName))
return true;
var consecutiveCombiningCharacters = 0;
foreach (var c in displayName)
{
switch (char.GetUnicodeCategory(c))
{
case UnicodeCategory.ModifierLetter:
case UnicodeCategory.ModifierSymbol:
case UnicodeCategory.NonSpacingMark:
if (++consecutiveCombiningCharacters > 1)
return true;
break;
case UnicodeCategory.Control:
case UnicodeCategory.Format:
break;
default:
consecutiveCombiningCharacters = 0;
break;
}
}
return false;
}
}
}

View File

@@ -185,9 +185,14 @@ namespace CompatBot
client.MessageDeleted += ThumbnailCacheMonitor.OnMessageDeleted;
client.UserUpdated += UsernameSpoofMonitor.OnUserUpdated;
client.UserUpdated += UsernameZalgoMonitor.OnUserUpdated;
client.GuildMemberAdded += Greeter.OnMemberAdded;
client.GuildMemberAdded += UsernameSpoofMonitor.OnMemberAdded;
client.GuildMemberAdded += UsernameZalgoMonitor.OnMemberAdded;
client.GuildMemberUpdated += UsernameSpoofMonitor.OnMemberUpdated;
client.GuildMemberUpdated += UsernameZalgoMonitor.OnMemberUpdated;
client.DebugLogger.LogMessageReceived += (sender, eventArgs) =>
{

View File

@@ -127,14 +127,16 @@ namespace CompatBot.Utils
return await logChannel.SendMessageAsync(embed: embedBuilder.Build()).ConfigureAwait(false);
}
public static async Task<DiscordMessage> ReportAsync(this DiscordClient client, string infraction, string description, IEnumerable<DiscordMember> potentialVictims, ReportSeverity severity)
public static async Task<DiscordMessage> ReportAsync(this DiscordClient client, string infraction, string description, ICollection<DiscordMember> potentialVictims, ReportSeverity severity)
{
var result = new DiscordEmbedBuilder
{
Title = infraction,
Color = GetColor(severity),
Description = description.Trim(EmbedPager.MaxDescriptionLength),
}.AddField("Potential Targets", string.Join(Environment.NewLine, potentialVictims.Select(GetMentionWithNickname)).Trim(EmbedPager.MaxFieldLength));
};
if (potentialVictims?.Count > 0)
result.AddField("Potential Targets", string.Join(Environment.NewLine, potentialVictims.Select(GetMentionWithNickname)).Trim(EmbedPager.MaxFieldLength));
var logChannel = await client.GetChannelAsync(Config.BotLogId).ConfigureAwait(false);
return await logChannel.SendMessageAsync(embed: result.Build()).ConfigureAwait(false);
}