Hook system improvements
+ Allow assigning multiple hook types to a class. + Add hook types, that are executed (almost) on every occasion.
This commit is contained in:
parent
d4b2efe048
commit
e66ed05ef7
2 changed files with 23 additions and 23 deletions
|
@ -11,36 +11,35 @@ class HookMan:
|
||||||
def __new__(cls):
|
def __new__(cls):
|
||||||
return reduce(lambda x, y: y(x), cls.hooks, super(HookMan, cls).__new__(cls))
|
return reduce(lambda x, y: y(x), cls.hooks, super(HookMan, cls).__new__(cls))
|
||||||
|
|
||||||
def execute_hooks(self, hook_type, *args, **kwargs):
|
def execute_hooks(self, hook_type, isAdminAction=False, *args, **kwargs):
|
||||||
if hook_type not in self.hooks:
|
if hook_type not in self.hooks:
|
||||||
return
|
hook_type = None
|
||||||
|
|
||||||
for hook in self.hooks[hook_type]:
|
if isAdminAction:
|
||||||
print(f"Executing hook {hook.__name__}")
|
admin_hooks = self.hooks["admin*"]
|
||||||
|
else:
|
||||||
|
admin_hooks = []
|
||||||
|
|
||||||
|
for hook in \
|
||||||
|
(lambda: self.hooks[hook_type] if hook_type in self.hooks else [])() \
|
||||||
|
+ (lambda: self.hooks["*"] if "*" in self.hooks else [])() \
|
||||||
|
+ admin_hooks:
|
||||||
|
print(f"\tExecuting hook {hook.__name__}")
|
||||||
try:
|
try:
|
||||||
hook()(*args, **kwargs)
|
hook()(hook_type=hook_type, isAdminAction=isAdminAction, *args, **kwargs)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise HookException(exc)
|
raise HookException(exc)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def add_hook(cls, func, *args, **kwargs):
|
def add_hook(cls, func, *args, **kwargs):
|
||||||
"""Adds a hook."""
|
"""Adds a hook."""
|
||||||
hook_type = func.hook_type
|
hook_types = func.hook_type
|
||||||
if hook_type in cls.hooks:
|
for hook_type in hook_types:
|
||||||
cls.hooks[hook_type] = cls.hooks[hook_type] + [func]
|
if hook_type in cls.hooks:
|
||||||
else:
|
cls.hooks[hook_type] = cls.hooks[hook_type] + [func]
|
||||||
cls.hooks[hook_type] = [func]
|
else:
|
||||||
|
cls.hooks[hook_type] = [func]
|
||||||
|
|
||||||
|
|
||||||
hook = HookMan()
|
hook = HookMan()
|
||||||
|
|
||||||
# @hook.add_hook
|
|
||||||
# class example_hook:
|
|
||||||
# """Example hook."""
|
|
||||||
# hook_type = "player_login"
|
|
||||||
#
|
|
||||||
# def __call__(self, *args, **kwargs):
|
|
||||||
# print("Hook player_login,", kwargs)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
hook.execute_hooks("player_login", hello="john")
|
|
||||||
|
|
|
@ -11,8 +11,9 @@ hook = hook_system.hook
|
||||||
class Login:
|
class Login:
|
||||||
# Different hook types are executed at different places.
|
# Different hook types are executed at different places.
|
||||||
# In this case, the hook is executed when a user logs in.
|
# In this case, the hook is executed when a user logs in.
|
||||||
|
#
|
||||||
# Check the documentation for more hook types.
|
# Check the documentation for more hook types.
|
||||||
hook_type = "player_login"
|
hook_type = ["player_login"]
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, hook_type, *args, **kwargs):
|
||||||
print("LOGIN HOOK:", args, kwargs)
|
print("LOGIN HOOK:", args, kwargs)
|
||||||
|
|
Loading…
Reference in a new issue