diff options
| -rw-r--r-- | bot/cogs/duck_pond.py | 54 | ||||
| -rw-r--r-- | bot/constants.py | 15 | ||||
| -rw-r--r-- | config-default.yml | 28 | 
3 files changed, 27 insertions, 70 deletions
diff --git a/bot/cogs/duck_pond.py b/bot/cogs/duck_pond.py index 7021069fa..e1aceb482 100644 --- a/bot/cogs/duck_pond.py +++ b/bot/cogs/duck_pond.py @@ -49,32 +49,32 @@ class DuckPond(Cog):                          return True          return False +    @staticmethod +    def _is_duck_emoji(emoji: Union[str, discord.PartialEmoji, discord.Emoji]) -> bool: +        """Check if the emoji is a valid duck emoji.""" +        if isinstance(emoji, str): +            return emoji == "🦆" +        else: +            return hasattr(emoji, "name") and emoji.name.startswith("ducky_") +      async def count_ducks(self, message: Message) -> int:          """          Count the number of ducks in the reactions of a specific message.          Only counts ducks added by staff members.          """ -        duck_count = 0 -        duck_reactors = [] +        duck_reactors = set() +        # iterate over all reactions          for reaction in message.reactions: -            async for user in reaction.users(): - -                # Is the user a staff member and not already counted as reactor? -                if not self.is_staff(user) or user.id in duck_reactors: -                    continue - -                # Is the emoji a duck? -                if hasattr(reaction.emoji, "id"): -                    if reaction.emoji.id in constants.DuckPond.custom_emojis: -                        duck_count += 1 -                        duck_reactors.append(user.id) -                elif isinstance(reaction.emoji, str): -                    if reaction.emoji == "🦆": -                        duck_count += 1 -                        duck_reactors.append(user.id) -        return duck_count +            # check if the current reaction is a duck +            if not self._is_duck_emoji(reaction.emoji): +                continue + +            # update the set of reactors with all staff reactors +            duck_reactors |= {user.id async for user in reaction.users() if self.is_staff(user)} + +        return len(duck_reactors)      async def relay_message(self, message: Message) -> None:          """Relays the message's content and attachments to the duck pond channel.""" @@ -105,16 +105,16 @@ class DuckPond(Cog):          await message.add_reaction("✅") -    @staticmethod -    def _payload_has_duckpond_emoji(payload: RawReactionActionEvent) -> bool: +    def _payload_has_duckpond_emoji(self, emoji: discord.PartialEmoji) -> bool:          """Test if the RawReactionActionEvent payload contains a duckpond emoji.""" -        if payload.emoji.is_custom_emoji(): -            if payload.emoji.id in constants.DuckPond.custom_emojis: -                return True -        elif payload.emoji.name == "🦆": -            return True +        if emoji.is_unicode_emoji(): +            # For unicode PartialEmojis, the `name` attribute is just the string +            # representation of the emoji. This is what the helper method +            # expects, as unicode emojis show up as just a `str` instance when +            # inspecting the reactions attached to a message. +            emoji = emoji.name -        return False +        return self._is_duck_emoji(emoji)      @Cog.listener()      async def on_raw_reaction_add(self, payload: RawReactionActionEvent) -> None: @@ -126,7 +126,7 @@ class DuckPond(Cog):          send the message off to the duck pond.          """          # Is the emoji in the reaction a duck? -        if not self._payload_has_duckpond_emoji(payload): +        if not self._payload_has_duckpond_emoji(payload.emoji):              return          channel = discord.utils.get(self.bot.get_all_channels(), id=payload.channel_id) diff --git a/bot/constants.py b/bot/constants.py index 17f14fec0..f087fd96f 100644 --- a/bot/constants.py +++ b/bot/constants.py @@ -252,7 +252,6 @@ class DuckPond(metaclass=YAMLGetter):      section = "duck_pond"      threshold: int -    custom_emojis: List[int]  class Emojis(metaclass=YAMLGetter): @@ -292,20 +291,6 @@ class Emojis(metaclass=YAMLGetter):      cross_mark: str      check_mark: str -    ducky_yellow: int -    ducky_blurple: int -    ducky_regal: int -    ducky_camo: int -    ducky_ninja: int -    ducky_devil: int -    ducky_tube: int -    ducky_hunt: int -    ducky_wizard: int -    ducky_party: int -    ducky_angel: int -    ducky_maul: int -    ducky_santa: int -      upvotes: str      comments: str      user: str diff --git a/config-default.yml b/config-default.yml index 58651f548..8d13b2d11 100644 --- a/config-default.yml +++ b/config-default.yml @@ -62,20 +62,6 @@ style:          cross_mark: "\u274C"          check_mark: "\u2705" -        ducky_yellow:   &DUCKY_YELLOW   574951975574175744 -        ducky_blurple:  &DUCKY_BLURPLE  574951975310065675 -        ducky_regal:    &DUCKY_REGAL    637883439185395712 -        ducky_camo:     &DUCKY_CAMO     637914731566596096 -        ducky_ninja:    &DUCKY_NINJA    637923502535606293 -        ducky_devil:    &DUCKY_DEVIL    637925314982576139 -        ducky_tube:     &DUCKY_TUBE     637881368008851456 -        ducky_hunt:     &DUCKY_HUNT     639355090909528084 -        ducky_wizard:   &DUCKY_WIZARD   639355996954689536 -        ducky_party:    &DUCKY_PARTY    639468753440210977 -        ducky_angel:    &DUCKY_ANGEL    640121935610511361 -        ducky_maul:     &DUCKY_MAUL     640137724958867467 -        ducky_santa:    &DUCKY_SANTA    655360331002019870 -          # emotes used for #reddit          upvotes:        "<:reddit_upvotes:755845219890757644>"          comments:       "<:reddit_comments:755845255001014384>" @@ -468,20 +454,6 @@ sync:  duck_pond:      threshold: 5 -    custom_emojis: -        - *DUCKY_YELLOW -        - *DUCKY_BLURPLE -        - *DUCKY_CAMO -        - *DUCKY_DEVIL -        - *DUCKY_NINJA -        - *DUCKY_REGAL -        - *DUCKY_TUBE -        - *DUCKY_HUNT -        - *DUCKY_WIZARD -        - *DUCKY_PARTY -        - *DUCKY_ANGEL -        - *DUCKY_MAUL -        - *DUCKY_SANTA  python_news:      mail_lists:  |