Implement Guild.fetch_members
Also implements `MemberIterator`.
This commit is contained in:
@ -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)
|
||||
|
Reference in New Issue
Block a user