/// <summary>
        /// Posts a notification that a message was deleted.
        /// </summary>
        /// <param name="message">The deleted message.</param>
        /// <param name="messageChannel">The channel the message was deleted from.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        public async Task NotifyMessageDeleted(IMessage message, ISocketMessageChannel messageChannel)
        {
            if (!(messageChannel is ITextChannel textChannel))
            {
                return;
            }

            // We don't care about bot messages
            if (message.Author.IsBot | message.Author.IsWebhook)
            {
                return;
            }

            var getChannel = await GetMonitoringChannelAsync(textChannel.Guild);

            if (!getChannel.IsSuccess)
            {
                return;
            }

            var channel = getChannel.Entity;

            var eb = _feedback.CreateEmbedBase();

            eb.WithTitle("Message Deleted");
            eb.WithColor(Color.Orange);

            var extra = string.Empty;

            if ((await textChannel.Guild.GetUserAsync(_client.CurrentUser.Id)).GuildPermissions.ViewAuditLog)
            {
                var mostProbableDeleter = await FindMostProbableDeleterAsync(message, textChannel);

                // We don't care about bot deletions
                if (!(mostProbableDeleter.IsBot || mostProbableDeleter.IsWebhook))
                {
                    extra = $"by {mostProbableDeleter.Mention}.";
                }
            }

            eb.WithDescription
            (
                $"A message was deleted from {MentionUtils.MentionChannel(textChannel.Id)} {extra}"
            );

            var quote = _feedback.CreateMessageQuote(message, _client.CurrentUser);

            await _feedback.SendEmbedAsync(channel, eb.Build());

            await _feedback.SendEmbedAsync(channel, quote.Build());
        }
        /// <inheritdoc />
        protected override async Task MessageReceived(SocketMessage arg)
        {
            if (!(arg is SocketUserMessage message))
            {
                return;
            }

            if (!(message.Author is SocketGuildUser guildUser))
            {
                return;
            }

            if (arg.Author.IsBot || arg.Author.IsWebhook)
            {
                return;
            }

            var discard = 0;

            if (message.HasCharPrefix('!', ref discard))
            {
                return;
            }

            if (message.HasMentionPrefix(this.Client.CurrentUser, ref discard))
            {
                return;
            }

            foreach (Match match in Pattern.Matches(message.Content))
            {
                if (!ulong.TryParse(match.Groups["GuildId"].Value, out _) ||
                    !ulong.TryParse(match.Groups["ChannelId"].Value, out var channelId) ||
                    !ulong.TryParse(match.Groups["MessageId"].Value, out var messageId))
                {
                    continue;
                }

                var quotedChannel = this.Client.GetChannel(channelId);

                if (!(quotedChannel is IGuildChannel) ||
                    !(quotedChannel is ISocketMessageChannel quotedMessageChannel))
                {
                    continue;
                }

                var quotedMessage = await quotedMessageChannel.GetMessageAsync(messageId);

                if (quotedMessage == null || IsQuote(quotedMessage))
                {
                    return;
                }

                if (message.Channel is IGuildChannel messageGuildChannel)
                {
                    var guildBotUser = await messageGuildChannel.Guild.GetUserAsync(this.Client.CurrentUser.Id);

                    // It's just a single quote link, so we'll delete it
                    if (message.Content == match.Value && guildBotUser.GuildPermissions.ManageMessages)
                    {
                        await message.DeleteAsync();
                    }
                }

                var embed = _feedback.CreateMessageQuote(quotedMessage, guildUser);
                embed.WithTimestamp(quotedMessage.Timestamp);

                try
                {
                    await message.Channel.SendMessageAsync(string.Empty, embed : embed.Build());
                }
                catch (HttpException hex)
                {
                    if (!hex.WasCausedByMissingPermission())
                    {
                        throw;
                    }
                }
            }
        }