mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-07-28 16:51:26 +00:00
🚧 basically completed event serialize
This commit is contained in:
@ -1,13 +1,12 @@
|
||||
from enum import Enum
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Dict, Any, Optional, Type
|
||||
from pydantic import BaseModel, Field, ValidationError
|
||||
from typing_extensions import Literal
|
||||
|
||||
from nonebot.adapters import Event as BaseEvent
|
||||
from nonebot.adapters import Message as BaseMessage
|
||||
from nonebot.typing import overrides
|
||||
|
||||
from .constants import EVENT_TYPES
|
||||
from nonebot.log import logger
|
||||
|
||||
|
||||
class SenderPermission(str, Enum):
|
||||
@ -29,12 +28,54 @@ class SenderInfo(BaseModel):
|
||||
group: SenderGroup
|
||||
|
||||
|
||||
class PrivateSenderInfo(BaseModel):
|
||||
id: int
|
||||
nickname: str
|
||||
remark: str
|
||||
|
||||
|
||||
class Event(BaseEvent):
|
||||
type: str
|
||||
|
||||
@classmethod
|
||||
def new(cls, data: Dict[str, Any]) -> "Event":
|
||||
type = data['type']
|
||||
|
||||
def all_subclasses(cls: Type[Event]):
|
||||
return set(cls.__subclasses__()).union(
|
||||
[s for c in cls.__subclasses__() for s in all_subclasses(c)])
|
||||
|
||||
event_class: Optional[Type[Event]] = None
|
||||
for subclass in all_subclasses(cls):
|
||||
if subclass.__name__ != type:
|
||||
continue
|
||||
event_class = subclass
|
||||
|
||||
if event_class is None:
|
||||
return Event.parse_obj(data)
|
||||
|
||||
while issubclass(event_class, Event):
|
||||
try:
|
||||
return event_class.parse_obj(data)
|
||||
except ValidationError as e:
|
||||
logger.info(
|
||||
f'Failed to parse {data} to class {event_class.__name__}: {e}. '
|
||||
'Fallback to parent class.')
|
||||
event_class = event_class.__base__
|
||||
|
||||
raise ValueError(f'Failed to serialize {data}.')
|
||||
|
||||
@overrides(BaseEvent)
|
||||
def get_type(self) -> Literal["message", "notice", "request", "meta_event"]:
|
||||
return EVENT_TYPES.get(self.type, 'meta_event')
|
||||
from . import message, notice, request
|
||||
if isinstance(self, message.MessageEvent):
|
||||
return 'message'
|
||||
elif isinstance(self, notice.NoticeEvent):
|
||||
return 'notice'
|
||||
elif isinstance(self, request.RequestEvent):
|
||||
return 'request'
|
||||
else:
|
||||
return 'meta_event'
|
||||
|
||||
@overrides(BaseEvent)
|
||||
def get_event_name(self) -> str:
|
||||
|
Reference in New Issue
Block a user