Skip to content

Commit

Permalink
Fix behaviour of ScheduledEvent subs iterator (Pycord-Development#810)
Browse files Browse the repository at this point in the history
  • Loading branch information
Middledot authored Jan 21, 2022
1 parent c3265c2 commit 2e48b7d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 9 deletions.
8 changes: 6 additions & 2 deletions discord/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -1667,9 +1667,13 @@ def get_scheduled_event_users(
params = {
'limit': int(limit),
'with_member': int(with_member),
'before': int(before),
'after': int(after),
}

if before is not None:
params["before"] = int(before)

if after is not None:
params["after"] = int(after)

return self.request(Route('GET', '/guilds/{guild_id}/scheduled-events/{event_id}/users', guild_id=guild_id, event_id=event_id), params=params)

Expand Down
26 changes: 20 additions & 6 deletions discord/iterators.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
from .guild import Guild
from .threads import Thread
from .abc import Snowflake
from .scheduled_events import ScheduledEvent

T = TypeVar('T')
OT = TypeVar('OT')
Expand Down Expand Up @@ -754,7 +755,14 @@ def create_thread(self, data: ThreadPayload) -> Thread:


class ScheduledEventSubscribersIterator(_AsyncIterator[Union["User", "Member"]]):
def __init__(self, event, limit, with_member=False, before=None, after=None):
def __init__(
self,
event: ScheduledEvent,
limit: int,
with_member: bool = False,
before: Union[datetime.datetime, int] = None,
after: Union[datetime.datetime, int] = None,
):
if isinstance(before, datetime.datetime):
before = Object(id=time_snowflake(before, high=False))
if isinstance(after, datetime.datetime):
Expand Down Expand Up @@ -790,24 +798,30 @@ def _get_retrieve(self):
def member_from_payload(self, data):
from .member import Member

member = data.pop('member', None)
member['user'] = data
user = data.pop('user')

member = data.pop('member')
member['user'] = user

return Member(data=member, guild=self.event.guild, state=self.event._state)

def user_from_payload(self, data):
from .user import User

return User(state=self.event._state, data=data)
user = data.pop('user')

return User(state=self.event._state, data=user)

async def fill_subs(self):
if self._get_retrieve():
before = self.before.id if self.before else None
after = self.after.id if self.after else None
data = await self.get_subscribers(guild_id=self.event.guild.id, event_id=self.event.id, limit=self.retrieve, with_member=self.with_member, before=before, after=after)
if data:
self.limit -= self.retrieve

for element in reversed(data):
if 'member' in element:
self.subscribers.put(self.member_from_payload(element))
await self.subscribers.put(self.member_from_payload(element))
else:
self.subscribers.put(self.user_from_payload(element))
await self.subscribers.put(self.user_from_payload(element))
2 changes: 1 addition & 1 deletion discord/scheduled_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ async def cancel(self, *, reason: Optional[str] = None) -> None:
def subscribers(
self,
*,
limit: Optional[int] = None,
limit: int = 100,
as_member: bool = False,
before: Optional[Union[Snowflake, datetime.datetime]] = None,
after: Optional[Union[Snowflake, datetime.datetime]] = None,
Expand Down

0 comments on commit 2e48b7d

Please sign in to comment.