Make sure that the chunker task only runs once.
This commit is contained in:
parent
ba2dad2093
commit
c9565e57d3
@ -61,6 +61,7 @@ class ConnectionState:
|
|||||||
self.syncer = syncer
|
self.syncer = syncer
|
||||||
self.is_bot = None
|
self.is_bot = None
|
||||||
self.shard_count = None
|
self.shard_count = None
|
||||||
|
self._ready_task = None
|
||||||
self._fetch_offline = options.get('fetch_offline_members', True)
|
self._fetch_offline = options.get('fetch_offline_members', True)
|
||||||
self._listeners = []
|
self._listeners = []
|
||||||
self.clear()
|
self.clear()
|
||||||
@ -225,35 +226,43 @@ class ConnectionState:
|
|||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def _delay_ready(self):
|
def _delay_ready(self):
|
||||||
launch = self._ready_state.launch
|
|
||||||
|
|
||||||
# only real bots wait for GUILD_CREATE streaming
|
|
||||||
if self.is_bot:
|
|
||||||
while not launch.is_set():
|
|
||||||
# this snippet of code is basically waiting 2 seconds
|
|
||||||
# until the last GUILD_CREATE was sent
|
|
||||||
launch.set()
|
|
||||||
yield from asyncio.sleep(2, loop=self.loop)
|
|
||||||
|
|
||||||
guilds = self._ready_state.guilds
|
|
||||||
if self._fetch_offline:
|
|
||||||
yield from self.request_offline_members(guilds)
|
|
||||||
|
|
||||||
# remove the state
|
|
||||||
try:
|
try:
|
||||||
del self._ready_state
|
launch = self._ready_state.launch
|
||||||
except AttributeError:
|
|
||||||
pass # already been deleted somehow
|
|
||||||
|
|
||||||
# call GUILD_SYNC after we're done chunking
|
# only real bots wait for GUILD_CREATE streaming
|
||||||
if not self.is_bot:
|
if self.is_bot:
|
||||||
log.info('Requesting GUILD_SYNC for %s guilds' % len(self.guilds))
|
while not launch.is_set():
|
||||||
yield from self.syncer([s.id for s in self.guilds])
|
# this snippet of code is basically waiting 2 seconds
|
||||||
|
# until the last GUILD_CREATE was sent
|
||||||
|
launch.set()
|
||||||
|
yield from asyncio.sleep(2, loop=self.loop)
|
||||||
|
|
||||||
# dispatch the event
|
guilds = self._ready_state.guilds
|
||||||
self.dispatch('ready')
|
if self._fetch_offline:
|
||||||
|
yield from self.request_offline_members(guilds)
|
||||||
|
|
||||||
|
# remove the state
|
||||||
|
try:
|
||||||
|
del self._ready_state
|
||||||
|
except AttributeError:
|
||||||
|
pass # already been deleted somehow
|
||||||
|
|
||||||
|
# call GUILD_SYNC after we're done chunking
|
||||||
|
if not self.is_bot:
|
||||||
|
log.info('Requesting GUILD_SYNC for %s guilds' % len(self.guilds))
|
||||||
|
yield from self.syncer([s.id for s in self.guilds])
|
||||||
|
except asyncio.CancelledError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
# dispatch the event
|
||||||
|
self.dispatch('ready')
|
||||||
|
finally:
|
||||||
|
self._ready_task = None
|
||||||
|
|
||||||
def parse_ready(self, data):
|
def parse_ready(self, data):
|
||||||
|
if self._ready_task is not None:
|
||||||
|
self._ready_task.cancel()
|
||||||
|
|
||||||
self._ready_state = ReadyState(launch=asyncio.Event(), guilds=[])
|
self._ready_state = ReadyState(launch=asyncio.Event(), guilds=[])
|
||||||
self.clear()
|
self.clear()
|
||||||
self.user = ClientUser(state=self, data=data['user'])
|
self.user = ClientUser(state=self, data=data['user'])
|
||||||
@ -277,7 +286,7 @@ class ConnectionState:
|
|||||||
self._add_private_channel(factory(me=self.user, data=pm, state=self))
|
self._add_private_channel(factory(me=self.user, data=pm, state=self))
|
||||||
|
|
||||||
self.dispatch('connect')
|
self.dispatch('connect')
|
||||||
compat.create_task(self._delay_ready(), loop=self.loop)
|
self._ready_task = compat.create_task(self._delay_ready(), loop=self.loop)
|
||||||
|
|
||||||
def parse_resumed(self, data):
|
def parse_resumed(self, data):
|
||||||
self.dispatch('resumed')
|
self.dispatch('resumed')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user