aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar sco1 <[email protected]>2018-10-14 17:24:16 -0400
committerGravatar Joseph <[email protected]>2018-10-14 22:24:16 +0100
commit71f0177dbe150d56cca0b373e8ea854415fa3ff3 (patch)
tree3e4c45470cb461a8b4da30971be27676ef79d7d8
parentIssue #15 Feature pull request template (#49) (diff)
Add regex & command prefix filters to reaction cog (#45)
* Add regex & command prefix filters for reaction checks * Add bot self-reaction short circuit, add logging * Remove infinitely looping debug line oops... * Refactor to reduce log noise Move short circuit into a first reaction match to prevent logging every time someone invokes a command or the bot says something
-rw-r--r--bot/cogs/spookyreact.py58
1 files changed, 48 insertions, 10 deletions
diff --git a/bot/cogs/spookyreact.py b/bot/cogs/spookyreact.py
index 2652a60e..9146b797 100644
--- a/bot/cogs/spookyreact.py
+++ b/bot/cogs/spookyreact.py
@@ -1,11 +1,16 @@
+import logging
+import re
+
+import discord
+
SPOOKY_TRIGGERS = {
- 'spooky': "\U0001F47B",
- 'skeleton': "\U0001F480",
- 'doot': "\U0001F480",
- 'pumpkin': "\U0001F383",
- 'halloween': "\U0001F383",
- 'jack-o-lantern': "\U0001F383",
- 'danger': "\U00002620"
+ 'spooky': (r"\bspo{2,}ky\b", "\U0001F47B"),
+ 'skeleton': (r"\bskeleton\b", "\U0001F480"),
+ 'doot': (r"\bdo{2,}t\b", "\U0001F480"),
+ 'pumpkin': (r"\bpumpkin\b", "\U0001F383"),
+ 'halloween': (r"\bhalloween\b", "\U0001F383"),
+ 'jack-o-lantern': (r"\bjack-o-lantern\b", "\U0001F383"),
+ 'danger': (r"\bdanger\b", "\U00002620")
}
@@ -18,13 +23,46 @@ class SpookyReact:
def __init__(self, bot):
self.bot = bot
- async def on_message(self, ctx):
+ async def on_message(self, ctx: discord.Message):
"""
A command to send the hacktoberbot github project
+
+ Lines that begin with the bot's command prefix are ignored
+
+ Hacktoberbot's own messages are ignored
"""
for trigger in SPOOKY_TRIGGERS.keys():
- if trigger in ctx.content.lower():
- await ctx.add_reaction(SPOOKY_TRIGGERS[trigger])
+ trigger_test = re.search(SPOOKY_TRIGGERS[trigger][0], ctx.content.lower())
+ if trigger_test:
+ # Check message for bot replies and/or command invocations
+ # Short circuit if they're found, logging is handled in _short_circuit_check
+ if await self._short_circuit_check(ctx):
+ return
+ else:
+ await ctx.add_reaction(SPOOKY_TRIGGERS[trigger][1])
+ logging.info(f"Added '{trigger}' reaction to message ID: {ctx.id}")
+
+ async def _short_circuit_check(self, ctx: discord.Message) -> bool:
+ """
+ Short-circuit helper check.
+
+ Return True if:
+ * author is the bot
+ * prefix is not None
+ """
+ # Check for self reaction
+ if ctx.author == self.bot.user:
+ logging.info(f"Ignoring reactions on self message. Message ID: {ctx.id}")
+ return True
+
+ # Check for command invocation
+ # Because on_message doesn't give a full Context object, generate one first
+ tmp_ctx = await self.bot.get_context(ctx)
+ if tmp_ctx.prefix:
+ logging.info(f"Ignoring reactions on command invocation. Message ID: {ctx.id}")
+ return True
+
+ return False
def setup(bot):