aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Sebastiaan Zeeff <[email protected]>2020-09-20 11:41:48 +0200
committerGravatar Sebastiaan Zeeff <[email protected]>2020-09-20 12:45:08 +0200
commit409f0b5e5a0f71a0858c91ffde46275cf755f067 (patch)
tree3d459679bb12736768c6b8bac8d25ae663db5361
parentMerge pull request #1158 from python-discord/config-update (diff)
Determine eligible duckpond emojis dynamically
Instead of maintaining a list of duckpond IDs manually, it's a much better idea to detect ducky emojis dynamically using the new emoji name grouping we've introduced: All emojis that start with `ducky_` will now be counted as a duckpond ducky. The unicode duck emoji obviously still counts in addition to custom emojis with the `ducky_` prefix. Signed-off-by: Sebastiaan Zeeff <[email protected]>
-rw-r--r--bot/cogs/duck_pond.py54
-rw-r--r--bot/constants.py15
-rw-r--r--config-default.yml28
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: