import builtins from loguru import logger class EventsSystem: def __init__(self): self.log = logger.bind(module="EventsSystem", prefix="EVENTS") self.__events = {} logger.debug("Injected to builtins") builtins.event = self logger.debug("EventsSystem ready") def register(self, event_name, callback): log = self.log.bind(prefix="register") log.debug(f"{event_name!r}; {callback.__name__}({callback})") if not callable(callback): return log.error(f"Bad event '{event_name}' - cannot registered") if event_name not in self.__events: self.__events.update({str(event_name): [callback]}) else: self.__events[event_name].append(callback) def call(self, event_name, *args, **kwargs): log = self.log.bind(prefix="call") funcs_data = [] if event_name in self.__events.keys(): for callback in self.__events[event_name]: log.debug(f"{event_name!r}; execute: '{callback.__name__}'; data: {args=}; {kwargs=}") try: event_data = {"event_name": event_name, "args": args, "kwargs": kwargs} funcs_data.append(callback(event_data)) except Exception as e: log.error(f"Error in {callback.__name__}. See debug.log") log.exception(e) else: log.error(f"Event '{event_name}' not found.") return funcs_data