Fix ping-like query failing; other small changes
This commit is contained in:
parent
9e09800bff
commit
dc61e93a7f
4 changed files with 24 additions and 14 deletions
|
@ -5,7 +5,7 @@ class ModuleConfig {
|
||||||
public EntityName Role { get; }
|
public EntityName Role { get; }
|
||||||
|
|
||||||
public ModuleConfig(JObject conf) {
|
public ModuleConfig(JObject conf) {
|
||||||
var cfgRole = conf["Role"]?.Value<string>();
|
var cfgRole = conf[nameof(Role)]?.Value<string>();
|
||||||
if (string.IsNullOrWhiteSpace(cfgRole))
|
if (string.IsNullOrWhiteSpace(cfgRole))
|
||||||
throw new ModuleLoadException("Role was not specified.");
|
throw new ModuleLoadException("Role was not specified.");
|
||||||
Role = new EntityName(cfgRole);
|
Role = new EntityName(cfgRole);
|
||||||
|
|
|
@ -141,7 +141,7 @@ class ResponseExecutor {
|
||||||
result = await _bot.KickAsync(_guild, $"Rule '{_rule.Label}'", _user.Id,
|
result = await _bot.KickAsync(_guild, $"Rule '{_rule.Label}'", _user.Id,
|
||||||
parameter, _rule.NotifyUserOfRemoval);
|
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 (result.ErrorNotFound) return FromError("The target user is no longer in the server.");
|
||||||
if (_rule.NotifyChannelOfRemoval) await _msg.Channel.SendMessageAsync(result.GetResultString(_bot));
|
if (_rule.NotifyChannelOfRemoval) await _msg.Channel.SendMessageAsync(result.GetResultString(_bot));
|
||||||
return FromSuccess(result.MessageSendSuccess ? null : "Unable to send notification DM.");
|
return FromSuccess(result.MessageSendSuccess ? null : "Unable to send notification DM.");
|
||||||
|
|
|
@ -2,12 +2,18 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace RegexBot.Common;
|
namespace RegexBot.Common;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Miscellaneous utility methods useful for the bot and modules.
|
/// Miscellaneous utility methods useful for the bot and modules.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class Utilities {
|
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>
|
/// <summary>
|
||||||
/// Performs common checks on the specified message to see if it fits all the criteria of a
|
/// 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.
|
/// typical, ordinary message sent by an ordinary guild user.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
using RegexBot.Common;
|
||||||
using RegexBot.Data;
|
using RegexBot.Data;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
|
|
||||||
namespace RegexBot.Services.EntityCache;
|
namespace RegexBot.Services.EntityCache;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -10,8 +10,6 @@ namespace RegexBot.Services.EntityCache;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static")]
|
||||||
class UserCachingSubservice {
|
class UserCachingSubservice {
|
||||||
private static Regex DiscriminatorSearch { get; } = new(@"(.+)#(\d{4}(?!\d))", RegexOptions.Compiled);
|
|
||||||
|
|
||||||
internal UserCachingSubservice(RegexbotClient bot) {
|
internal UserCachingSubservice(RegexbotClient bot) {
|
||||||
bot.DiscordClient.GuildMembersDownloaded += DiscordClient_GuildMembersDownloaded;
|
bot.DiscordClient.GuildMembersDownloaded += DiscordClient_GuildMembersDownloaded;
|
||||||
bot.DiscordClient.GuildMemberUpdated += DiscordClient_GuildMemberUpdated;
|
bot.DiscordClient.GuildMemberUpdated += DiscordClient_GuildMemberUpdated;
|
||||||
|
@ -84,15 +82,18 @@ class UserCachingSubservice {
|
||||||
return query.SingleOrDefault();
|
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)) {
|
if (ulong.TryParse(search, out var searchid)) {
|
||||||
var idres = innerQuery(searchid, null);
|
var idres = innerQuery(searchid, null);
|
||||||
if (idres != null) return idres;
|
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);
|
var namesplit = SplitNameAndDiscriminator(search);
|
||||||
|
|
||||||
return innerQuery(null, namesplit);
|
return innerQuery(null, namesplit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,22 +115,25 @@ class UserCachingSubservice {
|
||||||
return query.SingleOrDefault();
|
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)) {
|
if (ulong.TryParse(search, out var searchid)) {
|
||||||
var idres = innerQuery(guildId, searchid, null);
|
var idres = innerQuery(guildId, searchid, null);
|
||||||
if (idres != null) return idres;
|
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);
|
var namesplit = SplitNameAndDiscriminator(search);
|
||||||
|
|
||||||
return innerQuery(guildId, null, namesplit);
|
return innerQuery(guildId, null, namesplit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static (string, string?) SplitNameAndDiscriminator(string input) {
|
private static (string, string?) SplitNameAndDiscriminator(string input) {
|
||||||
string name;
|
string name;
|
||||||
string? disc = null;
|
string? disc = null;
|
||||||
var split = DiscriminatorSearch.Match(input);
|
var split = Utilities.DiscriminatorSearch.Match(input);
|
||||||
if (split.Success) {
|
if (split.Success) {
|
||||||
name = split.Groups[1].Value;
|
name = split.Groups[1].Value;
|
||||||
disc = split.Groups[2].Value;
|
disc = split.Groups[2].Value;
|
||||||
|
|
Loading…
Reference in a new issue