aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--discord/client.py22
-rw-r--r--discord/ext/commands/bot.py19
2 files changed, 18 insertions, 23 deletions
diff --git a/discord/client.py b/discord/client.py
index c9ada5df..c93a4972 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 17772cc5..589e4a6b 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):