aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Shivansh-007 <[email protected]>2021-04-18 06:19:06 +0530
committerGravatar Shivansh-007 <[email protected]>2021-10-11 12:05:34 +0530
commit23578ae0381b0d8d81b7be9d8eb3bc86a1557e0b (patch)
treef52724f0c72ee31e0f5b45e6d4acf1b32114ec2b
parentRevert 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.py85
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.")