diff --git a/arclet/letoderea/__init__.py b/arclet/letoderea/__init__.py index f64e055..523800a 100644 --- a/arclet/letoderea/__init__.py +++ b/arclet/letoderea/__init__.py @@ -6,7 +6,7 @@ from .entities.publisher import Publisher from .entities.decorator import TemplateDecorator from .entities.subscriber import Subscriber -from .utils import Condition_T +from .utils import Condition_T, search_event, event_class_generator class EventSystem: @@ -29,17 +29,17 @@ def __init__( def event_spread(self, target: Union[TemplateEvent, Dict[str, Any]]): if (datetime.now() - self.last_run).total_seconds() >= self.safety_interval: try: - for pub in self.publisher_generator(): + for pub in self.publisher_generator(target): if pub.on_event(target): self.loop.create_task(pub.current_executor) except asyncio.CancelledError: return self.last_run = datetime.now() - def publisher_generator(self): + def publisher_generator(self, current_event): return list( filter( - lambda x: all([condition.judge() for condition in x.external_conditions]), + lambda x: all([condition.judge(current_event) for condition in x.external_conditions]), self.publisher_list, ) ) @@ -56,19 +56,6 @@ def get_publisher(self, target: Type[TemplateEvent]): def remove_publisher(self, target): self.publisher_list.remove(target) - @staticmethod - def event_class_generator(target=TemplateEvent): - for i in target.__subclasses__(): - yield i - if i.__subclasses__(): - yield from EventSystem.event_class_generator(i) - - @staticmethod - def search_event(name: str): - for i in EventSystem.event_class_generator(): - if i.__name__ == name: - return i - def register( self, event: Union[str, Type[TemplateEvent]], @@ -79,9 +66,12 @@ def register( ): if isinstance(event, str): name = event - event = self.search_event(event) + event = search_event(event) if not event: raise Exception(name + " cannot found!") + + events = [event] + events.extend(event_class_generator(event)) conditions = conditions or [] decorators = decorators or [] @@ -92,18 +82,19 @@ def register_wrapper(exec_target): priority=priority, decorators=decorators ) - may_publishers = self.get_publisher(event) - _event_handler = EventDelegate(event=event) - _event_handler += exec_target - if not may_publishers: - self.publisher_list.append(Publisher(conditions, _event_handler)) - else: - for m_publisher in may_publishers: - if m_publisher.equal_conditions(conditions): - m_publisher += _event_handler - break - else: + for e in events: + may_publishers = self.get_publisher(e) + _event_handler = EventDelegate(event=e) + _event_handler += exec_target + if not may_publishers: self.publisher_list.append(Publisher(conditions, _event_handler)) + else: + for m_publisher in may_publishers: + if m_publisher.equal_conditions(conditions): + m_publisher += _event_handler + break + else: + self.publisher_list.append(Publisher(conditions, _event_handler)) return exec_target