diff --git a/discord/client.py b/discord/client.py index 9e6067a3a..fd12d7ecd 100644 --- a/discord/client.py +++ b/discord/client.py @@ -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 ''.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| diff --git a/discord/ext/commands/bot.py b/discord/ext/commands/bot.py index a7280a9af..80511d230 100644 --- a/discord/ext/commands/bot.py +++ b/discord/ext/commands/bot.py @@ -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):