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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions