Example #1
0
    private async Task <ulong?> GetAndCheckLogChannel(MessageContext ctx, Message trigger,
                                                      PKMessage proxiedMessage)
    {
        if (proxiedMessage.Guild == null && proxiedMessage.Channel != trigger.ChannelId)
        {
            // a very old message is being edited outside of its original channel
            // we can't know if we're in the correct guild, so skip fetching a log channel
            return(null);
        }

        var guildId       = proxiedMessage.Guild ?? trigger.GuildId.Value;
        var logChannelId  = ctx.LogChannel;
        var isBlacklisted = ctx.InLogBlacklist;

        if (proxiedMessage.Guild != trigger.GuildId)
        {
            // we're editing a message from a different server, get log channel info from the database
            var guild = await _repo.GetGuild(proxiedMessage.Guild.Value);

            logChannelId  = guild.LogChannel;
            isBlacklisted = guild.LogBlacklist.Any(x => x == trigger.ChannelId);
        }

        if (ctx.SystemId == null || logChannelId == null || isBlacklisted)
        {
            return(null);
        }

        // Find log channel and check if valid
        var logChannel = await FindLogChannel(guildId, logChannelId.Value);

        if (logChannel == null || logChannel.Type != Channel.ChannelType.GuildText)
        {
            return(null);
        }

        // Check bot permissions
        var perms = await GetPermissionsInLogChannel(logChannel);

        if (!perms.HasFlag(PermissionSet.SendMessages | PermissionSet.EmbedLinks))
        {
            _logger.Information(
                "Does not have permission to log proxy, ignoring (channel: {ChannelId}, guild: {GuildId}, bot permissions: {BotPermissions})",
                logChannel.Id, trigger.GuildId !.Value, perms);
            return(null);
        }

        return(logChannel.Id);
    }
Example #2
0
    public Task AddMessage(PKMessage msg)
    {
        var query = new Query("messages").AsInsert(new
        {
            mid          = msg.Mid,
            guild        = msg.Guild,
            channel      = msg.Channel,
            member       = msg.Member,
            sender       = msg.Sender,
            original_mid = msg.OriginalMid
        });

        _logger.Debug("Stored message {@StoredMessage} in channel {Channel}", msg, msg.Channel);

        // "on conflict do nothing" in the (pretty rare) case of duplicate events coming in from Discord, which would lead to a DB error before
        return(_db.ExecuteQuery(query, "on conflict do nothing"));
    }
        public async ValueTask LogEditedMessage(MessageContext ctx, PKMessage proxy, Message trigger, Message originalMessage, string newContent)
        {
            var logChannel = await GetAndCheckLogChannel(ctx, trigger, proxy);

            if (logChannel == null)
            {
                return;
            }

            var triggerChannel = _cache.GetChannel(proxy.Channel);

            // Send embed!
            await using var conn = await _db.Obtain();

            var embed = _embed.CreateEditedMessageEmbed(await _repo.GetSystem(conn, ctx.SystemId.Value),
                                                        await _repo.GetMember(conn, proxy.Member), originalMessage.Id, trigger.Id, trigger.Author, newContent, originalMessage.Content,
                                                        triggerChannel);
            var url = $"https://discord.com/channels/{proxy.Guild.Value}/{proxy.Channel}/{proxy.Mid}";
            await _rest.CreateMessage(logChannel.Id, new() { Content = url, Embed = embed });
        }
Example #4
0
    public async ValueTask LogMessage(MessageContext ctx, PKMessage proxiedMessage, Message trigger,
                                      Message hookMessage, string oldContent = null)
    {
        var logChannelId = await GetAndCheckLogChannel(ctx, trigger, proxiedMessage);

        if (logChannelId == null)
        {
            return;
        }

        var triggerChannel = await _cache.GetChannel(proxiedMessage.Channel);

        var system = await _repo.GetSystem(ctx.SystemId.Value);

        var member = await _repo.GetMember(proxiedMessage.Member !.Value);

        // Send embed!
        var embed = _embed.CreateLoggedMessageEmbed(trigger, hookMessage, system.Hid, member, triggerChannel.Name,
                                                    oldContent);
        var url =
            $"https://discord.com/channels/{proxiedMessage.Guild.Value}/{proxiedMessage.Channel}/{proxiedMessage.Mid}";
        await _rest.CreateMessage(logChannelId.Value, new MessageRequest { Content = url, Embeds = new[] { embed } });
    }
        private async Task <Channel?> GetAndCheckLogChannel(MessageContext ctx, Message trigger, PKMessage original = null)
        {
            var guildId       = trigger.GuildId != null ? trigger.GuildId !.Value : original.Guild.Value;
            var logChannelId  = ctx.LogChannel;
            var isBlacklisted = ctx.InLogBlacklist;

            if (original != null)
            {
                // we're editing a message, get log channel info from the database
                var guild = await _db.Execute(c => _repo.GetGuild(c, original.Guild.Value));

                logChannelId  = guild.LogChannel;
                isBlacklisted = guild.Blacklist.Any(x => x == logChannelId);
            }

            if (ctx.SystemId == null || logChannelId == null || isBlacklisted)
            {
                return(null);
            }


            // Find log channel and check if valid
            var logChannel = await FindLogChannel(guildId, logChannelId.Value);

            if (logChannel == null || logChannel.Type != Channel.ChannelType.GuildText)
            {
                return(null);
            }

            // Check bot permissions
            var perms = _bot.PermissionsIn(logChannel.Id);

            if (!perms.HasFlag(PermissionSet.SendMessages | PermissionSet.EmbedLinks))
            {
                _logger.Information(
                    "Does not have permission to proxy log, ignoring (channel: {ChannelId}, guild: {GuildId}, bot permissions: {BotPermissions})",
                    ctx.LogChannel.Value, trigger.GuildId !.Value, perms);
                return(null);
            }

            return(logChannel);
        }