diff options
| author | 2020-09-03 12:07:30 -0500 | |
|---|---|---|
| committer | 2020-09-03 12:07:30 -0500 | |
| commit | c6f8530249bd3c9b373e1365f9308639bb958def (patch) | |
| tree | e85ae9a56d1f6ade3923483bc47e87a4faf2b0cc | |
| parent | Merge pull request #1134 from python-discord/remove-wolfram (diff) | |
| parent | Merge branch 'master' into feat/filter/1131/everyone-ping-responder (diff) | |
Merge pull request #1135 from MrAwesomeRocks/feat/filter/1131/everyone-ping-responder
Auto-respond to everyone pings.
| -rw-r--r-- | bot/cogs/antispam.py | 3 | ||||
| -rw-r--r-- | bot/rules/__init__.py | 1 | ||||
| -rw-r--r-- | bot/rules/everyone_ping.py | 41 | ||||
| -rw-r--r-- | config-default.yml | 4 |
4 files changed, 48 insertions, 1 deletions
diff --git a/bot/cogs/antispam.py b/bot/cogs/antispam.py index bc31cbd95..d003f962b 100644 --- a/bot/cogs/antispam.py +++ b/bot/cogs/antispam.py @@ -34,7 +34,8 @@ RULE_FUNCTION_MAPPING = { 'links': rules.apply_links, 'mentions': rules.apply_mentions, 'newlines': rules.apply_newlines, - 'role_mentions': rules.apply_role_mentions + 'role_mentions': rules.apply_role_mentions, + 'everyone_ping': rules.apply_everyone_ping, } diff --git a/bot/rules/__init__.py b/bot/rules/__init__.py index a01ceae73..8a69cadee 100644 --- a/bot/rules/__init__.py +++ b/bot/rules/__init__.py @@ -10,3 +10,4 @@ from .links import apply as apply_links from .mentions import apply as apply_mentions from .newlines import apply as apply_newlines from .role_mentions import apply as apply_role_mentions +from .everyone_ping import apply as apply_everyone_ping diff --git a/bot/rules/everyone_ping.py b/bot/rules/everyone_ping.py new file mode 100644 index 000000000..89d9fe570 --- /dev/null +++ b/bot/rules/everyone_ping.py @@ -0,0 +1,41 @@ +import random +import re +from typing import Dict, Iterable, List, Optional, Tuple + +from discord import Embed, Member, Message + +from bot.constants import Colours, Guild, NEGATIVE_REPLIES + +# Generate regex for checking for pings: +guild_id = Guild.id +EVERYONE_RE_INLINE_CODE = re.compile(rf"^(?!`).*@everyone.*(?!`)$|^(?!`).*<@&{guild_id}>.*(?!`)$") +EVERYONE_RE_MULTILINE_CODE = re.compile(rf"^(?!```).*@everyone.*(?!```)$|^(?!```).*<@&{guild_id}>.*(?!```)$") + + +async def apply( + last_message: Message, + recent_messages: List[Message], + config: Dict[str, int], +) -> Optional[Tuple[str, Iterable[Member], Iterable[Message]]]: + """Detects if a user has sent an '@everyone' ping.""" + relevant_messages = tuple(msg for msg in recent_messages if msg.author == last_message.author) + + everyone_messages_count = 0 + for msg in relevant_messages: + num_everyone_pings_inline = len(re.findall(EVERYONE_RE_INLINE_CODE, msg.content)) + num_everyone_pings_multiline = len(re.findall(EVERYONE_RE_MULTILINE_CODE, msg.content)) + if num_everyone_pings_inline and num_everyone_pings_multiline: + everyone_messages_count += 1 + + if everyone_messages_count > config["max"]: + # Send the channel an embed giving the user more info: + embed_text = f"Please don't try to ping {last_message.guild.member_count:,} people." + embed = Embed(title=random.choice(NEGATIVE_REPLIES), description=embed_text, colour=Colours.soft_red) + await last_message.channel.send(embed=embed) + + return ( + "pinged the everyone role", + (last_message.author,), + relevant_messages, + ) + return None diff --git a/config-default.yml b/config-default.yml index a0f601728..766f7050c 100644 --- a/config-default.yml +++ b/config-default.yml @@ -385,6 +385,10 @@ anti_spam: interval: 10 max: 3 + everyone_ping: + interval: 10 + max: 0 + reddit: subreddits: |