Add asyncio.Task subclass for better __repr__ for events.
This commit is contained in:
parent
db9a293f14
commit
82b54933e2
@ -93,6 +93,22 @@ def _cleanup_loop(loop):
|
||||
log.info('Closing the event loop.')
|
||||
loop.close()
|
||||
|
||||
class _ClientEventTask(asyncio.Task):
|
||||
def __init__(self, original_coro, event_name, coro, *, loop):
|
||||
super().__init__(coro, loop=loop)
|
||||
self.__event_name = event_name
|
||||
self.__original_coro = original_coro
|
||||
|
||||
def __repr__(self):
|
||||
info = [
|
||||
('state', self._state.lower()),
|
||||
('event', self.__event_name),
|
||||
('coro', repr(self.__original_coro)),
|
||||
]
|
||||
if self._exception is not None:
|
||||
info.append(('exception', repr(self._exception)))
|
||||
return '<ClientEventTask {}>'.format(' '.join('%s=%s' % t for t in info))
|
||||
|
||||
class Client:
|
||||
r"""Represents a client connection that connects to Discord.
|
||||
This class is used to interact with the Discord WebSocket and API.
|
||||
@ -257,6 +273,11 @@ class Client:
|
||||
except asyncio.CancelledError:
|
||||
pass
|
||||
|
||||
def _schedule_event(self, coro, event_name, *args, **kwargs):
|
||||
wrapped = self._run_event(coro, event_name, *args, **kwargs)
|
||||
# Schedules the task
|
||||
return _ClientEventTask(original_coro=coro, event_name=event_name, coro=wrapped, loop=self.loop)
|
||||
|
||||
def dispatch(self, event, *args, **kwargs):
|
||||
log.debug('Dispatching event %s', event)
|
||||
method = 'on_' + event
|
||||
@ -295,7 +316,7 @@ class Client:
|
||||
except AttributeError:
|
||||
pass
|
||||
else:
|
||||
asyncio.ensure_future(self._run_event(coro, method, *args, **kwargs), loop=self.loop)
|
||||
self._schedule_event(coro, method, *args, **kwargs)
|
||||
|
||||
async def on_error(self, event_method, *args, **kwargs):
|
||||
"""|coro|
|
||||
|
@ -125,8 +125,7 @@ class BotBase(GroupMixin):
|
||||
super().dispatch(event_name, *args, **kwargs)
|
||||
ev = 'on_' + event_name
|
||||
for event in self.extra_events.get(ev, []):
|
||||
coro = self._run_event(event, event_name, *args, **kwargs)
|
||||
asyncio.ensure_future(coro, loop=self.loop)
|
||||
self._schedule_event(event, ev, *args, **kwargs)
|
||||
|
||||
async def close(self):
|
||||
for extension in tuple(self.__extensions):
|
||||
|
Loading…
x
Reference in New Issue
Block a user