Skip to content

Commit 7f5b5a6

Browse files
committed
Migrate hook launching to new func launching system
1 parent 191df32 commit 7f5b5a6

3 files changed

Lines changed: 24 additions & 50 deletions

File tree

cloudbot/plugin.py

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from cloudbot.event import Event, PostHookEvent
1919
from cloudbot.hook import Priority, Action
2020
from cloudbot.util import database, async_util
21+
from cloudbot.util.func_utils import call_with_args
2122

2223
logger = logging.getLogger("cloudbot")
2324

@@ -411,39 +412,15 @@ def _log_hook(self, hook):
411412
logger.info("Loaded {}".format(hook))
412413
logger.debug("Loaded {}".format(repr(hook)))
413414

414-
def _prepare_parameters(self, hook, event):
415-
"""
416-
Prepares arguments for the given hook
417-
418-
:type hook: cloudbot.plugin.Hook
419-
:type event: cloudbot.event.Event
420-
:rtype: list
421-
"""
422-
parameters = []
423-
for required_arg in hook.required_args:
424-
if hasattr(event, required_arg):
425-
value = getattr(event, required_arg)
426-
parameters.append(value)
427-
else:
428-
logger.error("Plugin {} asked for invalid argument '{}', cancelling execution!"
429-
.format(hook.description, required_arg))
430-
logger.debug("Valid arguments are: {} ({})".format(dir(event), event))
431-
return None
432-
return parameters
433-
434415
def _execute_hook_threaded(self, hook, event):
435416
"""
436417
:type hook: Hook
437418
:type event: cloudbot.event.Event
438419
"""
439420
event.prepare_threaded()
440421

441-
parameters = self._prepare_parameters(hook, event)
442-
if parameters is None:
443-
return None
444-
445422
try:
446-
return hook.function(*parameters)
423+
return call_with_args(hook.function, event)
447424
finally:
448425
event.close_threaded()
449426

@@ -455,12 +432,8 @@ def _execute_hook_sync(self, hook, event):
455432
"""
456433
yield from event.prepare()
457434

458-
parameters = self._prepare_parameters(hook, event)
459-
if parameters is None:
460-
return None
461-
462435
try:
463-
return (yield from hook.function(*parameters))
436+
return (yield from call_with_args(hook.function, event))
464437
finally:
465438
yield from event.close()
466439

cloudbot/util/func_utils.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
import inspect
22

33

4+
class ParameterError(Exception):
5+
def __init__(self, name, valid_args):
6+
self.name = name
7+
self.valid_args = list(valid_args)
8+
9+
def __str__(self):
10+
return "'{}' is not a valid parameter, valid parameters are: {}".format(self.name, self.valid_args)
11+
12+
413
def call_with_args(func, arg_data):
514
sig = inspect.signature(func)
6-
args = [arg_data[key] for key in sig.parameters.keys() if not key.startswith('_')]
15+
try:
16+
args = [arg_data[key] for key in sig.parameters.keys() if not key.startswith('_')]
17+
except KeyError as e:
18+
raise ParameterError(e.args[0], arg_data.keys()) from e
19+
720
return func(*args)

plugins/core/cap.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import asyncio
2-
import inspect
2+
from collections import ChainMap
33
from functools import partial
44

55
from cloudbot import hook
@@ -56,24 +56,12 @@ def _decorate(func):
5656
def _launch_handler(subcmd, event, **kwargs):
5757
subcmd = subcmd.upper()
5858
kwargs["subcmd"] = subcmd
59-
handler = HANDLERS.get(subcmd)
60-
if handler:
61-
sig = inspect.signature(handler)
62-
args = []
63-
64-
for arg in sig.parameters.keys():
65-
if arg in kwargs:
66-
args.append(kwargs[arg])
67-
else:
68-
try:
69-
value = getattr(event, arg)
70-
except AttributeError:
71-
event.logger.warning("CAP subcommand handler requested unknown argument: %s", arg)
72-
return
73-
else:
74-
args.append(value)
75-
76-
yield from async_util.run_func(event.loop, handler, *args)
59+
try:
60+
handler = HANDLERS[subcmd]
61+
except LookupError:
62+
return
63+
64+
yield from async_util.run_func_with_args(event.loop, handler, ChainMap(event, kwargs))
7765

7866

7967
@_subcmd_handler("LS")

0 commit comments

Comments
 (0)