From 720a218259762eb2eba2d0b698f5ad8c2d986e89 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 2 Mar 2025 17:59:13 +0800 Subject: [PATCH] perf: simplify platform entities --- pkg/platform/types/entities.py | 76 +++------------------------------- pkg/platform/types/events.py | 33 +-------------- pkg/platform/types/message.py | 30 ++++---------- 3 files changed, 15 insertions(+), 124 deletions(-) diff --git a/pkg/platform/types/entities.py b/pkg/platform/types/entities.py index 515f6b7a..33fbefe9 100644 --- a/pkg/platform/types/entities.py +++ b/pkg/platform/types/entities.py @@ -13,27 +13,20 @@ import pydantic.v1 as pydantic class Entity(pydantic.BaseModel): """实体,表示一个用户或群。""" id: int - """QQ 号或群号。""" - @abc.abstractmethod - def get_avatar_url(self) -> str: - """头像图片链接。""" - + """ID。""" @abc.abstractmethod def get_name(self) -> str: """名称。""" class Friend(Entity): - """好友。""" + """私聊对象。""" id: typing.Union[int, str] - """QQ 号。""" + """ID。""" nickname: typing.Optional[str] """昵称。""" remark: typing.Optional[str] """备注。""" - def get_avatar_url(self) -> str: - return f'http://q4.qlogo.cn/g?b=qq&nk={self.id}&s=140' - def get_name(self) -> str: return self.nickname or self.remark or '' @@ -59,8 +52,6 @@ class Group(Entity): """群名称。""" permission: Permission """Bot 在群中的权限。""" - def get_avatar_url(self) -> str: - return f'https://p.qlogo.cn/gh/{self.id}/{self.id}/' def get_name(self) -> str: return self.name @@ -69,11 +60,11 @@ class Group(Entity): class GroupMember(Entity): """群成员。""" id: typing.Union[int, str] - """QQ 号。""" + """群员 ID。""" member_name: str - """群成员名称。""" + """群员名称。""" permission: Permission - """Bot 在群中的权限。""" + """在群中的权限。""" group: Group """群。""" special_title: str = '' @@ -84,61 +75,6 @@ class GroupMember(Entity): """最后一次发言的时间。""" mute_time_remaining: int = 0 """禁言剩余时间。""" - def get_avatar_url(self) -> str: - return f'http://q4.qlogo.cn/g?b=qq&nk={self.id}&s=140' def get_name(self) -> str: return self.member_name - - -class Client(Entity): - """来自其他客户端的用户。""" - id: typing.Union[int, str] - """识别 id。""" - platform: str - """来源平台。""" - def get_avatar_url(self) -> str: - raise NotImplementedError - - def get_name(self) -> str: - return self.platform - - -class Subject(pydantic.BaseModel): - """另一种实体类型表示。""" - id: typing.Union[int, str] - """QQ 号或群号。""" - kind: typing.Literal['Friend', 'Group', 'Stranger'] - """类型。""" - - -class Config(pydantic.BaseModel): - """配置项类型。""" - def modify(self, **kwargs) -> 'Config': - """修改部分设置。""" - for k, v in kwargs.items(): - if k in self.__fields__: - setattr(self, k, v) - else: - raise ValueError(f'未知配置项: {k}') - return self - - -class GroupConfigModel(Config): - """群配置。""" - name: str - """群名称。""" - confess_talk: bool - """是否允许坦白说。""" - allow_member_invite: bool - """是否允许成员邀请好友入群。""" - auto_approve: bool - """是否开启自动审批入群。""" - anonymous_chat: bool - """是否开启匿名聊天。""" - announcement: str = '' - """群公告。""" - - -class MemberInfoModel(Config, GroupMember): - """群成员信息。""" diff --git a/pkg/platform/types/events.py b/pkg/platform/types/events.py index ae0b6b70..867f8a83 100644 --- a/pkg/platform/types/events.py +++ b/pkg/platform/types/events.py @@ -43,21 +43,6 @@ class Event(pydantic.BaseModel): return Event -############################### -# Bot Event -class BotEvent(Event): - """Bot 自身事件。 - - Args: - type: 事件名。 - qq: Bot 的 QQ 号。 - """ - type: str - """事件名。""" - qq: int - """Bot 的 QQ 号。""" - - ############################### # Message Event class MessageEvent(Event): @@ -79,7 +64,7 @@ class MessageEvent(Event): class FriendMessage(MessageEvent): - """好友消息。 + """私聊消息。 Args: type: 事件名。 @@ -111,19 +96,3 @@ class GroupMessage(MessageEvent): @property def group(self) -> platform_entities.Group: return self.sender.group - - -class StrangerMessage(MessageEvent): - """陌生人消息。 - - Args: - type: 事件名。 - sender: 发送消息的人。 - message_chain: 消息内容。 - """ - type: str = 'StrangerMessage' - """事件名。""" - sender: platform_entities.Friend - """发送消息的人。""" - message_chain: platform_message.MessageChain - """消息内容。""" diff --git a/pkg/platform/types/message.py b/pkg/platform/types/message.py index f53193d0..b99a28b3 100644 --- a/pkg/platform/types/message.py +++ b/pkg/platform/types/message.py @@ -116,18 +116,6 @@ class MessageChain(PlatformBaseModel): print('At Me') ``` - 消息链对索引操作进行了增强。以消息组件类型为索引,获取消息链中的全部该类型的消息组件。 - ```py - plain_list = message_chain[Plain] - '[Plain("Hello World!")]' - ``` - - 可以用加号连接两个消息链。 - ```py - MessageChain(['Hello World!']) + MessageChain(['Goodbye World!']) - # 返回 MessageChain([Plain("Hello World!"), Plain("Goodbye World!")]) - ``` - """ __root__: typing.List[MessageComponent] @@ -488,9 +476,9 @@ class Quote(MessageComponent): group_id: typing.Optional[typing.Union[int, str]] = None """被引用回复的原消息所接收的群号,当为好友消息时为0。""" sender_id: typing.Optional[typing.Union[int, str]] = None - """被引用回复的原消息的发送者的QQ号。""" + """被引用回复的原消息的发送者的ID。""" target_id: typing.Optional[typing.Union[int, str]] = None - """被引用回复的原消息的接收者者的QQ号(或群号)。""" + """被引用回复的原消息的接收者者的ID或群ID。""" origin: MessageChain """被引用回复的原消息的消息链对象。""" @@ -504,7 +492,7 @@ class At(MessageComponent): type: str = "At" """消息组件类型。""" target: typing.Union[int, str] - """群员 QQ 号。""" + """群员 ID。""" display: typing.Optional[str] = None """At时显示的文字,发送消息时无效,自动使用群名片。""" def __eq__(self, other): @@ -527,9 +515,9 @@ class Image(MessageComponent): type: str = "Image" """消息组件类型。""" image_id: typing.Optional[str] = None - """图片的 image_id,群图片与好友图片格式不同。不为空时将忽略 url 属性。""" + """图片的 image_id,不为空时将忽略 url 属性。""" url: typing.Optional[pydantic.HttpUrl] = None - """图片的 URL,发送时可作网络图片的链接;接收时为腾讯图片服务器的链接,可用于图片下载。""" + """图片的 URL,发送时可作网络图片的链接;接收时为图片的链接,可用于图片下载。""" path: typing.Union[str, Path, None] = None """图片的路径,发送本地图片。""" base64: typing.Optional[str] = None @@ -663,7 +651,7 @@ class Voice(MessageComponent): voice_id: typing.Optional[str] = None """语音的 voice_id,不为空时将忽略 url 属性。""" url: typing.Optional[str] = None - """语音的 URL,发送时可作网络语音的链接;接收时为腾讯语音服务器的链接,可用于语音下载。""" + """语音的 URL,发送时可作网络语音的链接;接收时为语音文件的链接,可用于语音下载。""" path: typing.Optional[str] = None """语音的路径,发送本地语音。""" base64: typing.Optional[str] = None @@ -691,8 +679,6 @@ class Voice(MessageComponent): ): """下载语音到本地。 - 语音采用 silk v3 格式,silk 格式的编码解码请使用 [graiax-silkcoder](https://pypi.org/project/graiax-silkcoder/)。 - Args: filename: 下载到本地的文件路径。与 `directory` 二选一。 directory: 下载到本地的文件夹路径。与 `filename` 二选一。 @@ -750,13 +736,13 @@ class Voice(MessageComponent): class ForwardMessageNode(pydantic.BaseModel): """合并转发中的一条消息。""" sender_id: typing.Optional[typing.Union[int, str]] = None - """发送人QQ号。""" + """发送人ID。""" sender_name: typing.Optional[str] = None """显示名称。""" message_chain: typing.Optional[MessageChain] = None """消息内容。""" message_id: typing.Optional[int] = None - """消息的 message_id,可以只使用此属性,从缓存中读取消息内容。""" + """消息的 message_id。""" time: typing.Optional[datetime] = None """发送时间。""" @pydantic.validator('message_chain', check_fields=False)