RegexBot/Module/ModTools/ModTools.cs

84 lines
2.7 KiB
C#
Raw Normal View History

2017-12-03 06:14:00 +00:00
using Discord;
using Discord.WebSocket;
using Newtonsoft.Json.Linq;
using Noikoio.RegexBot.ConfigItem;
using System;
using System.Linq;
using System.Threading.Tasks;
2017-11-12 03:12:24 +00:00
namespace Noikoio.RegexBot.Module.ModTools
{
/// <summary>
2017-12-03 06:14:00 +00:00
/// ModTools module.
/// This class manages reading configuration and creating instances based on it.
/// </summary>
2017-11-12 03:12:24 +00:00
class ModTools : BotModule
{
public override string Name => "ModTools";
public ModTools(DiscordSocketClient client) : base(client)
{
client.MessageReceived += Client_MessageReceived;
}
private async Task Client_MessageReceived(SocketMessage arg)
{
2017-12-10 19:11:37 +00:00
// Always ignore bots
2017-12-08 18:38:40 +00:00
if (arg.Author.IsBot) return;
if (arg.Channel is IGuildChannel) await CommandCheckInvoke(arg);
}
[ConfigSection("ModTools")]
public override async Task<object> ProcessConfiguration(JToken configSection)
{
// Constructor throws exception on config errors
var conf = new ConfigItem(this, configSection);
// Log results
if (conf.Commands.Count > 0)
await Log(conf.Commands.Count + " command definition(s) loaded.");
2017-12-08 18:30:41 +00:00
return conf;
}
private new ConfigItem GetConfig(ulong guildId) => (ConfigItem)base.GetConfig(guildId);
public new Task Log(string text) => base.Log(text);
2017-12-03 06:14:00 +00:00
private async Task CommandCheckInvoke(SocketMessage arg)
{
SocketGuild g = ((SocketGuildUser)arg.Author).Guild;
// 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;
2017-12-03 06:14:00 +00:00
// 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 (GetConfig(g.Id).Commands.TryGetValue(cmdchk, out var c))
{
2017-12-03 06:14:00 +00:00
try
{
2017-12-03 06:14:00 +00:00
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());
}
}
}
}
}