Fix ping-like query failing; other small changes

This commit is contained in:
Noi 2022-07-12 23:45:18 -07:00
parent 9e09800bff
commit dc61e93a7f
4 changed files with 24 additions and 14 deletions

View file

@ -5,7 +5,7 @@ class ModuleConfig {
public EntityName Role { get; }
public ModuleConfig(JObject conf) {
var cfgRole = conf["Role"]?.Value<string>();
var cfgRole = conf[nameof(Role)]?.Value<string>();
if (string.IsNullOrWhiteSpace(cfgRole))
throw new ModuleLoadException("Role was not specified.");
Role = new EntityName(cfgRole);

View file

@ -141,7 +141,7 @@ class ResponseExecutor {
result = await _bot.KickAsync(_guild, $"Rule '{_rule.Label}'", _user.Id,
parameter, _rule.NotifyUserOfRemoval);
}
if (result.ErrorForbidden) return FromError(ForbiddenGenericError);
if (result.ErrorForbidden) return FromError(Strings.ForbiddenGenericError);
if (result.ErrorNotFound) return FromError("The target user is no longer in the server.");
if (_rule.NotifyChannelOfRemoval) await _msg.Channel.SendMessageAsync(result.GetResultString(_bot));
return FromSuccess(result.MessageSendSuccess ? null : "Unable to send notification DM.");

View file

@ -2,12 +2,18 @@
using Discord.WebSocket;
using Newtonsoft.Json.Linq;
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace RegexBot.Common;
/// <summary>
/// Miscellaneous utility methods useful for the bot and modules.
/// </summary>
public static class Utilities {
public static Regex ChannelMention { get; } = new(@"<#(?<snowflake>\d+)>", RegexOptions.Compiled);
public static Regex CustomEmoji { get; } = new(@"<:(?<name>[A-Za-z0-9_]{2,}):(?<ID>\d+)>", RegexOptions.Compiled);
public static Regex DiscriminatorSearch { get; } = new(@"(.+)#(\d{4}(?!\d))", RegexOptions.Compiled);
public static Regex UserMention { get; } = new(@"<@!?(?<snowflake>\d+)>", RegexOptions.Compiled);
/// <summary>
/// Performs common checks on the specified message to see if it fits all the criteria of a
/// typical, ordinary message sent by an ordinary guild user.

View file

@ -1,6 +1,6 @@
using Discord.WebSocket;
using RegexBot.Common;
using RegexBot.Data;
using System.Text.RegularExpressions;
namespace RegexBot.Services.EntityCache;
/// <summary>
@ -10,8 +10,6 @@ namespace RegexBot.Services.EntityCache;
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static")]
class UserCachingSubservice {
private static Regex DiscriminatorSearch { get; } = new(@"(.+)#(\d{4}(?!\d))", RegexOptions.Compiled);
internal UserCachingSubservice(RegexbotClient bot) {
bot.DiscordClient.GuildMembersDownloaded += DiscordClient_GuildMembersDownloaded;
bot.DiscordClient.GuildMemberUpdated += DiscordClient_GuildMemberUpdated;
@ -84,15 +82,18 @@ class UserCachingSubservice {
return query.SingleOrDefault();
}
// Is search just a number? Assume ID, pass it on to the correct place.
if (ulong.TryParse(search, out var searchid)) {
// Is search actually a ping? Extract ID.
var m = Utilities.UserMention.Match(search);
if (m.Success) search = m.Groups["snowflake"].Value;
// Is search a number? Assume ID, proceed to query.
if (ulong.TryParse(search, out var searchid)) {
var idres = innerQuery(searchid, null);
if (idres != null) return idres;
}
// If the above fails, assume the number may be a string to search.
// All of the above failed. Assume the number may be a string to search.
var namesplit = SplitNameAndDiscriminator(search);
return innerQuery(null, namesplit);
}
@ -114,22 +115,25 @@ class UserCachingSubservice {
return query.SingleOrDefault();
}
// Is search just a number? Assume ID, pass it on to the correct place.
// Is search actually a ping? Extract ID.
var m = Utilities.UserMention.Match(search);
if (m.Success) search = m.Groups["snowflake"].Value;
// Is search a number? Assume ID, proceed to query.
if (ulong.TryParse(search, out var searchid)) {
var idres = innerQuery(guildId, searchid, null);
if (idres != null) return idres;
}
// If the above fails, assume the number may be a string to search.
// All of the above failed. Assume the number may be a string to search.
var namesplit = SplitNameAndDiscriminator(search);
return innerQuery(guildId, null, namesplit);
}
private static (string, string?) SplitNameAndDiscriminator(string input) {
string name;
string? disc = null;
var split = DiscriminatorSearch.Match(input);
var split = Utilities.DiscriminatorSearch.Match(input);
if (split.Success) {
name = split.Groups[1].Value;
disc = split.Groups[2].Value;