diff --git a/discord/client.py b/discord/client.py index c9ada5df1..c93a49729 100644 --- a/discord/client.py +++ b/discord/client.py @@ -248,14 +248,14 @@ class Client: object.__setattr__(self, name, value) @asyncio.coroutine - def _run_event(self, event, *args, **kwargs): + def _run_event(self, coro, event_name, *args, **kwargs): try: - yield from getattr(self, event)(*args, **kwargs) + yield from coro(*args, **kwargs) except asyncio.CancelledError: pass except Exception: try: - yield from self.on_error(event, *args, **kwargs) + yield from self.on_error(event_name, *args, **kwargs) except asyncio.CancelledError: pass @@ -264,11 +264,19 @@ class Client: method = 'on_' + event handler = 'handle_' + event - if hasattr(self, handler): - getattr(self, handler)(*args, **kwargs) + try: + actual_handler = getattr(self, handler) + except AttributeError: + pass + else: + actual_handler(*args, **kwargs) - if hasattr(self, method): - compat.create_task(self._run_event(method, *args, **kwargs), loop=self.loop) + try: + coro = getattr(self, method) + except AttributeError: + pass + else: + compat.create_task(self._run_event(coro, method, *args, **kwargs), loop=self.loop) @asyncio.coroutine def on_error(self, event_method, *args, **kwargs): diff --git a/discord/ext/commands/bot.py b/discord/ext/commands/bot.py index 17772cc5e..589e4a6b6 100644 --- a/discord/ext/commands/bot.py +++ b/discord/ext/commands/bot.py @@ -164,25 +164,12 @@ class BotBase(GroupMixin): # internal helpers - @asyncio.coroutine - def _run_extra(self, coro, event_name, *args, **kwargs): - try: - yield from coro(*args, **kwargs) - except asyncio.CancelledError: - pass - except Exception: - try: - yield from self.on_error(event_name, *args, **kwargs) - except asyncio.CancelledError: - pass - def dispatch(self, event_name, *args, **kwargs): super().dispatch(event_name, *args, **kwargs) ev = 'on_' + event_name - if ev in self.extra_events: - for event in self.extra_events[ev]: - coro = self._run_extra(event, event_name, *args, **kwargs) - discord.compat.create_task(coro, loop=self.loop) + for event in self.extra_events.get(ev, []): + coro = self._run_event(event, event_name, *args, **kwargs) + discord.compat.create_task(coro, loop=self.loop) @asyncio.coroutine def close(self):