mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-07-28 08:41:29 +00:00
🚧 basically completed event serialize
This commit is contained in:
@ -0,0 +1,4 @@
|
||||
from .base import Event, SenderInfo, PrivateSenderInfo, SenderGroup
|
||||
from .message import *
|
||||
from .notice import *
|
||||
from .request import *
|
@ -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:
|
||||
|
@ -1,31 +0,0 @@
|
||||
from typing import List, Dict
|
||||
from typing_extensions import Literal
|
||||
|
||||
EventType = Literal["message", "notice", "request", "meta_event"]
|
||||
|
||||
_EVENT_CLASSIFY: Dict[EventType, List[str]] = {
|
||||
# XXX Reference: https://github.com/project-mirai/mirai-api-http/blob/v1.9.7/docs/EventType.md
|
||||
'meta_event': [
|
||||
'BotOnlineEvent', 'BotOfflineEventActive', 'BotOfflineEventForce',
|
||||
'BotOfflineEventDropped', 'BotReloginEvent'
|
||||
],
|
||||
'notice': [
|
||||
'BotGroupPermissionChangeEvent', 'BotMuteEvent', 'BotUnmuteEvent',
|
||||
'BotJoinGroupEvent', 'BotLeaveEventActive', 'BotLeaveEventKick',
|
||||
'GroupRecallEvent', 'FriendRecallEvent', 'GroupNameChangeEvent',
|
||||
'GroupEntranceAnnouncementChangeEvent', 'GroupMuteAllEvent',
|
||||
'GroupAllowAnonymousChatEvent', 'GroupAllowConfessTalkEvent',
|
||||
'GroupAllowMemberInviteEvent', 'MemberJoinEvent',
|
||||
'MemberLeaveEventKick', 'MemberLeaveEventQuit', 'MemberCardChangeEvent',
|
||||
'MemberSpecialTitleChangeEvent', 'MemberPermissionChangeEvent',
|
||||
'MemberMuteEvent', 'MemberUnmuteEvent'
|
||||
],
|
||||
'request': [
|
||||
'NewFriendRequestEvent', 'MemberJoinRequestEvent',
|
||||
'BotInvitedJoinGroupRequestEvent'
|
||||
],
|
||||
'message': ['GroupMessage', 'FriendMessage', 'TempMessage']
|
||||
}
|
||||
EVENT_TYPES: Dict[str, EventType] = {}
|
||||
for event_type, events in _EVENT_CLASSIFY.items():
|
||||
_EVENT_TYPES.update({k: event_type for k in events}) # type: ignore
|
40
nonebot/adapters/mirai/event/message.py
Normal file
40
nonebot/adapters/mirai/event/message.py
Normal file
@ -0,0 +1,40 @@
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from pydantic import Field
|
||||
from .base import Event, SenderInfo, PrivateSenderInfo
|
||||
|
||||
from ..message import MessageChain
|
||||
from nonebot.typing import overrides
|
||||
|
||||
|
||||
class MessageEvent(Event):
|
||||
message_chain: MessageChain = Field(alias='messageChain')
|
||||
sender: SenderInfo
|
||||
|
||||
@overrides(Event)
|
||||
def get_message(self) -> MessageChain:
|
||||
return self.message_chain
|
||||
|
||||
@overrides(Event)
|
||||
def get_plaintext(self) -> str:
|
||||
return self.message_chain.__str__()
|
||||
|
||||
@overrides(Event)
|
||||
def get_user_id(self) -> str:
|
||||
return str(self.sender.id)
|
||||
|
||||
@overrides(Event)
|
||||
def get_session_id(self) -> str:
|
||||
return self.get_user_id()
|
||||
|
||||
|
||||
class GroupMessage(MessageEvent):
|
||||
pass
|
||||
|
||||
|
||||
class FriendMessage(MessageEvent):
|
||||
sender: PrivateSenderInfo
|
||||
|
||||
|
||||
class TempMessage(MessageEvent):
|
||||
pass
|
@ -5,34 +5,34 @@ from pydantic import Field
|
||||
from .base import Event, SenderGroup, SenderInfo, SenderPermission
|
||||
|
||||
|
||||
class BaseNoticeEvent(Event):
|
||||
class NoticeEvent(Event):
|
||||
pass
|
||||
|
||||
|
||||
class BaseMuteEvent(BaseNoticeEvent):
|
||||
class MuteEvent(NoticeEvent):
|
||||
operator: SenderInfo
|
||||
|
||||
|
||||
class BotMuteEvent(BaseMuteEvent):
|
||||
class BotMuteEvent(MuteEvent):
|
||||
pass
|
||||
|
||||
|
||||
class BotUnmuteEvent(BaseMuteEvent):
|
||||
class BotUnmuteEvent(MuteEvent):
|
||||
pass
|
||||
|
||||
|
||||
class MemberMuteEvent(BaseMuteEvent):
|
||||
class MemberMuteEvent(MuteEvent):
|
||||
duration_seconds: int = Field(alias='durationSeconds')
|
||||
member: SenderInfo
|
||||
operator: Optional[SenderInfo] = None
|
||||
|
||||
|
||||
class MemberUnmuteEvent(BaseMuteEvent):
|
||||
class MemberUnmuteEvent(MuteEvent):
|
||||
member: SenderInfo
|
||||
operator: Optional[SenderInfo] = None
|
||||
|
||||
|
||||
class BotJoinGroupEvent(BaseNoticeEvent):
|
||||
class BotJoinGroupEvent(NoticeEvent):
|
||||
group: SenderGroup
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@ class BotLeaveEventKick(BotJoinGroupEvent):
|
||||
pass
|
||||
|
||||
|
||||
class MemberJoinEvent(BaseNoticeEvent):
|
||||
class MemberJoinEvent(NoticeEvent):
|
||||
member: SenderInfo
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ class MemberLeaveEventKick(MemberJoinEvent):
|
||||
operator: Optional[SenderInfo] = None
|
||||
|
||||
|
||||
class FriendRecallEvent(BaseNoticeEvent):
|
||||
class FriendRecallEvent(NoticeEvent):
|
||||
author_id: int = Field(alias='authorId')
|
||||
message_id: int = Field(alias='messageId')
|
||||
time: int
|
||||
@ -68,7 +68,7 @@ class GroupRecallEvent(FriendRecallEvent):
|
||||
operator: Optional[SenderInfo] = None
|
||||
|
||||
|
||||
class GroupStateChangeEvent(BaseNoticeEvent):
|
||||
class GroupStateChangeEvent(NoticeEvent):
|
||||
origin: Any
|
||||
current: Any
|
||||
group: SenderGroup
|
||||
@ -105,7 +105,7 @@ class GroupAllowMemberInviteEvent(GroupStateChangeEvent):
|
||||
current: bool
|
||||
|
||||
|
||||
class MemberStateChangeEvent(BaseNoticeEvent):
|
||||
class MemberStateChangeEvent(NoticeEvent):
|
||||
member: SenderInfo
|
||||
operator: Optional[SenderInfo] = None
|
||||
|
||||
|
@ -1 +1,26 @@
|
||||
from pydantic import Field
|
||||
|
||||
from .base import Event
|
||||
|
||||
|
||||
class RequestEvent(Event):
|
||||
event_id: int = Field(alias='eventId')
|
||||
message: str
|
||||
nick: str
|
||||
|
||||
|
||||
class NewFriendRequestEvent(RequestEvent):
|
||||
from_id: int = Field(alias='fromId')
|
||||
group_id: int = Field(0, alias='groupId')
|
||||
|
||||
|
||||
class MemberJoinRequestEvent(RequestEvent):
|
||||
from_id: int = Field(alias='fromId')
|
||||
group_id: int = Field(alias='groupId')
|
||||
group_name: str = Field(alias='groupName')
|
||||
|
||||
|
||||
class BotInvitedJoinGroupRequestEvent(RequestEvent):
|
||||
from_id: int = Field(alias='fromId')
|
||||
group_id: int = Field(alias='groupId')
|
||||
group_name: str = Field(alias='groupName')
|
||||
|
Reference in New Issue
Block a user