diff options
author | 2022-04-03 19:11:31 +0100 | |
---|---|---|
committer | 2022-04-03 19:11:31 +0100 | |
commit | 09e9de8b2c0923ca976253c8266192133b3359a0 (patch) | |
tree | 1fe8e2959744807c726120c9bc48470bd5f5e158 | |
parent | Merge pull request #2123 from hugovk/update-peps-url (diff) | |
parent | Merge branch 'main' into feature/ping_on_bad_words_in_username (diff) |
Merge pull request #2069 from GDWR/feature/ping_on_bad_words_in_username
Ping Moderators On Bad Words In Username, Also Checks For Bad Words When Joining Or Switching Voicechannels
-rw-r--r-- | bot/exts/filters/filtering.py | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/bot/exts/filters/filtering.py b/bot/exts/filters/filtering.py index c5a2fdb93..b9f2a0e51 100644 --- a/bot/exts/filters/filtering.py +++ b/bot/exts/filters/filtering.py @@ -6,13 +6,12 @@ from typing import Any, Dict, List, Mapping, NamedTuple, Optional, Tuple, Union import arrow import dateutil.parser -import discord.errors import regex import tldextract from async_rediscache import RedisCache from botcore.regex import DISCORD_INVITE from dateutil.relativedelta import relativedelta -from discord import Colour, HTTPException, Member, Message, NotFound, TextChannel +from discord import ChannelType, Colour, Embed, Forbidden, HTTPException, Member, Message, NotFound, TextChannel from discord.ext.commands import Cog from discord.utils import escape_markdown @@ -63,14 +62,14 @@ AUTO_BAN_REASON = ( ) AUTO_BAN_DURATION = timedelta(days=4) -FilterMatch = Union[re.Match, dict, bool, List[discord.Embed]] +FilterMatch = Union[re.Match, dict, bool, List[Embed]] class Stats(NamedTuple): """Additional stats on a triggered filter to append to a mod log.""" message_content: str - additional_embeds: Optional[List[discord.Embed]] + additional_embeds: Optional[List[Embed]] class Filtering(Cog): @@ -207,6 +206,11 @@ class Filtering(Cog): delta = relativedelta(after.edited_at, before.edited_at).microseconds await self._filter_message(after, delta) + @Cog.listener() + async def on_voice_state_update(self, member: Member, *_) -> None: + """Checks for bad words in usernames when users join, switch or leave a voice channel.""" + await self.check_bad_words_in_name(member) + def get_name_match(self, name: str) -> Optional[re.Match]: """Check bad words from passed string (name). Return the first match found.""" normalised_name = unicodedata.normalize("NFKC", name) @@ -262,7 +266,8 @@ class Filtering(Cog): title="Username filtering alert", text=log_string, channel_id=Channels.mod_alerts, - thumbnail=member.display_avatar.url + thumbnail=member.display_avatar.url, + ping_everyone=True ) # Update time when alert sent @@ -339,7 +344,7 @@ class Filtering(Cog): match = result if match: - is_private = msg.channel.type is discord.ChannelType.private + is_private = msg.channel.type is ChannelType.private # If this is a filter (not a watchlist) and not in a DM, delete the message. if _filter["type"] == "filter" and not is_private: @@ -354,7 +359,7 @@ class Filtering(Cog): # In addition, to avoid sending two notifications to the user, the # logs, and mod_alert, we return if the message no longer exists. await msg.delete() - except discord.errors.NotFound: + except NotFound: return # Notify the user if the filter specifies @@ -409,14 +414,14 @@ class Filtering(Cog): self, filter_name: str, _filter: Dict[str, Any], - msg: discord.Message, + msg: Message, stats: Stats, reason: Optional[str] = None, *, is_eval: bool = False, ) -> None: """Send a mod log for a triggered filter.""" - if msg.channel.type is discord.ChannelType.private: + if msg.channel.type is ChannelType.private: channel_str = "via DM" ping_everyone = False else: @@ -478,7 +483,7 @@ class Filtering(Cog): additional_embeds = [] for _, data in match.items(): reason = f"Reason: {data['reason']} | " if data.get('reason') else "" - embed = discord.Embed(description=( + embed = Embed(description=( f"**Members:**\n{data['members']}\n" f"**Active:**\n{data['active']}" )) @@ -626,7 +631,7 @@ class Filtering(Cog): return invite_data if invite_data else False @staticmethod - async def _has_rich_embed(msg: Message) -> Union[bool, List[discord.Embed]]: + async def _has_rich_embed(msg: Message) -> Union[bool, List[Embed]]: """Determines if `msg` contains any rich embeds not auto-generated from a URL.""" if msg.embeds: for embed in msg.embeds: @@ -662,7 +667,7 @@ class Filtering(Cog): """ try: await filtered_member.send(reason) - except discord.errors.Forbidden: + except Forbidden: await channel.send(f"{filtered_member.mention} {reason}") def schedule_msg_delete(self, msg: dict) -> None: |