Preparing to add additional features
This commit is contained in:
parent
e6fab52e45
commit
1d24e2d839
2 changed files with 47 additions and 41 deletions
|
@ -11,6 +11,10 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Noikoio.RegexBot.Module.ModTools
|
namespace Noikoio.RegexBot.Module.ModTools
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Base class for ModTools command.
|
||||||
|
/// We are not using Discord.Net's Commands extension, as it does not allow for changes during runtime.
|
||||||
|
/// </summary>
|
||||||
[DebuggerDisplay("{Label}-type command")]
|
[DebuggerDisplay("{Label}-type command")]
|
||||||
abstract class CommandBase
|
abstract class CommandBase
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,20 +1,19 @@
|
||||||
using Discord.WebSocket;
|
using Discord;
|
||||||
|
using Discord.WebSocket;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using Noikoio.RegexBot.ConfigItem;
|
using Noikoio.RegexBot.ConfigItem;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Noikoio.RegexBot.Module.ModTools
|
namespace Noikoio.RegexBot.Module.ModTools
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ModTools module object.
|
/// ModTools module.
|
||||||
/// Implements moderation commands that are individually defined and enabled in configuration.
|
/// This class manages reading configuration and creating instances based on it.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
// We are not using Discord.Net's Commands extension, as it does not allow for changes during runtime.
|
|
||||||
class ModTools : BotModule
|
class ModTools : BotModule
|
||||||
{
|
{
|
||||||
public override string Name => "ModTools";
|
public override string Name => "ModTools";
|
||||||
|
@ -26,47 +25,14 @@ namespace Noikoio.RegexBot.Module.ModTools
|
||||||
|
|
||||||
private async Task Client_MessageReceived(SocketMessage arg)
|
private async Task Client_MessageReceived(SocketMessage arg)
|
||||||
{
|
{
|
||||||
// Disregard if not in a guild
|
await CommandCheckInvoke(arg);
|
||||||
SocketGuild g = (arg.Author as SocketGuildUser)?.Guild;
|
|
||||||
if (g == null) return;
|
|
||||||
|
|
||||||
// Get guild config
|
|
||||||
ServerConfig sc = RegexBot.Config.Servers.FirstOrDefault(s => s.Id == g.Id);
|
|
||||||
if (sc == null) return;
|
|
||||||
|
|
||||||
// Disregard if not a bot moderator
|
|
||||||
if (!sc.Moderators.ExistsInList(arg)) return;
|
|
||||||
|
|
||||||
// Disregard if the message contains a newline character
|
|
||||||
if (arg.Content.Contains("\n")) return;
|
|
||||||
|
|
||||||
// Check for and invoke command...
|
|
||||||
string cmdchk;
|
|
||||||
int spc = arg.Content.IndexOf(' ');
|
|
||||||
if (spc != -1) cmdchk = arg.Content.Substring(0, spc);
|
|
||||||
else cmdchk = arg.Content;
|
|
||||||
if (((IDictionary<string, CommandBase>)GetConfig(g.Id)).TryGetValue(cmdchk, out var c))
|
|
||||||
{
|
|
||||||
// ...on the thread pool.
|
|
||||||
await Task.Run(async () =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await Log($"'{c.Label}' invoked by {arg.Author.ToString()} in {g.Name}/#{arg.Channel.Name}");
|
|
||||||
await c.Invoke(g, arg);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
await Log($"Encountered an error for the command '{c.Label}'. Details follow:");
|
|
||||||
await Log(ex.ToString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[ConfigSection("modtools")]
|
[ConfigSection("modtools")]
|
||||||
public override async Task<object> ProcessConfiguration(JToken configSection)
|
public override async Task<object> ProcessConfiguration(JToken configSection)
|
||||||
{
|
{
|
||||||
|
// TODO: put command definitions elsewhere, not in root of this config
|
||||||
|
|
||||||
var commands = new Dictionary<string, CommandBase>(StringComparer.OrdinalIgnoreCase);
|
var commands = new Dictionary<string, CommandBase>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
foreach (var def in configSection.Children<JProperty>())
|
foreach (var def in configSection.Children<JProperty>())
|
||||||
|
@ -85,5 +51,41 @@ namespace Noikoio.RegexBot.Module.ModTools
|
||||||
}
|
}
|
||||||
|
|
||||||
public new Task Log(string text) => base.Log(text);
|
public new Task Log(string text) => base.Log(text);
|
||||||
|
|
||||||
|
private async Task CommandCheckInvoke(SocketMessage arg)
|
||||||
|
{
|
||||||
|
// Disregard if not in a guild
|
||||||
|
SocketGuild g = (arg.Author as SocketGuildUser)?.Guild;
|
||||||
|
if (g == null) return;
|
||||||
|
|
||||||
|
// Get guild config
|
||||||
|
ServerConfig sc = RegexBot.Config.Servers.FirstOrDefault(s => s.Id == g.Id);
|
||||||
|
if (sc == null) return;
|
||||||
|
|
||||||
|
// Disregard if not a bot moderator
|
||||||
|
if (!sc.Moderators.ExistsInList(arg)) return;
|
||||||
|
|
||||||
|
// Disregard if the message contains a newline character
|
||||||
|
if (arg.Content.Contains("\n")) return;
|
||||||
|
|
||||||
|
// Check for and invoke command
|
||||||
|
string cmdchk;
|
||||||
|
int spc = arg.Content.IndexOf(' ');
|
||||||
|
if (spc != -1) cmdchk = arg.Content.Substring(0, spc);
|
||||||
|
else cmdchk = arg.Content;
|
||||||
|
if (((IDictionary<string, CommandBase>)GetConfig(g.Id)).TryGetValue(cmdchk, out var c))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Log($"'{c.Label}' invoked by {arg.Author.ToString()} in {g.Name}/#{arg.Channel.Name}");
|
||||||
|
await c.Invoke(g, arg);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
await Log($"Encountered an error for the command '{c.Label}'. Details follow:");
|
||||||
|
await Log(ex.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue