2022-03-29 05:03:01 +00:00
|
|
|
|
using Discord;
|
2022-05-20 00:03:03 +00:00
|
|
|
|
using System.Reflection;
|
|
|
|
|
using System.Text;
|
2022-03-29 05:03:01 +00:00
|
|
|
|
|
|
|
|
|
namespace RegexBot.Services.Logging;
|
|
|
|
|
/// <summary>
|
2022-05-20 00:03:03 +00:00
|
|
|
|
/// Implements program-wide logging.
|
2022-03-29 05:03:01 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
class LoggingService : Service {
|
|
|
|
|
// NOTE: Service.Log's functionality is implemented here. DO NOT use within this class.
|
2022-07-28 21:31:36 +00:00
|
|
|
|
private readonly string _logBasePath;
|
2022-03-29 05:03:01 +00:00
|
|
|
|
|
|
|
|
|
internal LoggingService(RegexbotClient bot) : base(bot) {
|
2022-05-20 00:03:03 +00:00
|
|
|
|
_logBasePath = Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)
|
|
|
|
|
+ Path.DirectorySeparatorChar + "logs";
|
|
|
|
|
try {
|
|
|
|
|
if (!Directory.Exists(_logBasePath)) Directory.CreateDirectory(_logBasePath);
|
|
|
|
|
Directory.GetFiles(_logBasePath);
|
|
|
|
|
} catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) {
|
2022-07-28 21:31:36 +00:00
|
|
|
|
throw new Exception("Cannot create or access logging directory.");
|
2022-05-20 00:03:03 +00:00
|
|
|
|
}
|
2022-03-29 05:03:01 +00:00
|
|
|
|
|
|
|
|
|
bot.DiscordClient.Log += DiscordClient_Log;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Discord.Net logging events handled here.
|
|
|
|
|
/// Only events with high importance are stored. Others are just printed to console.
|
|
|
|
|
/// </summary>
|
|
|
|
|
private Task DiscordClient_Log(LogMessage arg) {
|
2022-05-20 00:03:03 +00:00
|
|
|
|
var msg = $"[{Enum.GetName(typeof(LogSeverity), arg.Severity)}] {arg.Message}";
|
2022-07-28 02:23:49 +00:00
|
|
|
|
if (arg.Exception != null) msg += arg.Exception.ToString();
|
2022-03-29 05:03:01 +00:00
|
|
|
|
|
2022-05-20 00:03:03 +00:00
|
|
|
|
switch (arg.Message) { // Prevent webhook logs for these 'important' Discord.Net messages
|
|
|
|
|
case "Connecting":
|
|
|
|
|
case "Connected":
|
|
|
|
|
case "Ready":
|
|
|
|
|
case "Disconnecting":
|
|
|
|
|
case "Disconnected":
|
|
|
|
|
case "Resumed previous session":
|
|
|
|
|
case "Failed to resume previous session":
|
|
|
|
|
break;
|
|
|
|
|
}
|
2022-07-28 02:23:49 +00:00
|
|
|
|
DoLog("Discord.Net", msg);
|
2022-03-29 05:03:01 +00:00
|
|
|
|
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-28 02:23:49 +00:00
|
|
|
|
// Hooked
|
|
|
|
|
internal void DoLog(string source, string? message) {
|
|
|
|
|
message ??= "(null)";
|
2022-07-28 21:31:36 +00:00
|
|
|
|
var now = DateTimeOffset.Now;
|
2022-05-20 00:03:03 +00:00
|
|
|
|
var output = new StringBuilder();
|
2022-07-28 21:31:36 +00:00
|
|
|
|
var prefix = $"[{now:s}] [{source}] ";
|
2022-03-29 05:03:01 +00:00
|
|
|
|
foreach (var line in message.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None)) {
|
2022-05-20 00:03:03 +00:00
|
|
|
|
output.Append(prefix).AppendLine(line);
|
|
|
|
|
}
|
|
|
|
|
var outstr = output.ToString();
|
|
|
|
|
Console.Write(outstr);
|
2022-07-28 21:31:36 +00:00
|
|
|
|
var filename = _logBasePath + Path.DirectorySeparatorChar + $"{now:yyyy-MM}.log";
|
|
|
|
|
File.AppendAllText(filename, outstr, Encoding.UTF8);
|
2022-03-29 05:03:01 +00:00
|
|
|
|
}
|
|
|
|
|
}
|