Guest User

Untitled

a guest
Feb 11th, 2023
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.36 KB | None | 0 0
  1. from typing import Any, Callable, List, TypeVar
  2. from enum import Enum
  3. from dataclasses import dataclass
  4.  
  5. class EventType(Enum):
  6.   MESSAGE = 1
  7.   MENTION = 2
  8.  
  9. class MetaEvent():
  10.   def __new__(metacls, name, bases, namespace, **kwargs):
  11.     return super().__new__(metacls, name, bases, namespace)
  12.  
  13.   def __init__(cls, name, bases, namespace, event_types: List[EventType]=[], **kwargs):
  14.     cls.event_types = event_types
  15.     super().__init__(name, bases, namespace)
  16.  
  17. class EventBase:
  18.   pass
  19.  
  20. @dataclass
  21. class RoomEvent(EventBase):
  22.   room_id: int
  23.   room_name: int
  24.  
  25. @dataclass
  26. class MessageEvent(RoomEvent, metaclass=MetaEvent, event_types=[EventType.MESSAGE]):
  27.   content: str
  28.   message_id: int
  29.   user_id: int
  30.   user_name: str
  31.  
  32. @dataclass
  33. class MentionEvent(MessageEvent, metaclass=MetaEvent, event_types=[EventType.MENTION]):
  34.   parent_id: int
  35.   target_user_id: int
  36.  
  37. EventHandler = Callable[[Any], None]
  38.  
  39. T = TypeVar("T", bound=EventBase)
  40.  
  41. class Room:
  42.   def __init__(self):
  43.     self._handlers: dict[EventType, set[EventHandler]] = {
  44.       eventType: set() for eventType in EventType
  45.     }
  46.     self.add_handler(MentionEvent, self._mentionHandler)
  47.  
  48.   def add_handler(self, cls: T, handler: Callable[[T], None]):
  49.     for event_type in cls.event_types:
  50.       self._handlers[event_type].add(handler)
  51.  
  52.   def _mentionHandler(e: MentionEvent):
  53.     pass
  54.  
Advertisement
Add Comment
Please, Sign In to add comment