Skip to content

Commit 44c44a1

Browse files
refactor: add query parameters to get_reactions_of_emoji #81 (#818)
* refactor: add query parameters to `get_reactions_of_emoji` * ci: correct from checks. * test for params * test for params * revert: remove duplicates I accidentally made during merge * ci: correct from checks. Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 13d06a5 commit 44c44a1

File tree

3 files changed

+84
-3
lines changed

3 files changed

+84
-3
lines changed

interactions/api/http/reaction.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,35 @@ async def remove_all_reactions_of_emoji(
110110
)
111111

112112
async def get_reactions_of_emoji(
113-
self, channel_id: int, message_id: int, emoji: str
113+
self,
114+
channel_id: int,
115+
message_id: int,
116+
emoji: str,
117+
limit: int = 25,
118+
after: int = None,
114119
) -> List[dict]:
115120
"""
116121
Gets the users who reacted to the emoji.
117122
118123
:param channel_id: Channel snowflake ID.
119124
:param message_id: Message snowflake ID.
120125
:param emoji: The emoji to get (format: `name:id`)
126+
:param limit: Max number of users to return (1-100)
127+
:param after: Get users after this user ID
121128
:return: A list of users who sent that emoji.
122129
"""
130+
131+
params_set = {
132+
f"after={after}" if after else None,
133+
f"limit={limit}",
134+
}
135+
final = "&".join([item for item in params_set if item is not None])
136+
123137
return await self._req.request(
124138
Route(
125139
"GET",
126-
"/channels/{channel_id}/messages/{message_id}/reactions/{emoji}",
140+
"/channels/{channel_id}/messages/{message_id}/reactions/{emoji}"
141+
+ f"{'?' + final if final is not None else ''}",
127142
channel_id=channel_id,
128143
message_id=message_id,
129144
emoji=emoji,

interactions/api/http/reaction.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ class ReactionRequest:
1818
self, channel_id: int, message_id: int, emoji: str
1919
) -> None: ...
2020
async def get_reactions_of_emoji(
21-
self, channel_id: int, message_id: int, emoji: str
21+
self, channel_id: int, message_id: int, emoji: str, limit: int = 25, after: int = None,
2222
) -> List[dict]: ...

interactions/api/models/message.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@
2121
from .team import Application
2222
from .user import User
2323

24+
__all__ = (
25+
"MessageType",
26+
"Message",
27+
"MessageReference",
28+
"MessageActivity",
29+
"MessageInteraction",
30+
"ChannelMention",
31+
"Embed",
32+
"EmbedAuthor",
33+
"EmbedProvider",
34+
"EmbedImageStruct",
35+
"EmbedField",
36+
"Attachment",
37+
"Emoji",
38+
"EmbedFooter",
39+
"ReactionObject",
40+
"PartialSticker",
41+
"Sticker",
42+
)
43+
2444

2545
class MessageType(IntEnum):
2646
"""An enumerable object representing the types of messages."""
@@ -906,6 +926,8 @@ async def edit(
906926
:type files: Optional[Union[File, List[File]]]
907927
:param embeds?: An embed, or list of embeds for the message.
908928
:type embeds: Optional[Union[Embed, List[Embed]]]
929+
:param suppress_embeds?: Whether to suppress embeds in the message.
930+
:type suppress_embeds: Optional[bool]
909931
:param allowed_mentions?: The message interactions/mention limits that the message can refer to.
910932
:type allowed_mentions: Optional[MessageInteraction]
911933
:param components?: A component, or list of components for the message. If `[]` the components will be removed
@@ -1222,12 +1244,56 @@ async def remove_reaction_from(
12221244
if isinstance(emoji, Emoji)
12231245
else emoji
12241246
)
1247+
if not self._client:
1248+
raise AttributeError("HTTPClient not found!")
12251249

12261250
_user_id = user if isinstance(user, int) else user.id
12271251
return await self._client.remove_user_reaction(
12281252
channel_id=int(self.channel_id), message_id=int(self.id), user_id=_user_id, emoji=_emoji
12291253
)
12301254

1255+
async def get_users_from_reaction(
1256+
self,
1257+
emoji: Union[str, "Emoji"],
1258+
) -> List[User]:
1259+
"""
1260+
Retrieves all users that reacted to the message with the given emoji
1261+
1262+
:param emoji: The Emoji as object or formatted as `name:id`
1263+
:type emoji: Union[str, Emoji]
1264+
:return: A list of user objects
1265+
:rtype: List[User]
1266+
"""
1267+
if not self._client:
1268+
raise AttributeError("HTTPClient not found!")
1269+
1270+
_all_users: List[User] = []
1271+
1272+
_emoji = (
1273+
f":{emoji.name.replace(':', '')}:{emoji.id or ''}"
1274+
if isinstance(emoji, Emoji)
1275+
else emoji
1276+
)
1277+
1278+
res: List[dict] = await self._client.get_reactions_of_emoji(
1279+
channel_id=int(self.channel_id), message_id=int(self.id), emoji=_emoji, limit=100
1280+
)
1281+
1282+
while len(res) == 100:
1283+
_after = int(res[-1]["id"])
1284+
_all_users.extend(User(**_) for _ in res)
1285+
res: List[dict] = await self._client.get_reactions_of_emoji(
1286+
channel_id=int(self.channel_id),
1287+
message_id=int(self.id),
1288+
emoji=_emoji,
1289+
limit=100,
1290+
after=_after,
1291+
)
1292+
1293+
_all_users.extend(User(**_) for _ in res)
1294+
1295+
return _all_users
1296+
12311297
@classmethod
12321298
async def get_from_url(cls, url: str, client: "HTTPClient") -> "Message": # noqa,
12331299
"""

0 commit comments

Comments
 (0)