Skip to content

协议实现 #2

@Fish-LP

Description

@Fish-LP

按照约定实现位于 napcat 适配器

请开启新分支
具体参考abc定义
当前协议适配器不完整


一、关键概念与约定

  • 核心抽象ProtocolABC(protocol_abc.py)定义了必须实现的方法和属性(例如 protocol_name, api, msg_builder, self_id 以及一系列 async 方法与解析方法)。
  • 注册机制:实现类需定义 protocol_name(全局唯一),会被 ProtocolMeta 自动注册。
  • 消息模型:使用 Message / MessageChain(IM.py)作为内部中立模型,需提供从/到“原始消息段(dict)”的转换。
  • API 与 WebSocket 客户端:实现中应使用或包装 APIBase(为协议 API)并用 AsyncWebSocketClient 管理 WebSocket;登录后把 client 设置到 API(示例:self._api.set_client(client))。
  • 事件分发:解析到的事件要返回 EventNone_parse_event),并在打印/记录时尽量吞错(print_event 不抛异常)。

二、必须实现的方法(简要)

ProtocolABC 约定实现(分组列举):

  • 基础属性:protocol_name, api, msg_builder, self_id
  • 基本发送/登录:send_group_message, send_private_message, login, logout
  • 数据获取:fetch_user, fetch_group, fetch_friends, fetch_groups, fetch_message, fetch_group_members, recall_message
  • 好友管理:add_friend, delete_friend, block_user, unblock_user, set_friend_remark, accept_friend_request, reject_friend_request
  • 群管理:create_group, set_group_admin, invite_to_group, kick_group_member, set_group_name, set_group_avatar, disband_group, transfer_group_ownership, leave_group
  • 个人资料:set_self_nickname, set_self_avatar, set_self_signature, update_self_profile
  • 解析方法:_parse_event, _parse_message, _parse_user, _parse_group
  • 辅助:print_event(需吞并记录异常)

Tip: 若协议不支持某功能,一致性地返回 False 或抛出 NotImplementedError,并在文档里明确说明该行为(见 NapcatProtocol 的示例)。


三、实现细节与注意事项

  • 协议名唯一性protocol_name 必须唯一,否则 ProtocolMeta 会抛 ValueError
  • 消息转换
    • 提供把 Message 转为协议段的函数(例如 _content_to_segments)。
    • 提供把协议段解析为 MessageChain 的函数(例如 _parse_message_content),并尽量使用现有 nodesdto(参见 nodes)。
  • 时间与原始数据:解析时间戳时要处理异常并回退到当前时间;保留 raw 数据到 Message.raw 方便调试。
  • 日志:使用模块 logger(如 logger = logging.getLogger("Protocol.<Name>")),打印结构化日志(可用 LogFormats)。
  • 异常处理:网络/解析错误处记录后返回合适类型(不要无意中破坏上层循环)。print_event 应保护上层不被异常影响。
  • 异步与线程安全:遵循 async 定义(不要在 async 方法中阻塞),更新状态(如 self._self_id)要谨慎。
  • 返回约定:远端 API 常返回 dict,检查 status 或 data 字段(参见 NapcatProtocol)。

注意:协议实现应保持行为一致与可测,优先参考 NapcatProtocol 的实现细节与约定。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions