aboutsummaryrefslogtreecommitdiff
path: root/discord/reaction.py
diff options
context:
space:
mode:
authorRapptz <[email protected]>2016-11-11 03:12:43 -0500
committerRapptz <[email protected]>2017-01-03 09:51:57 -0500
commitc187d87dae6b094259440f8aa2a278fef38ae6d2 (patch)
tree53dd1e2dea747776fc0670645d97e68f6ccb32f3 /discord/reaction.py
parentRename try_insert_user to store_user (diff)
downloaddiscord.py-c187d87dae6b094259440f8aa2a278fef38ae6d2.tar.xz
discord.py-c187d87dae6b094259440f8aa2a278fef38ae6d2.zip
Re-add support for reactions.
We now store emojis in a global cache and make things like adding and removing reactions part of the stateful Message class.
Diffstat (limited to 'discord/reaction.py')
-rw-r--r--discord/reaction.py72
1 files changed, 59 insertions, 13 deletions
diff --git a/discord/reaction.py b/discord/reaction.py
index 2e4f3ce4..2e47e397 100644
--- a/discord/reaction.py
+++ b/discord/reaction.py
@@ -24,7 +24,9 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
"""
-from .emoji import Emoji
+import asyncio
+
+from .user import User
class Reaction:
"""Represents a reaction to a message.
@@ -48,25 +50,27 @@ class Reaction:
Attributes
-----------
- emoji : :class:`Emoji` or str
+ emoji: :class:`Emoji` or str
The reaction emoji. May be a custom emoji, or a unicode emoji.
- custom_emoji : bool
- If this is a custom emoji.
- count : int
+ count: int
Number of times this reaction was made
- me : bool
+ me: bool
If the user sent this reaction.
message: :class:`Message`
Message this reaction is for.
"""
- __slots__ = ['message', 'count', 'emoji', 'me', 'custom_emoji']
+ __slots__ = ('message', 'count', 'emoji', 'me')
+
+ def __init__(self, *, message, data, emoji=None):
+ self.message = message
+ self.emoji = message._state.reaction_emoji(data['emoji']) if emoji is None else emoji
+ self.count = data.get('count', 1)
+ self.me = data.get('me')
- def __init__(self, **kwargs):
- self.message = kwargs.get('message')
- self.emoji = kwargs['emoji']
- self.count = kwargs.get('count', 1)
- self.me = kwargs.get('me')
- self.custom_emoji = isinstance(self.emoji, Emoji)
+ @property
+ def custom_emoji(self):
+ """bool: If this is a custom emoji."""
+ return not isinstance(self.emoji, str)
def __eq__(self, other):
return isinstance(other, self.__class__) and other.emoji == self.emoji
@@ -78,3 +82,45 @@ class Reaction:
def __hash__(self):
return hash(self.emoji)
+
+ @asyncio.coroutine
+ def users(self, limit=100, after=None):
+ """|coro|
+
+ Get the users that added this reaction.
+
+ The ``after`` parameter must represent a member
+ and meet the :class:`abc.Snowflake` abc.
+
+ Parameters
+ ------------
+ limit: int
+ The maximum number of results to return.
+ after: :class:`abc.Snowflake`
+ For pagination, reactions are sorted by member.
+
+ Raises
+ --------
+ HTTPException
+ Getting the users for the reaction failed.
+
+ Returns
+ --------
+ List[:class:`User`]
+ A list of users who reacted to the message.
+ """
+
+ # TODO: Return an iterator a la `MessageChannel.history`?
+
+ if self.custom_emoji:
+ emoji = '{0.name}:{0.id}'.format(self.emoji)
+ else:
+ emoji = self.emoji
+
+ if after:
+ after = after.id
+
+ msg = self.message
+ state = msg._state
+ data = yield from state.http.get_reaction_users(msg.id, msg.channel.id, emoji, limit, after=after)
+ return [User(state=state, data=user) for user in data]