/
LogService.cs
70 lines (60 loc) · 2.25 KB
/
LogService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Discord;
using Discord.Commands;
using Discord.WebSocket;
namespace DiscordBot.Services
{
public class LogService
{
private readonly DiscordSocketClient _discord;
private readonly CommandService _commands;
private readonly ILoggerFactory _loggerFactory;
private readonly ILogger _discordLogger;
private readonly ILogger _commandsLogger;
public LogService(DiscordSocketClient discord, CommandService commands, ILoggerFactory loggerFactory)
{
_discord = discord;
_commands = commands;
_loggerFactory = ConfigureLogging(loggerFactory);
_discordLogger = _loggerFactory.CreateLogger("discord");
_commandsLogger = _loggerFactory.CreateLogger("commands");
_discord.Log += LogDiscord;
_commands.Log += LogCommand;
}
private ILoggerFactory ConfigureLogging(ILoggerFactory factory)
{
factory.AddConsole();
return factory;
}
private Task LogDiscord(LogMessage message)
{
_discordLogger.Log(
LogLevelFromSeverity(message.Severity),
0,
message,
message.Exception,
(_1, _2) => message.ToString(prependTimestamp: false));
return Task.CompletedTask;
}
private Task LogCommand(LogMessage message)
{
// Return an error message for async commands
if (message.Exception is CommandException command)
{
// Don't risk blocking the logging task by awaiting a message send; ratelimits!?
var _ = command.Context.Channel.SendMessageAsync($"Error: {command.Message}");
}
_commandsLogger.Log(
LogLevelFromSeverity(message.Severity),
0,
message,
message.Exception,
(_1, _2) => message.ToString(prependTimestamp: false));
return Task.CompletedTask;
}
private static LogLevel LogLevelFromSeverity(LogSeverity severity)
=> (LogLevel)(Math.Abs((int)severity - 5));
}
}