aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Daniel Brown <[email protected]>2020-09-03 12:07:30 -0500
committerGravatar GitHub <[email protected]>2020-09-03 12:07:30 -0500
commitc6f8530249bd3c9b373e1365f9308639bb958def (patch)
treee85ae9a56d1f6ade3923483bc47e87a4faf2b0cc
parentMerge pull request #1134 from python-discord/remove-wolfram (diff)
parentMerge 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.py3
-rw-r--r--bot/rules/__init__.py1
-rw-r--r--bot/rules/everyone_ping.py41
-rw-r--r--config-default.yml4
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: