Update to D#+ 4.0.0-rc1
This commit is contained in:
parent
90b2fcfdd4
commit
634173e205
@ -9,8 +9,6 @@ using App.Metrics;
|
|||||||
|
|
||||||
using Autofac;
|
using Autofac;
|
||||||
|
|
||||||
using Dapper;
|
|
||||||
|
|
||||||
using DSharpPlus;
|
using DSharpPlus;
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
using DSharpPlus.EventArgs;
|
using DSharpPlus.EventArgs;
|
||||||
@ -24,7 +22,6 @@ using Sentry;
|
|||||||
|
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using Serilog.Context;
|
using Serilog.Context;
|
||||||
using Serilog.Events;
|
|
||||||
|
|
||||||
namespace PluralKit.Bot
|
namespace PluralKit.Bot
|
||||||
{
|
{
|
||||||
@ -55,9 +52,6 @@ namespace PluralKit.Bot
|
|||||||
|
|
||||||
public void Init()
|
public void Init()
|
||||||
{
|
{
|
||||||
// Attach the handlers we need
|
|
||||||
_client.DebugLogger.LogMessageReceived += FrameworkLog;
|
|
||||||
|
|
||||||
// HandleEvent takes a type parameter, automatically inferred by the event type
|
// HandleEvent takes a type parameter, automatically inferred by the event type
|
||||||
// It will then look up an IEventHandler<TypeOfEvent> in the DI container and call that object's handler method
|
// It will then look up an IEventHandler<TypeOfEvent> in the DI container and call that object's handler method
|
||||||
// For registering new ones, see Modules.cs
|
// For registering new ones, see Modules.cs
|
||||||
@ -68,12 +62,12 @@ namespace PluralKit.Bot
|
|||||||
_client.MessageReactionAdded += HandleEvent;
|
_client.MessageReactionAdded += HandleEvent;
|
||||||
|
|
||||||
// Update shard status for shards immediately on connect
|
// Update shard status for shards immediately on connect
|
||||||
_client.Ready += args =>
|
_client.Ready += (client, _) =>
|
||||||
{
|
{
|
||||||
_hasReceivedReady = true;
|
_hasReceivedReady = true;
|
||||||
return UpdateBotStatus(args.Client);
|
return UpdateBotStatus(client);
|
||||||
};
|
};
|
||||||
_client.Resumed += args => UpdateBotStatus(args.Client);
|
_client.Resumed += (client, _) => UpdateBotStatus(client);
|
||||||
|
|
||||||
// Init the shard stuff
|
// Init the shard stuff
|
||||||
_services.Resolve<ShardInfoService>().Init();
|
_services.Resolve<ShardInfoService>().Init();
|
||||||
@ -101,7 +95,7 @@ namespace PluralKit.Bot
|
|||||||
await _client.UpdateStatusAsync(new DiscordActivity("Restarting... (please wait)"), UserStatus.Idle);
|
await _client.UpdateStatusAsync(new DiscordActivity("Restarting... (please wait)"), UserStatus.Idle);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task HandleEvent<T>(T evt) where T: DiscordEventArgs
|
private Task HandleEvent<T>(DiscordClient shard, T evt) where T: DiscordEventArgs
|
||||||
{
|
{
|
||||||
// We don't want to stall the event pipeline, so we'll "fork" inside here
|
// We don't want to stall the event pipeline, so we'll "fork" inside here
|
||||||
var _ = HandleEventInner();
|
var _ = HandleEventInner();
|
||||||
@ -118,7 +112,7 @@ namespace PluralKit.Bot
|
|||||||
|
|
||||||
// Also, find a Sentry enricher for the event type (if one is present), and ask it to put some event data in the Sentry scope
|
// Also, find a Sentry enricher for the event type (if one is present), and ask it to put some event data in the Sentry scope
|
||||||
var sentryEnricher = serviceScope.ResolveOptional<ISentryEnricher<T>>();
|
var sentryEnricher = serviceScope.ResolveOptional<ISentryEnricher<T>>();
|
||||||
sentryEnricher?.Enrich(serviceScope.Resolve<Scope>(), evt);
|
sentryEnricher?.Enrich(serviceScope.Resolve<Scope>(), shard, evt);
|
||||||
|
|
||||||
// Find an event handler that can handle the type of event (<T>) we're given
|
// Find an event handler that can handle the type of event (<T>) we're given
|
||||||
var handler = serviceScope.Resolve<IEventHandler<T>>();
|
var handler = serviceScope.Resolve<IEventHandler<T>>();
|
||||||
@ -129,7 +123,7 @@ namespace PluralKit.Bot
|
|||||||
// the TryHandle call returns true if it's handled the event
|
// the TryHandle call returns true if it's handled the event
|
||||||
// Usually it won't, so just pass it on to the main handler
|
// Usually it won't, so just pass it on to the main handler
|
||||||
if (queue == null || !await queue.TryHandle(evt))
|
if (queue == null || !await queue.TryHandle(evt))
|
||||||
await handler.Handle(evt);
|
await handler.Handle(shard, evt);
|
||||||
}
|
}
|
||||||
catch (Exception exc)
|
catch (Exception exc)
|
||||||
{
|
{
|
||||||
@ -209,23 +203,5 @@ namespace PluralKit.Bot
|
|||||||
}
|
}
|
||||||
catch (WebSocketException) { }
|
catch (WebSocketException) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FrameworkLog(object sender, DebugLogMessageEventArgs args)
|
|
||||||
{
|
|
||||||
// Bridge D#+ logging to Serilog
|
|
||||||
LogEventLevel level = LogEventLevel.Verbose;
|
|
||||||
if (args.Level == LogLevel.Critical)
|
|
||||||
level = LogEventLevel.Fatal;
|
|
||||||
else if (args.Level == LogLevel.Debug)
|
|
||||||
level = LogEventLevel.Debug;
|
|
||||||
else if (args.Level == LogLevel.Error)
|
|
||||||
level = LogEventLevel.Error;
|
|
||||||
else if (args.Level == LogLevel.Info)
|
|
||||||
level = LogEventLevel.Information;
|
|
||||||
else if (args.Level == LogLevel.Warning)
|
|
||||||
level = LogEventLevel.Warning;
|
|
||||||
|
|
||||||
_logger.Write(level, args.Exception, "D#+ {Source}: {Message}", args.Application, args.Message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,6 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using DSharpPlus;
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
using DSharpPlus.EventArgs;
|
using DSharpPlus.EventArgs;
|
||||||
|
|
||||||
@ -7,7 +8,7 @@ namespace PluralKit.Bot
|
|||||||
{
|
{
|
||||||
public interface IEventHandler<in T> where T: DiscordEventArgs
|
public interface IEventHandler<in T> where T: DiscordEventArgs
|
||||||
{
|
{
|
||||||
Task Handle(T evt);
|
Task Handle(DiscordClient shard, T evt);
|
||||||
|
|
||||||
DiscordChannel ErrorChannelFor(T evt) => null;
|
DiscordChannel ErrorChannelFor(T evt) => null;
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ namespace PluralKit.Bot
|
|||||||
// We consider a message duplicate if it has the same ID as the previous message that hit the gateway
|
// We consider a message duplicate if it has the same ID as the previous message that hit the gateway
|
||||||
_lastMessageCache.GetLastMessage(evt.ChannelId) == evt.Id;
|
_lastMessageCache.GetLastMessage(evt.ChannelId) == evt.Id;
|
||||||
|
|
||||||
public async Task Handle(MessageCreateEventArgs evt)
|
public async Task Handle(DiscordClient shard, MessageCreateEventArgs evt)
|
||||||
{
|
{
|
||||||
if (evt.Author?.Id == _client.CurrentUser?.Id) return;
|
if (evt.Author?.Id == _client.CurrentUser?.Id) return;
|
||||||
if (evt.Message.MessageType != MessageType.Default) return;
|
if (evt.Message.MessageType != MessageType.Default) return;
|
||||||
@ -71,7 +71,7 @@ namespace PluralKit.Bot
|
|||||||
// Only do command/proxy handling if it's a user account
|
// Only do command/proxy handling if it's a user account
|
||||||
if (evt.Message.Author.IsBot || evt.Message.WebhookMessage || evt.Message.Author.IsSystem == true)
|
if (evt.Message.Author.IsBot || evt.Message.WebhookMessage || evt.Message.Author.IsSystem == true)
|
||||||
return;
|
return;
|
||||||
if (await TryHandleCommand(evt, ctx))
|
if (await TryHandleCommand(shard, evt, ctx))
|
||||||
return;
|
return;
|
||||||
await TryHandleProxy(evt, ctx);
|
await TryHandleProxy(evt, ctx);
|
||||||
}
|
}
|
||||||
@ -85,7 +85,7 @@ namespace PluralKit.Bot
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async ValueTask<bool> TryHandleCommand(MessageCreateEventArgs evt, MessageContext ctx)
|
private async ValueTask<bool> TryHandleCommand(DiscordClient shard, MessageCreateEventArgs evt, MessageContext ctx)
|
||||||
{
|
{
|
||||||
var content = evt.Message.Content;
|
var content = evt.Message.Content;
|
||||||
if (content == null) return false;
|
if (content == null) return false;
|
||||||
@ -102,7 +102,7 @@ namespace PluralKit.Bot
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var system = ctx.SystemId != null ? await _db.Execute(c => _repo.GetSystem(c, ctx.SystemId.Value)) : null;
|
var system = ctx.SystemId != null ? await _db.Execute(c => _repo.GetSystem(c, ctx.SystemId.Value)) : null;
|
||||||
await _tree.ExecuteCommand(new Context(_services, evt.Client, evt.Message, cmdStart, system, ctx));
|
await _tree.ExecuteCommand(new Context(_services, shard, evt.Message, cmdStart, system, ctx));
|
||||||
}
|
}
|
||||||
catch (PKError)
|
catch (PKError)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using DSharpPlus;
|
||||||
using DSharpPlus.EventArgs;
|
using DSharpPlus.EventArgs;
|
||||||
|
|
||||||
using PluralKit.Core;
|
using PluralKit.Core;
|
||||||
@ -23,14 +24,14 @@ namespace PluralKit.Bot
|
|||||||
_logger = logger.ForContext<MessageDeleted>();
|
_logger = logger.ForContext<MessageDeleted>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Handle(MessageDeleteEventArgs evt)
|
public async Task Handle(DiscordClient shard, MessageDeleteEventArgs evt)
|
||||||
{
|
{
|
||||||
// Delete deleted webhook messages from the data store
|
// Delete deleted webhook messages from the data store
|
||||||
// Most of the data in the given message is wrong/missing, so always delete just to be sure.
|
// Most of the data in the given message is wrong/missing, so always delete just to be sure.
|
||||||
await _db.Execute(c => _repo.DeleteMessage(c, evt.Message.Id));
|
await _db.Execute(c => _repo.DeleteMessage(c, evt.Message.Id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Handle(MessageBulkDeleteEventArgs evt)
|
public async Task Handle(DiscordClient shard, MessageBulkDeleteEventArgs evt)
|
||||||
{
|
{
|
||||||
// Same as above, but bulk
|
// Same as above, but bulk
|
||||||
_logger.Information("Bulk deleting {Count} messages in channel {Channel}", evt.Messages.Count, evt.Channel.Id);
|
_logger.Information("Bulk deleting {Count} messages in channel {Channel}", evt.Messages.Count, evt.Channel.Id);
|
||||||
|
@ -29,7 +29,7 @@ namespace PluralKit.Bot
|
|||||||
_client = client;
|
_client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Handle(MessageUpdateEventArgs evt)
|
public async Task Handle(DiscordClient shard, MessageUpdateEventArgs evt)
|
||||||
{
|
{
|
||||||
if (evt.Author?.Id == _client.CurrentUser?.Id) return;
|
if (evt.Author?.Id == _client.CurrentUser?.Id) return;
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using DSharpPlus;
|
using DSharpPlus;
|
||||||
@ -29,18 +28,18 @@ namespace PluralKit.Bot
|
|||||||
_logger = logger.ForContext<ReactionAdded>();
|
_logger = logger.ForContext<ReactionAdded>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Handle(MessageReactionAddEventArgs evt)
|
public async Task Handle(DiscordClient shard, MessageReactionAddEventArgs evt)
|
||||||
{
|
{
|
||||||
await TryHandleProxyMessageReactions(evt);
|
await TryHandleProxyMessageReactions(shard, evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async ValueTask TryHandleProxyMessageReactions(MessageReactionAddEventArgs evt)
|
private async ValueTask TryHandleProxyMessageReactions(DiscordClient shard, MessageReactionAddEventArgs evt)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Sometimes we get events from users that aren't in the user cache
|
// Sometimes we get events from users that aren't in the user cache
|
||||||
// In that case we get a "broken" user object (where eg. calling IsBot throws an exception)
|
// In that case we get a "broken" user object (where eg. calling IsBot throws an exception)
|
||||||
// We just ignore all of those for now, should be quite rare...
|
// We just ignore all of those for now, should be quite rare...
|
||||||
if (!evt.Client.TryGetCachedUser(evt.User.Id, out _)) return;
|
if (!shard.TryGetCachedUser(evt.User.Id, out _)) return;
|
||||||
|
|
||||||
// check if it's a command message first
|
// check if it's a command message first
|
||||||
// since this can happen in DMs as well
|
// since this can happen in DMs as well
|
||||||
@ -79,7 +78,7 @@ namespace PluralKit.Bot
|
|||||||
await using var conn = await _db.Obtain();
|
await using var conn = await _db.Obtain();
|
||||||
var msg = await _repo.GetMessage(conn, evt.Message.Id);
|
var msg = await _repo.GetMessage(conn, evt.Message.Id);
|
||||||
if (msg != null)
|
if (msg != null)
|
||||||
await HandleQueryReaction(evt, msg);
|
await HandleQueryReaction(shard, evt, msg);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -139,14 +138,14 @@ namespace PluralKit.Bot
|
|||||||
// No need to delete database row here, it'll get deleted by the once-per-minute scheduled task.
|
// No need to delete database row here, it'll get deleted by the once-per-minute scheduled task.
|
||||||
}
|
}
|
||||||
|
|
||||||
private async ValueTask HandleQueryReaction(MessageReactionAddEventArgs evt, FullMessage msg)
|
private async ValueTask HandleQueryReaction(DiscordClient shard, MessageReactionAddEventArgs evt, FullMessage msg)
|
||||||
{
|
{
|
||||||
// Try to DM the user info about the message
|
// Try to DM the user info about the message
|
||||||
var member = await evt.Guild.GetMember(evt.User.Id);
|
var member = await evt.Guild.GetMember(evt.User.Id);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await member.SendMessageAsync(embed: await _embeds.CreateMemberEmbed(msg.System, msg.Member, evt.Guild, LookupContext.ByNonOwner));
|
await member.SendMessageAsync(embed: await _embeds.CreateMemberEmbed(msg.System, msg.Member, evt.Guild, LookupContext.ByNonOwner));
|
||||||
await member.SendMessageAsync(embed: await _embeds.CreateMessageInfoEmbed(evt.Client, msg));
|
await member.SendMessageAsync(embed: await _embeds.CreateMessageInfoEmbed(shard, msg));
|
||||||
}
|
}
|
||||||
catch (UnauthorizedException) { } // No permissions to DM, can't check for this :(
|
catch (UnauthorizedException) { } // No permissions to DM, can't check for this :(
|
||||||
|
|
||||||
|
@ -24,7 +24,8 @@ namespace PluralKit.Bot
|
|||||||
Token = c.Resolve<BotConfig>().Token,
|
Token = c.Resolve<BotConfig>().Token,
|
||||||
TokenType = TokenType.Bot,
|
TokenType = TokenType.Bot,
|
||||||
MessageCacheSize = 0,
|
MessageCacheSize = 0,
|
||||||
LargeThreshold = 50
|
LargeThreshold = 50,
|
||||||
|
LoggerFactory = c.Resolve<Microsoft.Extensions.Logging.ILoggerFactory>()
|
||||||
}).AsSelf();
|
}).AsSelf();
|
||||||
builder.Register(c => new DiscordShardedClient(c.Resolve<DiscordConfiguration>())).AsSelf().SingleInstance();
|
builder.Register(c => new DiscordShardedClient(c.Resolve<DiscordConfiguration>())).AsSelf().SingleInstance();
|
||||||
builder.Register(c => new DiscordRestClient(c.Resolve<DiscordConfiguration>())).AsSelf().SingleInstance();
|
builder.Register(c => new DiscordRestClient(c.Resolve<DiscordConfiguration>())).AsSelf().SingleInstance();
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DSharpPlus" Version="4.0.0-nightly-00712" />
|
<PackageReference Include="DSharpPlus" Version="4.0.0-rc1" />
|
||||||
<PackageReference Include="DSharpPlus.Rest" Version="4.0.0-nightly-00712" />
|
<PackageReference Include="DSharpPlus.Rest" Version="4.0.0-rc1" />
|
||||||
<PackageReference Include="Humanizer.Core" Version="2.7.9" />
|
<PackageReference Include="Humanizer.Core" Version="2.7.9" />
|
||||||
<PackageReference Include="Sentry" Version="2.1.4" />
|
<PackageReference Include="Sentry" Version="2.1.4" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-beta0007" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-beta0007" />
|
||||||
|
@ -42,7 +42,7 @@ namespace PluralKit.Bot
|
|||||||
{
|
{
|
||||||
// We initialize this before any shards are actually created and connected
|
// We initialize this before any shards are actually created and connected
|
||||||
// This means the client won't know the shard count, so we attach a listener every time a shard gets connected
|
// This means the client won't know the shard count, so we attach a listener every time a shard gets connected
|
||||||
_client.SocketOpened += RefreshShardList;
|
_client.SocketOpened += (_, __) => RefreshShardList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReportShardStatus()
|
private void ReportShardStatus()
|
||||||
@ -66,8 +66,8 @@ namespace PluralKit.Bot
|
|||||||
|
|
||||||
|
|
||||||
// Call our own SocketOpened listener manually (and then attach the listener properly)
|
// Call our own SocketOpened listener manually (and then attach the listener properly)
|
||||||
await SocketOpened(shard);
|
await SocketOpened(shard, null);
|
||||||
shard.SocketOpened += () => SocketOpened(shard);
|
shard.SocketOpened += SocketOpened;
|
||||||
|
|
||||||
// Register listeners for new shards
|
// Register listeners for new shards
|
||||||
_logger.Information("Attaching listeners to new shard #{Shard}", shard.ShardId);
|
_logger.Information("Attaching listeners to new shard #{Shard}", shard.ShardId);
|
||||||
@ -81,11 +81,11 @@ namespace PluralKit.Bot
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task SocketOpened(DiscordClient e)
|
private Task SocketOpened(DiscordClient shard, SocketEventArgs _)
|
||||||
{
|
{
|
||||||
// We do nothing else here, since this kinda doesn't mean *much*? It's only really started once we get Ready/Resumed
|
// We do nothing else here, since this kinda doesn't mean *much*? It's only really started once we get Ready/Resumed
|
||||||
// And it doesn't get fired first time around since we don't have time to add the event listener before it's fired'
|
// And it doesn't get fired first time around since we don't have time to add the event listener before it's fired'
|
||||||
_logger.Information("Shard #{Shard} opened socket", e.ShardId);
|
_logger.Information("Shard #{Shard} opened socket", shard.ShardId);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,45 +99,45 @@ namespace PluralKit.Bot
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task Resumed(ReadyEventArgs e)
|
private Task Resumed(DiscordClient shard, ReadyEventArgs e)
|
||||||
{
|
{
|
||||||
_logger.Information("Shard #{Shard} resumed connection", e.Client.ShardId);
|
_logger.Information("Shard #{Shard} resumed connection", shard.ShardId);
|
||||||
|
|
||||||
var info = TryGetShard(e.Client);
|
var info = TryGetShard(shard);
|
||||||
// info.LastConnectionTime = SystemClock.Instance.GetCurrentInstant();
|
// info.LastConnectionTime = SystemClock.Instance.GetCurrentInstant();
|
||||||
info.Connected = true;
|
info.Connected = true;
|
||||||
ReportShardStatus();
|
ReportShardStatus();
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task Ready(ReadyEventArgs e)
|
private Task Ready(DiscordClient shard, ReadyEventArgs e)
|
||||||
{
|
{
|
||||||
_logger.Information("Shard #{Shard} sent Ready event", e.Client.ShardId);
|
_logger.Information("Shard #{Shard} sent Ready event", shard.ShardId);
|
||||||
|
|
||||||
var info = TryGetShard(e.Client);
|
var info = TryGetShard(shard);
|
||||||
info.LastConnectionTime = SystemClock.Instance.GetCurrentInstant();
|
info.LastConnectionTime = SystemClock.Instance.GetCurrentInstant();
|
||||||
info.Connected = true;
|
info.Connected = true;
|
||||||
ReportShardStatus();
|
ReportShardStatus();
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task SocketClosed(SocketCloseEventArgs e)
|
private Task SocketClosed(DiscordClient shard, SocketCloseEventArgs e)
|
||||||
{
|
{
|
||||||
_logger.Warning("Shard #{Shard} disconnected ({CloseCode}: {CloseMessage})", e.Client.ShardId, e.CloseCode, e.CloseMessage);
|
_logger.Warning("Shard #{Shard} disconnected ({CloseCode}: {CloseMessage})", shard.ShardId, e.CloseCode, e.CloseMessage);
|
||||||
|
|
||||||
var info = TryGetShard(e.Client);
|
var info = TryGetShard(shard);
|
||||||
info.DisconnectionCount++;
|
info.DisconnectionCount++;
|
||||||
info.Connected = false;
|
info.Connected = false;
|
||||||
ReportShardStatus();
|
ReportShardStatus();
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task Heartbeated(HeartbeatEventArgs e)
|
private Task Heartbeated(DiscordClient shard, HeartbeatEventArgs e)
|
||||||
{
|
{
|
||||||
var latency = Duration.FromMilliseconds(e.Ping);
|
var latency = Duration.FromMilliseconds(e.Ping);
|
||||||
_logger.Information("Shard #{Shard} received heartbeat (latency: {Latency} ms)", e.Client.ShardId, latency.Milliseconds);
|
_logger.Information("Shard #{Shard} received heartbeat (latency: {Latency} ms)", shard.ShardId, latency.Milliseconds);
|
||||||
|
|
||||||
var info = TryGetShard(e.Client);
|
var info = TryGetShard(shard);
|
||||||
info.LastHeartbeatTime = e.Timestamp.ToInstant();
|
info.LastHeartbeatTime = e.Timestamp.ToInstant();
|
||||||
info.Connected = true;
|
info.Connected = true;
|
||||||
info.ShardLatency = latency;
|
info.ShardLatency = latency;
|
||||||
|
@ -48,7 +48,8 @@ namespace PluralKit.Bot
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Want shard last, just for visual reasons
|
// Want shard last, just for visual reasons
|
||||||
props.Add(new LogEventProperty("Shard", new ScalarValue(dea.Client.ShardId)));
|
// TODO: D#+ update means we can't pull shard ID out of this, what do?
|
||||||
|
// props.Add(new LogEventProperty("Shard", new ScalarValue(dea.Client.ShardId)));
|
||||||
|
|
||||||
result = new StructureValue(props);
|
result = new StructureValue(props);
|
||||||
return true;
|
return true;
|
||||||
|
@ -79,7 +79,7 @@ namespace PluralKit.Bot {
|
|||||||
|
|
||||||
public static async Task<MessageReactionAddEventArgs> AwaitReaction(this Context ctx, DiscordMessage message, DiscordUser user = null, Func<MessageReactionAddEventArgs, bool> predicate = null, TimeSpan? timeout = null) {
|
public static async Task<MessageReactionAddEventArgs> AwaitReaction(this Context ctx, DiscordMessage message, DiscordUser user = null, Func<MessageReactionAddEventArgs, bool> predicate = null, TimeSpan? timeout = null) {
|
||||||
var tcs = new TaskCompletionSource<MessageReactionAddEventArgs>();
|
var tcs = new TaskCompletionSource<MessageReactionAddEventArgs>();
|
||||||
Task Inner(MessageReactionAddEventArgs args) {
|
Task Inner(DiscordClient _, MessageReactionAddEventArgs args) {
|
||||||
if (message.Id != args.Message.Id) return Task.CompletedTask; // Ignore reactions for different messages
|
if (message.Id != args.Message.Id) return Task.CompletedTask; // Ignore reactions for different messages
|
||||||
if (user != null && user.Id != args.User.Id) return Task.CompletedTask; // Ignore messages from other users if a user was defined
|
if (user != null && user.Id != args.User.Id) return Task.CompletedTask; // Ignore messages from other users if a user was defined
|
||||||
if (predicate != null && !predicate.Invoke(args)) return Task.CompletedTask; // Check predicate
|
if (predicate != null && !predicate.Invoke(args)) return Task.CompletedTask; // Check predicate
|
||||||
|
@ -10,7 +10,7 @@ namespace PluralKit.Bot
|
|||||||
{
|
{
|
||||||
public interface ISentryEnricher<T> where T: DiscordEventArgs
|
public interface ISentryEnricher<T> where T: DiscordEventArgs
|
||||||
{
|
{
|
||||||
void Enrich(Scope scope, T evt);
|
void Enrich(Scope scope, DiscordClient shard, T evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SentryEnricher:
|
public class SentryEnricher:
|
||||||
@ -23,7 +23,7 @@ namespace PluralKit.Bot
|
|||||||
// TODO: should this class take the Scope by dependency injection instead?
|
// TODO: should this class take the Scope by dependency injection instead?
|
||||||
// Would allow us to create a centralized "chain of handlers" where this class could just be registered as an entry in
|
// Would allow us to create a centralized "chain of handlers" where this class could just be registered as an entry in
|
||||||
|
|
||||||
public void Enrich(Scope scope, MessageCreateEventArgs evt)
|
public void Enrich(Scope scope, DiscordClient shard, MessageCreateEventArgs evt)
|
||||||
{
|
{
|
||||||
scope.AddBreadcrumb(evt.Message.Content, "event.message", data: new Dictionary<string, string>
|
scope.AddBreadcrumb(evt.Message.Content, "event.message", data: new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
@ -32,7 +32,7 @@ namespace PluralKit.Bot
|
|||||||
{"guild", evt.Channel.GuildId.ToString()},
|
{"guild", evt.Channel.GuildId.ToString()},
|
||||||
{"message", evt.Message.Id.ToString()},
|
{"message", evt.Message.Id.ToString()},
|
||||||
});
|
});
|
||||||
scope.SetTag("shard", evt.Client.ShardId.ToString());
|
scope.SetTag("shard", shard.ShardId.ToString());
|
||||||
|
|
||||||
// Also report information about the bot's permissions in the channel
|
// Also report information about the bot's permissions in the channel
|
||||||
// We get a lot of permission errors so this'll be useful for determining problems
|
// We get a lot of permission errors so this'll be useful for determining problems
|
||||||
@ -40,7 +40,7 @@ namespace PluralKit.Bot
|
|||||||
scope.AddBreadcrumb(perms.ToPermissionString(), "permissions");
|
scope.AddBreadcrumb(perms.ToPermissionString(), "permissions");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Enrich(Scope scope, MessageDeleteEventArgs evt)
|
public void Enrich(Scope scope, DiscordClient shard, MessageDeleteEventArgs evt)
|
||||||
{
|
{
|
||||||
scope.AddBreadcrumb("", "event.messageDelete",
|
scope.AddBreadcrumb("", "event.messageDelete",
|
||||||
data: new Dictionary<string, string>()
|
data: new Dictionary<string, string>()
|
||||||
@ -49,10 +49,10 @@ namespace PluralKit.Bot
|
|||||||
{"guild", evt.Channel.GuildId.ToString()},
|
{"guild", evt.Channel.GuildId.ToString()},
|
||||||
{"message", evt.Message.Id.ToString()},
|
{"message", evt.Message.Id.ToString()},
|
||||||
});
|
});
|
||||||
scope.SetTag("shard", evt.Client.ShardId.ToString());
|
scope.SetTag("shard", shard.ShardId.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Enrich(Scope scope, MessageUpdateEventArgs evt)
|
public void Enrich(Scope scope, DiscordClient shard, MessageUpdateEventArgs evt)
|
||||||
{
|
{
|
||||||
scope.AddBreadcrumb(evt.Message.Content ?? "<unknown>", "event.messageEdit",
|
scope.AddBreadcrumb(evt.Message.Content ?? "<unknown>", "event.messageEdit",
|
||||||
data: new Dictionary<string, string>()
|
data: new Dictionary<string, string>()
|
||||||
@ -61,10 +61,10 @@ namespace PluralKit.Bot
|
|||||||
{"guild", evt.Channel.GuildId.ToString()},
|
{"guild", evt.Channel.GuildId.ToString()},
|
||||||
{"message", evt.Message.Id.ToString()}
|
{"message", evt.Message.Id.ToString()}
|
||||||
});
|
});
|
||||||
scope.SetTag("shard", evt.Client.ShardId.ToString());
|
scope.SetTag("shard", shard.ShardId.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Enrich(Scope scope, MessageBulkDeleteEventArgs evt)
|
public void Enrich(Scope scope, DiscordClient shard, MessageBulkDeleteEventArgs evt)
|
||||||
{
|
{
|
||||||
scope.AddBreadcrumb("", "event.messageDelete",
|
scope.AddBreadcrumb("", "event.messageDelete",
|
||||||
data: new Dictionary<string, string>()
|
data: new Dictionary<string, string>()
|
||||||
@ -73,10 +73,10 @@ namespace PluralKit.Bot
|
|||||||
{"guild", evt.Channel.Id.ToString()},
|
{"guild", evt.Channel.Id.ToString()},
|
||||||
{"messages", string.Join(",", evt.Messages.Select(m => m.Id))},
|
{"messages", string.Join(",", evt.Messages.Select(m => m.Id))},
|
||||||
});
|
});
|
||||||
scope.SetTag("shard", evt.Client.ShardId.ToString());
|
scope.SetTag("shard", shard.ShardId.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Enrich(Scope scope, MessageReactionAddEventArgs evt)
|
public void Enrich(Scope scope, DiscordClient shard, MessageReactionAddEventArgs evt)
|
||||||
{
|
{
|
||||||
scope.AddBreadcrumb("", "event.reaction",
|
scope.AddBreadcrumb("", "event.reaction",
|
||||||
data: new Dictionary<string, string>()
|
data: new Dictionary<string, string>()
|
||||||
@ -87,7 +87,7 @@ namespace PluralKit.Bot
|
|||||||
{"message", evt.Message.Id.ToString()},
|
{"message", evt.Message.Id.ToString()},
|
||||||
{"reaction", evt.Emoji.Name}
|
{"reaction", evt.Emoji.Name}
|
||||||
});
|
});
|
||||||
scope.SetTag("shard", evt.Client.ShardId.ToString());
|
scope.SetTag("shard", shard.ShardId.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -99,6 +99,10 @@ namespace PluralKit.Core
|
|||||||
// AutoActivate ensures logging is enabled as early as possible in the API startup flow
|
// AutoActivate ensures logging is enabled as early as possible in the API startup flow
|
||||||
// since we set the Log.Logger global >.>
|
// since we set the Log.Logger global >.>
|
||||||
.AutoActivate();
|
.AutoActivate();
|
||||||
|
|
||||||
|
builder.Register(c => new Microsoft.Extensions.Logging.LoggerFactory().AddSerilog(c.Resolve<ILogger>()))
|
||||||
|
.As<Microsoft.Extensions.Logging.ILoggerFactory>()
|
||||||
|
.SingleInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ILogger InitLogger(CoreConfig config)
|
private ILogger InitLogger(CoreConfig config)
|
||||||
@ -111,9 +115,10 @@ namespace PluralKit.Core
|
|||||||
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
|
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
|
||||||
.Enrich.WithProperty("Component", _component)
|
.Enrich.WithProperty("Component", _component)
|
||||||
.MinimumLevel.Is(config.ConsoleLogLevel)
|
.MinimumLevel.Is(config.ConsoleLogLevel)
|
||||||
|
|
||||||
// Don't want App.Metrics spam
|
// Don't want App.Metrics/D#+ spam
|
||||||
.MinimumLevel.Override("App.Metrics", LogEventLevel.Information)
|
.MinimumLevel.Override("App.Metrics", LogEventLevel.Information)
|
||||||
|
.MinimumLevel.Override("DSharpPlus", LogEventLevel.Debug)
|
||||||
|
|
||||||
// Actual formatting for these is handled in ScalarFormatting
|
// Actual formatting for these is handled in ScalarFormatting
|
||||||
.Destructure.AsScalar<SystemId>()
|
.Destructure.AsScalar<SystemId>()
|
||||||
|
@ -17,18 +17,20 @@
|
|||||||
<PackageReference Include="Dapper" Version="1.60.6" />
|
<PackageReference Include="Dapper" Version="1.60.6" />
|
||||||
<PackageReference Include="Dapper.Contrib" Version="1.60.1" />
|
<PackageReference Include="Dapper.Contrib" Version="1.60.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.1" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.1" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging " Version="3.1.2" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
<PackageReference Include="NodaTime" Version="3.0.0-beta01" />
|
<PackageReference Include="NodaTime" Version="3.0.0-beta01" />
|
||||||
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="2.2.0" />
|
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="2.2.0" />
|
||||||
<PackageReference Include="Npgsql" Version="4.1.4" />
|
<PackageReference Include="Npgsql" Version="4.1.4" />
|
||||||
<PackageReference Include="Npgsql.NodaTime" Version="4.1.4" />
|
<PackageReference Include="Npgsql.NodaTime" Version="4.1.4" />
|
||||||
<PackageReference Include="Serilog" Version="2.9.1-dev-01154" />
|
<PackageReference Include="Serilog" Version="2.9.1-dev-01154" />
|
||||||
|
<PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
|
||||||
<PackageReference Include="Serilog.Formatting.Compact" Version="1.1.0" />
|
<PackageReference Include="Serilog.Formatting.Compact" Version="1.1.0" />
|
||||||
<PackageReference Include="Serilog.NodaTime" Version="3.0.0-beta01" />
|
<PackageReference Include="Serilog.NodaTime" Version="3.0.0-beta01" />
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.4.1-dev-00071" />
|
<PackageReference Include="Serilog.Sinks.Async" Version="1.4.1-dev-00071" />
|
||||||
|
Loading…
Reference in New Issue
Block a user