diff options
| author | 2018-10-14 17:24:16 -0400 | |
|---|---|---|
| committer | 2018-10-14 22:24:16 +0100 | |
| commit | 71f0177dbe150d56cca0b373e8ea854415fa3ff3 (patch) | |
| tree | 3e4c45470cb461a8b4da30971be27676ef79d7d8 /bot | |
| parent | Issue #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
Diffstat (limited to 'bot')
| -rw-r--r-- | bot/cogs/spookyreact.py | 58 | 
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): | 
