Improved logging and minor fixes
This commit is contained in:
parent
0ef78a53dc
commit
e9178bc149
6 changed files with 14 additions and 39 deletions
|
@ -33,26 +33,23 @@ internal class AutoResponder : RegexbotModule {
|
|||
var definitions = GetGuildState<IEnumerable<Definition>>(ch.Guild.Id);
|
||||
if (definitions == null) return; // No configuration in this guild; do no further processing
|
||||
|
||||
var tasks = new List<Task>();
|
||||
foreach (var def in definitions) {
|
||||
tasks.Add(Task.Run(async () => await ProcessMessageAsync(arg, def)));
|
||||
await ProcessMessageAsync(arg, def, ch);
|
||||
}
|
||||
|
||||
await Task.WhenAll(tasks);
|
||||
}
|
||||
|
||||
private async Task ProcessMessageAsync(SocketMessage msg, Definition def) {
|
||||
private async Task ProcessMessageAsync(SocketMessage msg, Definition def, SocketTextChannel ch) {
|
||||
if (!def.Match(msg)) return;
|
||||
|
||||
Log(ch.Guild, $"Definition '{def.Label}' triggered by {msg.Author}.");
|
||||
if (def.Command == null) {
|
||||
await msg.Channel.SendMessageAsync(def.GetResponse());
|
||||
} else {
|
||||
var ch = (SocketGuildChannel)msg.Channel;
|
||||
var cmdline = def.Command.Split(new char[] { ' ' }, 2);
|
||||
|
||||
var ps = new ProcessStartInfo() {
|
||||
FileName = cmdline[0],
|
||||
Arguments = (cmdline.Length == 2 ? cmdline[1] : ""),
|
||||
Arguments = cmdline.Length == 2 ? cmdline[1] : "",
|
||||
UseShellExecute = false, // ???
|
||||
CreateNoWindow = true,
|
||||
RedirectStandardOutput = true
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
using RegexBot.Common;
|
||||
|
||||
namespace RegexBot.Modules.EntryRole;
|
||||
|
||||
/// <summary>
|
||||
/// Contains configuration data as well as per-guild timers for those awaiting role assignment.
|
||||
/// </summary>
|
||||
|
|
|
@ -19,7 +19,7 @@ class Ban : BanKick {
|
|||
await msg.Channel.SendMessageAsync($"{SuccessMessage}\n{result.GetResultString(Module.Bot)}");
|
||||
} else {
|
||||
// TODO custom fail message?
|
||||
await msg.Channel.SendMessageAsync(SuccessMessage);
|
||||
await msg.Channel.SendMessageAsync(result.GetResultString(Module.Bot));
|
||||
}
|
||||
} else {
|
||||
await msg.Channel.SendMessageAsync(result.GetResultString(Module.Bot));
|
||||
|
|
|
@ -41,9 +41,9 @@ internal class ModCommands : RegexbotModule {
|
|||
if (cfg.Commands.TryGetValue(cmdchk, out var c)) {
|
||||
try {
|
||||
await c.Invoke(g, arg);
|
||||
Log($"[{g.Name}] {c.Command} invoked by {arg.Author} in #{arg.Channel.Name}.");
|
||||
Log(g, $"{c.Command} invoked by {arg.Author} in #{arg.Channel.Name}.");
|
||||
} catch (Exception ex) {
|
||||
Log($"Unhandled exception while processing '{c.Label}':\n" + ex.ToString());
|
||||
Log(g, $"Unhandled exception while processing '{c.Label}':\n" + ex.ToString());
|
||||
await arg.Channel.SendMessageAsync($":x: An error occurred during processing ({ex.GetType().FullName}). " +
|
||||
"Check the console for details.");
|
||||
}
|
||||
|
|
|
@ -46,29 +46,15 @@ internal class RegexModerator : RegexbotModule {
|
|||
var defs = GetGuildState<IEnumerable<ConfDefinition>>(ch.Guild.Id);
|
||||
if (defs == null) return;
|
||||
|
||||
// Send further processing to thread pool.
|
||||
// Match checking is a CPU-intensive task, thus very little checking is done here.
|
||||
var msgProcessingTasks = new List<Task>();
|
||||
// Matching and response processing
|
||||
foreach (var item in defs) {
|
||||
// Need to check sender's moderator status here. Definition can't access mod list.
|
||||
var isMod = GetModerators(ch.Guild.Id).IsListMatch(msg, true);
|
||||
|
||||
var match = item.IsMatch(msg, isMod);
|
||||
msgProcessingTasks.Add(Task.Run(async () => await ProcessMessage(item, ch.Guild, msg, isMod)));
|
||||
if (!item.IsMatch(msg, isMod)) continue;
|
||||
Log(ch.Guild, $"Rule '{item.Label}' triggered by {msg.Author}.");
|
||||
var exec = new ResponseExecutor(item, Bot, msg, (string logLine) => Log(ch.Guild, logLine));
|
||||
await exec.Execute();
|
||||
}
|
||||
await Task.WhenAll(msgProcessingTasks);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Does further message checking and response execution.
|
||||
/// Invocations of this method are meant to be placed onto a thread separate from the caller.
|
||||
/// </summary>
|
||||
private async Task ProcessMessage(ConfDefinition def, SocketGuild g, SocketMessage msg, bool isMod) {
|
||||
if (!def.IsMatch(msg, isMod)) return;
|
||||
|
||||
// TODO logging options for match result; handle here?
|
||||
|
||||
var executor = new ResponseExecutor(def, Bot, msg, (string logLine) => Log(g, logLine));
|
||||
await executor.Execute();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,7 +22,8 @@ class ModuleStateService : Service {
|
|||
}
|
||||
|
||||
private async Task RefreshGuildState(SocketGuild arg) {
|
||||
if (await ProcessConfiguration(arg)) Log($"Configuration refreshed for '{arg.Name}'.");
|
||||
if (await ProcessConfiguration(arg)) Log($"'{arg.Name}': Configuration refreshed.");
|
||||
else Log($"'{arg.Name}': Configuration refresh failed. Retaining existing configuration and state, if any.");
|
||||
}
|
||||
|
||||
private Task RemoveGuildData(SocketGuild arg) {
|
||||
|
@ -52,14 +53,6 @@ class ModuleStateService : Service {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configuration is loaded from database, and appropriate sections dispatched to their
|
||||
/// respective methods for further processing.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This takes an all-or-nothing approach. Should there be a single issue in processing
|
||||
/// configuration, all existing state data is kept.
|
||||
/// </remarks>
|
||||
private async Task<bool> ProcessConfiguration(SocketGuild guild) {
|
||||
var jstr = await LoadConfigFile(guild);
|
||||
JObject guildConf;
|
||||
|
|
Loading…
Reference in a new issue