diff options
| author | 2022-10-28 01:26:00 +0300 | |
|---|---|---|
| committer | 2022-10-28 01:26:00 +0300 | |
| commit | c13d7619af4d65ad73c40122660ab9a9361ca751 (patch) | |
| tree | 648ab7375d99479be1059915fd192e30e0cdcf45 | |
| parent | Use command prefix instead of hardcoded ! (diff) | |
Handle context message possibly being None
5 files changed, 19 insertions, 18 deletions
diff --git a/bot/exts/filtering/_filter_context.py b/bot/exts/filtering/_filter_context.py index bcbafe393..22950d5df 100644 --- a/bot/exts/filtering/_filter_context.py +++ b/bot/exts/filtering/_filter_context.py @@ -3,7 +3,6 @@ from __future__ import annotations from collections.abc import Callable, Coroutine from dataclasses import dataclass, field, replace from enum import Enum, auto -from typing import Optional, Union from discord import DMChannel, Member, Message, TextChannel, Thread, User @@ -22,9 +21,9 @@ class FilterContext: # Input context event: Event # The type of event author: User | Member | None # Who triggered the event - channel: Union[TextChannel, Thread, DMChannel] # The channel involved - content: Union[str, set] # What actually needs filtering - message: Optional[Message] # The message involved + channel: TextChannel | Thread | DMChannel # The channel involved + content: str | set # What actually needs filtering + message: Message | None # The message involved embeds: list = field(default_factory=list) # Any embeds involved # Output context dm_content: str = field(default_factory=str) # The content to DM the invoker diff --git a/bot/exts/filtering/_filters/unique/discord_token.py b/bot/exts/filtering/_filters/unique/discord_token.py index 571a8a9b1..7fdb800df 100644 --- a/bot/exts/filtering/_filters/unique/discord_token.py +++ b/bot/exts/filtering/_filters/unique/discord_token.py @@ -10,6 +10,7 @@ from pydantic import BaseModel, Field import bot from bot import constants, utils +from bot.constants import Guild from bot.exts.filtering._filter_context import Event, FilterContext from bot.exts.filtering._filters.filter import UniqueFilter from bot.exts.filtering._utils import resolve_mention @@ -74,7 +75,7 @@ class DiscordTokenFilter(UniqueFilter): if not found_token: return False - if mod_log := self.mod_log: + if ctx.message and (mod_log := self.mod_log): mod_log.ignore(constants.Event.message_delete, ctx.message.id) ctx.content = ctx.content.replace(found_token.hmac, self.censor_hmac(found_token.hmac)) ctx.additional_actions.append(self._create_token_alert_embed_wrapper(found_token)) @@ -84,8 +85,8 @@ class DiscordTokenFilter(UniqueFilter): """Create the action to perform when an alert should be sent for a message containing a Discord token.""" async def _create_token_alert_embed(ctx: FilterContext) -> None: """Add an alert embed to the context with info about the token sent.""" - userid_message, is_user = await self.format_userid_log_message(ctx.message, found_token) - log_message = self.format_log_message(ctx.message, found_token) + userid_message, is_user = await self.format_userid_log_message(found_token) + log_message = self.format_log_message(ctx.author, ctx.channel, found_token) log.debug(log_message) if is_user: @@ -102,7 +103,7 @@ class DiscordTokenFilter(UniqueFilter): return _create_token_alert_embed @classmethod - async def format_userid_log_message(cls, msg: discord.Message, token: Token) -> tuple[str, bool]: + async def format_userid_log_message(cls, token: Token) -> tuple[str, bool]: """ Format the portion of the log message that includes details about the detected user ID. @@ -112,7 +113,8 @@ class DiscordTokenFilter(UniqueFilter): Returns a tuple of (log_message, is_user) """ user_id = cls.extract_user_id(token.user_id) - user = await get_or_fetch_member(msg.guild, user_id) + guild = bot.instance.get_guild(Guild.id) + user = await get_or_fetch_member(guild, user_id) if user: return KNOWN_USER_LOG_MESSAGE.format( @@ -129,11 +131,11 @@ class DiscordTokenFilter(UniqueFilter): return 'x' * (len(hmac) - 3) + hmac[-3:] @classmethod - def format_log_message(cls, msg: discord.Message, token: Token) -> str: + def format_log_message(cls, author: discord.User, channel: discord.abc.GuildChannel, token: Token) -> str: """Return the generic portion of the log message to send for `token` being censored in `msg`.""" return LOG_MESSAGE.format( - author=format_user(msg.author), - channel=msg.channel.mention, + author=format_user(author), + channel=channel.mention, user_id=token.user_id, timestamp=token.timestamp, hmac=cls.censor_hmac(token.hmac), diff --git a/bot/exts/filtering/_filters/unique/rich_embed.py b/bot/exts/filtering/_filters/unique/rich_embed.py index 75f578d3e..a0d9e263f 100644 --- a/bot/exts/filtering/_filters/unique/rich_embed.py +++ b/bot/exts/filtering/_filters/unique/rich_embed.py @@ -19,8 +19,8 @@ class RichEmbedFilter(UniqueFilter): def triggered_on(self, ctx: FilterContext) -> bool: """Determine if `msg` contains any rich embeds not auto-generated from a URL.""" - if ctx.message.embeds: - for embed in ctx.message.embeds: + if ctx.embeds: + for embed in ctx.embeds: if embed.type == "rich": urls = URL_RE.findall(ctx.content) final_urls = set(urls) @@ -32,7 +32,7 @@ class RichEmbedFilter(UniqueFilter): if not embed.url or embed.url not in final_urls: # If `embed.url` does not exist or if `embed.url` is not part of the content # of the message, it's unlikely to be an auto-generated embed by Discord. - ctx.alert_embeds.extend(ctx.message.embeds) + ctx.alert_embeds.extend(ctx.embeds) return True else: log.trace( diff --git a/bot/exts/filtering/_filters/unique/webhook.py b/bot/exts/filtering/_filters/unique/webhook.py index ee6b7135e..b9d98db35 100644 --- a/bot/exts/filtering/_filters/unique/webhook.py +++ b/bot/exts/filtering/_filters/unique/webhook.py @@ -36,7 +36,7 @@ class WebhookFilter(UniqueFilter): return False # Don't log this. - if mod_log := self.mod_log: + if ctx.message and (mod_log := self.mod_log): mod_log.ignore(constants.Event.message_delete, ctx.message.id) for i, match in enumerate(matches, start=1): diff --git a/bot/exts/filtering/_settings_types/actions/delete_messages.py b/bot/exts/filtering/_settings_types/actions/delete_messages.py index 1770c29ec..2f851ef04 100644 --- a/bot/exts/filtering/_settings_types/actions/delete_messages.py +++ b/bot/exts/filtering/_settings_types/actions/delete_messages.py @@ -2,7 +2,7 @@ from typing import ClassVar from discord.errors import NotFound -from bot.exts.filtering._filter_context import Event, FilterContext +from bot.exts.filtering._filter_context import FilterContext from bot.exts.filtering._settings_types.settings_entry import ActionEntry @@ -18,7 +18,7 @@ class DeleteMessages(ActionEntry): async def action(self, ctx: FilterContext) -> None: """Delete the context message(s).""" - if not self.delete_messages or ctx.event not in (Event.MESSAGE, Event.MESSAGE_EDIT): + if not self.delete_messages or not ctx.message: return if not ctx.message.guild: |