public async Task HandleNotificationAsync(
            MessageReceivedNotification notification,
            CancellationToken cancellationToken)
        {
            using var statsScope = _dogStatsd.StartTimer("message_processing_ms");

            var message = notification.Message;
            var channel = notification.Message.Channel;
            var guild   = (channel as IGuildChannel)?.Guild;

            using var logScope = MessageLogMessages.BeginMessageNotificationScope(_logger, guild?.Id, message.Id, channel.Id);

            MessageLogMessages.MessageReceivedHandling(_logger);

            await TryTrackMessageAsync(
                guild,
                notification.Message,
                async (guildId) =>
            {
                MessageLogMessages.MessageRecordCreating(_logger);
                await _messageRepository.CreateAsync(new MessageCreationData()
                {
                    Id        = message.Id,
                    GuildId   = guildId,
                    ChannelId = channel.Id,
                    AuthorId  = message.Author.Id,
                    Timestamp = message.Timestamp
                });
                MessageLogMessages.MessageRecordCreated(_logger);
            },
                cancellationToken);

            MessageLogMessages.MessageReceivedHandled(_logger);
        }
        public async Task HandleNotificationAsync(
            MessageDeletedNotification notification,
            CancellationToken cancellationToken)
        {
            var message = notification.Message.HasValue ? notification.Message.Value : null;
            var channel = notification.Channel;
            var guild   = (channel as IGuildChannel)?.Guild;

            using var logScope = MessageLogMessages.BeginMessageNotificationScope(_logger, guild?.Id, notification.Message.Id, channel.Id);

            MessageLogMessages.MessageDeletedHandling(_logger);

            await TryTrackMessageAsync(
                guild,
                message,
                async (_) =>
            {
                MessageLogMessages.MessageRecordDeleting(_logger);
                await _messageRepository.DeleteAsync(notification.Message.Id);
                MessageLogMessages.MessageRecordDeleted(_logger);
            },
                cancellationToken);

            MessageLogMessages.MessageDeletedHandled(_logger);
        }
        private async Task TryTrackMessageAsync(
            IGuild?guild,
            IMessage?message,
            Func <ulong, Task> asyncTrackAction,
            CancellationToken cancellationToken)
        {
            if (guild is null)
            {
                MessageLogMessages.IgnoringNonGuildMessage(_logger);
                return;
            }

            if (message is { })