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); }
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 }); }
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); }