Update Async logic

This commit is contained in:
Maxim Khomutov 2023-07-15 15:34:24 +03:00
parent 5f8b70a2ee
commit e9919459af
2 changed files with 53 additions and 21 deletions

View File

@ -13,51 +13,78 @@ class EventsSystem:
# TODO: default events # TODO: default events
self.log = get_logger("EventsSystem") self.log = get_logger("EventsSystem")
self.loop = asyncio.get_event_loop() self.loop = asyncio.get_event_loop()
self.as_tasks = []
self.__events = { self.__events = {
"server_started": [], "server_started": [],
"_plugins_start": [], "auth_sent_key": [], # Only sync
"auth_sent_key": [], "auth_ok": [], # Only sync
"auth_ok": [],
"chat_receive": [], "chat_receive": [],
"_plugins_unload": [],
"server_stopped": [], "server_stopped": [],
} }
self.__async_events = {
"server_started": [],
"_plugins_start": [],
"_plugins_unload": [],
"chat_receive": [],
"server_stopped": []
}
def builtins_hook(self): def builtins_hook(self):
self.log.debug("used builtins_hook") self.log.debug("used builtins_hook")
builtins.ev = self builtins.ev = self
def register_event(self, event_name, event_func): def register_event(self, event_name, event_func, async_event=False):
self.log.debug(f"register_event({event_name}, {event_func}):") self.log.debug(f"register_event({event_name}, {event_func}):")
if not callable(event_func): if not callable(event_func):
# TODO: i18n # TODO: i18n
self.log.error(f"Cannot add event '{event_name}'. " self.log.error(f"Cannot add event '{event_name}'. "
f"Use `KuiToi.add_event({event_name}', function)` instead. Skipping it...") f"Use `KuiToi.add_event({event_name}', function)` instead. Skipping it...")
return return
if event_name not in self.__events: if async_event or inspect.iscoroutinefunction(event_func):
self.__events.update({str(event_name): [event_func]}) if event_name not in self.__async_events:
self.__async_events.update({str(event_name): [event_func]})
else:
self.__async_events[event_name].append(event_func)
else: else:
self.__events[event_name].append(event_func) if event_name not in self.__events:
self.__events.update({str(event_name): [event_func]})
else:
self.__events[event_name].append(event_func)
def call_event(self, event_name, *args, **kwargs): async def call_async_event(self, event_name, *args, **kwargs):
self.log.debug(f"Using event '{event_name}'") self.log.debug(f"Calling async event: '{event_name}'")
funcs_data = [] funcs_data = []
if event_name in self.__async_events.keys():
if event_name in self.__events.keys(): for func in self.__async_events[event_name]:
for func in self.__events[event_name]:
try: try:
event_data = {"event_name": event_name, "args": args, "kwargs": kwargs} event_data = {"event_name": event_name, "args": args, "kwargs": kwargs}
if inspect.iscoroutinefunction(func): data = await func(event_data)
d = self.loop.run_until_complete(func(event_data)) funcs_data.append(data)
else:
d = func(event_data)
funcs_data.append(d)
except Exception as e: except Exception as e:
# TODO: i18n # TODO: i18n
self.log.error(f'Error while calling "{event_name}"; In function: "{func.__name__}"') self.log.error(f'Error while calling "{event_name}"; In function: "{func.__name__}"')
self.log.exception(e) self.log.exception(e)
else: else:
# TODO: i18n # TODO: i18n
self.log.warning(f"Event {event_name} does not exist. Just skipping it...") self.log.warning(f"Event {event_name} does not exist, maybe ev.call_event()?. Just skipping it...")
return funcs_data
def call_event(self, event_name, *args, **kwargs):
self.log.debug(f"Calling sync event: '{event_name}'")
funcs_data = []
if event_name in self.__events.keys():
for func in self.__events[event_name]:
try:
event_data = {"event_name": event_name, "args": args, "kwargs": kwargs}
funcs_data.append(func(event_data))
except Exception as e:
# TODO: i18n
self.log.error(f'Error while calling "{event_name}"; In function: "{func.__name__}"')
self.log.exception(e)
else:
# TODO: i18n
self.log.warning(f"Event {event_name} does not exist, maybe ev.call_async_event()?. Just skipping it...")
return funcs_data return funcs_data

View File

@ -1,6 +1,11 @@
from typing import Any
class EventsSystem: class EventsSystem:
@staticmethod @staticmethod
def register_event(event_name, event_func): ... def register_event(event_name, event_func): ...
@staticmethod @staticmethod
def call_event(event_name, *data, **kwargs): ... async def call_async_event(event_name, *args, **kwargs) -> list[Any]: ...
class ev(EventsSystem): ... @staticmethod
def call_event(event_name, *data, **kwargs) -> list[Any]: ...
class ev(EventsSystem): ...