aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar ChrisJL <[email protected]>2022-04-03 19:11:31 +0100
committerGravatar GitHub <[email protected]>2022-04-03 19:11:31 +0100
commit09e9de8b2c0923ca976253c8266192133b3359a0 (patch)
tree1fe8e2959744807c726120c9bc48470bd5f5e158
parentMerge pull request #2123 from hugovk/update-peps-url (diff)
parentMerge 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.py29
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: