diff options
| author | 2021-04-18 06:19:06 +0530 | |
|---|---|---|
| committer | 2021-10-11 12:05:34 +0530 | |
| commit | 23578ae0381b0d8d81b7be9d8eb3bc86a1557e0b (patch) | |
| tree | f52724f0c72ee31e0f5b45e6d4acf1b32114ec2b | |
| parent | Revert changes done by black. (diff) | |
Don't allow more than 10 embeds per report.
If more than 10 embeds found, just get the first 10 and ignore the rest.
| -rw-r--r-- | bot/exts/moderation/incidents.py | 85 |
1 files changed, 32 insertions, 53 deletions
diff --git a/bot/exts/moderation/incidents.py b/bot/exts/moderation/incidents.py index c988c45bb..032c15ca2 100644 --- a/bot/exts/moderation/incidents.py +++ b/bot/exts/moderation/incidents.py @@ -9,7 +9,6 @@ from enum import Enum import discord from async_rediscache import RedisCache from discord.ext.commands import Cog, Context, MessageConverter -from more_itertools.recipes import grouper from bot.bot import Bot from bot.constants import Channels, Colours, Emojis, Guild, Webhooks @@ -197,15 +196,15 @@ async def add_signals(incident: discord.Message) -> None: return -async def extract_message_links(message: discord.Message) -> t.Optional[list]: +async def extract_message_links(message: discord.Message, bot: Bot) -> t.Optional[list]: """ Checks if there's any message links in the text content. Then passes the the message_link into `make_message_link_embed` to format a embed for it containing information about the link. - As discord only allows a max of 10 embeds in a single webhook we need to - group the embeds into group of 10 and then return the list. + As discord only allows a max of 10 embeds in a single webhook, just send the + first 10 embeds and don't care about the rest. If no links are found for the message, it logs a trace statement. """ @@ -214,12 +213,10 @@ async def extract_message_links(message: discord.Message) -> t.Optional[list]: if message_links: embeds = [] for message_link in message_links: - ctx = await message.bot.get_context(message) + ctx = await bot.get_context(message) embeds.append(await make_message_link_embed(ctx, message_link[0])) - webhook_embed_list = list(grouper(embeds, 10)) - - return webhook_embed_list + return embeds[:10] log.trace( f"Skipping discord message link detection on {message.id}: message doesn't qualify." @@ -240,6 +237,7 @@ class Incidents(Cog): * See: `crawl_incidents` On message: + * Run message through `extract_message_links` and send them into the channel * Add `Signal` member emoji if message qualifies as an incident * Ignore messages starting with # * Use this if verbal communication is necessary @@ -253,18 +251,13 @@ class Incidents(Cog): * If `Signal.ACTIONED` or `Signal.NOT_ACTIONED` were chosen, attempt to relay the incident message to #incidents-archive * If relay successful, delete original message + * Search the cache for the webhook message for this message, if found delete it. * See: `on_raw_reaction_add` Please refer to function docstrings for implementation details. """ - # This dictionary maps a incident message to the message link embeds(s) sent by it - # - # Discord doesn't allow more than 10 embeds to be sent in a single webhook message - # hence the embeds need to be broken into groups of 10. Since we have multiple embeds - # and RedisCache doesn't allow storing lists, we need to join the list with commas to - # make it a string and then store it. - # + # This dictionary maps a incident message to the message link embeds sent by it # RedisCache[discord.Message.id, str] message_link_embeds_cache = RedisCache() @@ -426,7 +419,7 @@ class Incidents(Cog): log.trace("Deletion was confirmed") # Deletes the message link embeds found in cache from the channel and cache. - await self.delete_msg_link_embeds(incident) + await self.delete_msg_link_embed(incident) async def resolve_message(self, message_id: int) -> t.Optional[discord.Message]: """ @@ -515,7 +508,7 @@ class Incidents(Cog): Also passes the message into `add_signals` if the message is a incident. """ if is_incident(message): - webhook_embed_list = await extract_message_links(message) + webhook_embed_list = await extract_message_links(message, self.bot) webhook = await self.bot.fetch_webhook(Webhooks.incidents) await self.send_webhooks(webhook_embed_list, message, webhook) @@ -535,11 +528,11 @@ class Incidents(Cog): """ if is_incident(msg_before): if msg_before.id in self.message_link_embeds_cache.items: - # Deletes the message link embeds found in cache from the channel and cache. - await self.delete_msg_link_embeds(msg_before) + # Deletes the message link embed found in cache from the channel and cache. + await self.delete_msg_link_embed(msg_before) if is_incident(msg_after): - webhook_embed_list = await extract_message_links(msg_after) + webhook_embed_list = await extract_message_links(msg_after, self.bot) webhook = await self.bot.fetch_webhook(Webhooks.incidents) await self.send_webhooks(webhook_embed_list, msg_after, webhook) @@ -548,19 +541,19 @@ class Incidents(Cog): @Cog.listener() async def on_message_delete(self, message: discord.Message) -> None: """ - Deletes the message link embeds found in cache from the channel and cache if the message + Deletes the message link embed found in cache from the channel and cache if the message is a incident and is found in msg link embeds cache. """ if is_incident(message): if message.id in self.message_link_embeds_cache.items: - await self.delete_msg_link_embeds(message) + await self.delete_msg_link_embed(message) async def send_webhooks( self, webhook_embed_list: t.List, message: discord.Message, webhook: discord.Webhook, - ) -> t.List[int]: + ) -> t.Optional[int]: """ Send Message Link Embeds to #incidents channel. @@ -570,49 +563,35 @@ class Incidents(Cog): After sending each webhook it maps the `message.id` to the `webhook_msg_ids` IDs in the async redis-cache. """ - webhook_msg_ids = [] try: - for x, embed in enumerate(webhook_embed_list): - webhook_msg = await webhook.send( - embeds=[x for x in embed if x is not None], - username=sub_clyde(message.author.name), - avatar_url=message.author.avatar_url, - wait=True, - ) - webhook_msg_ids.append(webhook_msg.id) - log.trace( - f"Message Link Embed {x + 1}/{len(webhook_embed_list)} sent successfully." - ) + webhook_msg = await webhook.send( + embeds=[x for x in webhook_embed_list if x is not None], + username=sub_clyde(message.author.name), + avatar_url=message.author.avatar_url, + wait=True, + ) + log.trace(f"Message Link Embed sent successfully.") except discord.DiscordException: log.exception( - f"Failed to send message link embeds {message.id} to #incidents." + f"Failed to send message link embed {message.id} to #incidents." ) else: - await self.message_link_embeds_cache.set( - message.id, ",".join(map(str, webhook_msg_ids)) - ) - log.trace("Message Link Embeds Sent successfully!") - - return webhook_msg_ids + await self.message_link_embeds_cache.set(message.id, webhook_msg.id) + log.trace("Message Link Embed Sent successfully!") + return webhook_msg.id - async def delete_msg_link_embeds(self, message: discord.Message) -> None: - """Delete discord message links message found in cache for `message`.""" + async def delete_msg_link_embed(self, message: discord.Message) -> None: + """Delete discord message link message found in cache for `message`.""" log.trace("Deleting discord links webhook message.") + webhook_msg_id = await self.message_link_embeds_cache.get(message.id) - webhook_msg_ids = await self.message_link_embeds_cache.get(message.id) - - if webhook_msg_ids: - webhook_msg_ids = webhook_msg_ids.split(",") + if webhook_msg_id: webhook = await self.bot.fetch_webhook(Webhooks.incidents) - - for x, msg in enumerate(webhook_msg_ids): - await webhook.delete_message(msg) - log.trace(f"Deleted discord links webhook message{x}/{len(webhook_msg_ids)}") + await webhook.delete_message(webhook_msg_id) await self.message_link_embeds_cache.delete(message.id) - log.trace("Successfully deleted discord links webhook message.") |