Implement Guild.fetch_members

Also implements `MemberIterator`.
This commit is contained in:
NCPlayz
2019-06-08 00:15:39 +01:00
committed by Rapptz
parent d747f2c88b
commit 851f83c821
3 changed files with 99 additions and 1 deletions

View File

@ -587,3 +587,44 @@ class GuildIterator(_AsyncIterator):
self.limit -= retrieve
self.after = Object(id=int(data[0]['id']))
return data
class MemberIterator(_AsyncIterator):
def __init__(self, guild, limit=1, after=None):
if isinstance(after, datetime.datetime):
after = Object(id=time_snowflake(after, high=True))
self.guild = guild
self.limit = limit
self.after = after or OLDEST_OBJECT
self.state = self.guild._state
self.get_members = self.state.http.get_members
self.members = asyncio.Queue(loop=self.state.loop)
async def next(self):
if self.members.empty():
await self.fill_members()
try:
return self.members.get_nowait()
except asyncio.QueueEmpty:
raise NoMoreItems()
async def fill_members(self):
if self.limit > 0:
retrieve = self.limit if self.limit <= 1000 else 1000
after = self.after.id if self.after else None
data = await self.get_members(self.guild.id, retrieve, after)
if data:
self.limit -= retrieve
self.after = Object(id=int(data[-1]['user']['id']))
for element in reversed(data):
await self.members.put(self.create_member(element))
def create_member(self, data):
from .member import Member
return Member(data=data, guild=self.guild, state=self.state)