Skip to content

Lunar X 插件规范文档

本文档基于 Lunar X 框架的源代码整理,详细描述了插件的开发规范、事件模型、消息处理机制、用户权限管理以及可用的 Bot API 接口,旨在作为全面的开发者参考手册使用。

目录

  1. 插件基础与元数据
  2. 事件处理核心函数与流程
  3. 消息事件处理与内容获取 (重点)
  4. 消息段构造与发送 (lunar.msg)
  5. LunarBot API 接口 (lunar 对象)
  6. 权限管理与用户组判断 (重要)
  7. 事件类型完整列表

一、 插件基础与元数据

插件通常是一个 Python 文件(.py)或包含 setup.py 的目录,位于 plugins 文件夹内。

1. 插件元数据(必须在插件文件中定义)

参数名类型必须描述示例值
TRIGGHT_KEYWORDstr插件的触发关键词。如果消息以 Bot 配置的触发符 + 该关键词开头,则触发插件。设置为 'Any' 则对所有事件(包括非消息事件)都进行触发。'help', 'Any', '天气'
PLT_STint插件的优先级。数字越小,优先级越高,越早处理事件。默认值为 99910, 100, 999
HELP_MESSAGEstr插件的帮助信息,用于 Bot 的帮助命令展示。'查询当前城市天气'

2. 插件生命周期与事件处理函数

插件通过实现以下异步函数来响应事件:

函数名参数签名描述返回值
on_messageasync def on_message(event: Event, lunar: LunarBot)主要事件处理函数。 当事件满足 TRIGGHT_KEYWORD 定义的触发条件时被调用。bool。返回 True 表示事件已被处理并阻断后续插件继续处理;返回 False 或不返回则事件继续传递。
on_lunar_eventasync def on_lunar_event(event: Event, lunar: LunarBot)框架事件处理函数。 专门用于处理框架级别的生命周期事件,如 LunarStartListenLunarStopListen,以及所有非消息事件(如通知、请求)。bool。返回 True 表示事件已被处理并阻断后续插件继续处理。

二、 事件处理核心函数与流程

1. 事件处理流程

  1. 消息预处理: 检查消息是否以 Bot 配置的 trigger_keyword(例如 /)开头。
  2. 命令解析: 如果是命令,解析出 event.commandevent.args
  3. 插件筛选: 插件管理器遍历所有已加载插件,检查 TRIGGHT_KEYWORD 是否匹配。
  4. 优先级排序:PLT_ST 优先级(数字越小越优先)排序。
  5. 调用 on_message 按顺序调用插件的 on_message 函数。
  6. 阻断机制: 如果任何插件的 on_message 返回 True,则事件处理停止,后续插件不再被调用。

TIP

当插件为永久触发插件(即TRIGGHT_KEYWORD为Any),请务必通过if isinstance(event, Events.事件类型):来判断是否你需要的事件,防止报错,具体事件类似有哪些请参考下文事件类型完整列表

2. 日志记录(推荐方式)

Lunar X 框架会自动重定向插件内的 print() 函数,但推荐使用 lunar.plugin_logger 以获得更专业的日志控制。

python
# 推荐使用 lunar.plugin_logger
lunar.plugin_logger.info("使用专用 logger 输出信息。")
lunar.plugin_logger.error("这是一个错误日志。")

三、 消息事件处理与内容获取 (重点)

on_message 收到消息事件 (MessageEvent 及其子类) 时,开发者应关注以下属性:

1. 消息事件核心属性(MessageEvent

属性类型描述开发者使用方式
user_idint消息发送者 QQ 号。event.user_id
group_idOptional[int]仅群消息事件有。event.group_id
messageList[BaseSegment]已解析的消息段列表。 包含文本、图片、@等元素。event.message
raw_messagestr原始消息字符串(CQ 码格式)。event.raw_message
get_text()str获取消息的纯文本内容(包含 @ 消息的文本)。event.get_text()

2. 命令/关键词解析属性

这些属性由框架在消息事件中自动设置:

属性类型描述
is_commandbool消息是否以 Bot 触发符开头。
commandOptional[str]如果是命令,则为命令名(即插件的 TRIGGHT_KEYWORD)。
argsOptional[str]如果是命令,则为命令参数部分(命令名之后的所有文本)。
processed_textOptional[str]推荐使用。 如果是命令,则为 args;如果是关键词触发,则为去除关键词后的剩余文本;否则为 get_text()

3. 消息解析工具 (lunar.reply)

lunar.replyReplyUtils 的实例,提供了便捷的消息段解析方法:

方法名签名描述
extract_reply_id(event_message: List[BaseSegment]) -> Optional[str]从消息段列表中提取 ReplySegment 中的消息 ID。
extract_mentioned_users(event_message: List[BaseSegment]) -> List[int]从消息段列表中提取所有被 @ 的用户 ID 列表。
get_plain_text(event_message: List[BaseSegment]) -> str从消息段列表中提取所有纯文本内容并拼接,不包含 @ 消息的文本。

四、 消息段构造与发送 (lunar.msg)

lunar.msgMessageBuilder 的实例,用于创建消息段对象,是发送复杂消息的基础。

1. 消息段构造方法

方法名对应的消息段类参数描述
lunar.msg.textTextSegmenttext: str纯文本。
lunar.msg.atAtSegmentuser_id: int@ 某人。
lunar.msg.imageImageSegmentfile: str, cache: bool, proxy: bool, timeout: int图片。file 可为 URL、本地路径或 Base64。
lunar.msg.faceFaceSegmentface_id: intQQ 表情。
lunar.msg.recordRecordSegmentfile: str, magic: bool, proxy: bool, timeout: int语音。file 可为 URL、本地路径或 Base64。
lunar.msg.replyReplySegmentmessage_id: Union[int, str]回复指定消息。
lunar.msg.forward_nodeForwardNodeSegmentuser_id: int, nickname: str, content: List[BaseSegment]合并转发消息中的一个节点。
lunar.msg.combineList[BaseSegment]*message_segments: Union[BaseSegment, str, Dict]组合多个消息段为一个列表。

2. 消息发送 API

方法名签名描述
lunar.sendasync def send(message, user_id=None, group_id=None)发送消息。message 可为 strBaseSegmentList[BaseSegment] 等。必须指定 user_idgroup_id
lunar.send_forward_msgasync def send_forward_msg(messages, group_id=None, user_id=None)发送合并转发消息。messagesList[ForwardNodeSegment]

五、 LunarBot API 接口 (lunar 对象)

lunar 对象是 LunarBot 的实例,提供了插件与 Bot 核心功能和 OneBot 协议交互的接口。

1. 实用属性与工具

属性名类型描述
lunar.configDict[str, Any]Bot 的配置字典(只读)。
lunar.plugin_loggerlogging.Logger专用于插件的日志记录器。
lunar.pluginsDict[str, Any]当前所有已加载插件的信息字典。
lunar.replyReplyUtils消息解析工具(见 三、3)。
lunar.msgMessageBuilder消息段构造器(见 四、1)。
lunar.self_idintBot 自身的 QQ 号。

2. 通用 自定义 API 调用

lunar.diy 属性是 DiyAPI 的实例,用于调用 OneBot 协议的任何 API。

方式一:动态属性调用(推荐)

将 OneBot API 名称直接作为属性调用,例如 get_group_member_info

python
member_info = await lunar.diy.get_group_member_info(
    group_id=event.group_id, 
    user_id=event.user_id,
    no_cache=True
)

方式二:泛型调用

python
response = await lunar.diy(
    action='set_group_ban',
    params={'group_id': event.group_id, 'user_id': event.user_id, 'duration': 60}
)

3. 常见 OneBot API 封装(部分)

方法名对应 OneBot API描述
lunar.del_messagedelete_msg撤回指定 ID 的消息。
lunar.get_message_detailget_msg获取指定 ID 消息的详细信息。
lunar.get_login_infoget_login_info获取 Bot 自身信息。
lunar.get_group_listget_group_list获取 Bot 加入的群列表。
lunar.set_group_kickset_group_kick踢出群成员。
lunar.set_group_banset_group_ban群成员禁言。
lunar.set_group_whole_banset_group_whole_ban群全体禁言。
Lunar X本身并没有内置太多的API调用。如需全部API,请使用自定义API(lunar.diy),全部API名称请查看
[API-OneBot-V11标准]https://283375.github.io/onebot_v11_vitepress/api/public.html

六、 权限管理与用户组判断 (重要)

Lunar X 框架内置了一个简化的权限管理系统,将用户划分为不同的权限组。插件可以通过 Event 对象或 lunar 对象提供的方法快速判断用户的权限。

1. 内置权限组定义(Bot 全局权限等级)

权限组名称权限级别描述
MEMBER0普通群成员(默认级别)。
ADMIN10群管理员。
OWNER20群主。
SUPERUSER30Bot 框架的超级用户(通常是 Bot 拥有者)。

2. 权限判断属性(已注入到 MessageEvent

on_message 函数中,当接收到 MessageEvent 时,框架会根据事件的 user_idgroup_id 自动计算并注入以下权限相关属性:

属性类型描述用途/判断对象
is_superuserbool当前用户是否为 Bot 的 超级用户 (SUPERUSER)。Bot 全局权限判断
is_group_adminbool当前用户是否为所在群的 管理员 (ADMIN) 或 群主 (OWNER)。群内身份判断
is_group_ownerbool当前用户是否为所在群的 群主 (OWNER)。群内身份判断
user_rolestr当前用户在群内的角色(member, admin, owner)。私聊事件为 member群内身份判断

3. 权限判断核心说明(重要)

插件开发中,权限判断是核心安全机制。开发者应充分利用上述注入的属性:

  • Bot 权限等级判断: 使用 event.is_superuser 判断用户是否拥有 Bot 框架的最高权限。
  • 群内身份判断: 使用 event.is_group_admin (管理员或群主) 或 event.user_role (精确角色) 来判断用户在当前群内的身份,以执行群管理操作。

4. 权限判断示例(代码片段)

python
# 仅允许超级用户使用
if not event.is_superuser:
    await lunar.send("权限不足,只有超级用户才能执行此命令。", user_id=event.user_id, group_id=event.group_id)
    return True

# 仅允许群管理员或群主使用
if event.group_id and not event.is_group_admin:
    await lunar.send("权限不足,只有群管理员或群主才能使用。", group_id=event.group_id)
    return True

5. 权限组获取方法(lunar API)

如果插件需要在非消息事件(如 NoticeEvent)中判断用户的权限,可以使用 lunar.get_user_permission 方法。

方法名签名描述
lunar.get_user_permissionasync def get_user_permission(user_id: int, group_id: Optional[int] = None) -> str获取指定用户在指定群(可选)中的最高权限组名称(返回 MEMBER, ADMIN, OWNER, SUPERUSER 之一)。

七、 事件类型完整列表

所有事件都继承自 Event 基类。插件可以通过 if isinstance(event, Events.事件类型)) 或检查 event.post_type 来判断事件类型。

A. 消息事件 (Message Events)

事件类型类名post_type关键属性描述
私聊消息PrivateMessageEventmessageuser_id, message, sender收到私聊消息。
群聊消息GroupMessageEventmessagegroup_id, user_id, message, sender, anonymous收到群聊消息。
临时会话消息GroupTempMessageEventmessagegroup_id, user_id, message, sender收到群内临时会话消息。

B. 通知事件 (Notice Events)

事件类型类名notice_type关键属性描述
群文件上传GroupUploadNoticeEventgroup_uploadgroup_id, user_id, file群内成员上传文件。
群管理员变动GroupAdminNoticeEventgroup_admingroup_id, user_id, sub_type (set/unset)群管理员设置或取消。
群成员增加GroupIncreaseNoticeEventgroup_increasegroup_id, user_id, operator_id, sub_type (approve/invite)成员入群。
群成员减少GroupDecreaseNoticeEventgroup_decreasegroup_id, user_id, operator_id, sub_type (leave/kick/kick_me)成员退群。
群禁言GroupBanNoticeEventgroup_bangroup_id, user_id, operator_id, sub_type (ban/lift_ban), duration成员被禁言或解除禁言。
好友添加FriendAddNoticeEventfriend_adduser_idBot 被添加为好友。
群消息撤回GroupRecallNoticeEventgroup_recallgroup_id, user_id, operator_id, message_id群内消息被撤回。
好友消息撤回FriendRecallNoticeEventfriend_recalluser_id, message_id好友消息被撤回。
群内戳一戳GroupPokeNoticeEventnotifygroup_id, user_id, target_id, sub_type (poke)群内被戳。
群内运气王GroupLuckyKingNoticeEventnotifygroup_id, user_id, target_id, sub_type (lucky_king)成员成为群红包运气王。
群成员荣誉变更GroupHonorNoticeEventnotifygroup_id, user_id, sub_type (honor), honor_type成员获得/失去群荣誉。
离线文件OfflineFileNoticeEventoffline_fileuser_id, file收到离线文件。
客户端状态ClientStatusNoticeEventclient_statusclient, online客户端状态变更(如手机/PC在线)。
精华消息EssenceMessageNoticeEventessencegroup_id, sender_id, operator_id, message_id消息被添加/移除精华。

C. 请求事件 (Request Events)

事件类型类名request_type关键属性描述
好友请求FriendRequestEventfrienduser_id, comment, flag收到加好友请求。
加群请求GroupAddRequestEventgroupgroup_id, user_id, comment, flag, sub_type (add)用户申请加群。
邀请 Bot 加群GroupInviteRequestEventgroupgroup_id, user_id, comment, flag, sub_type (invite)收到邀请 Bot 加群请求。

D. 元事件 (Meta Events)

事件类型类名meta_event_type关键属性描述
心跳事件HeartbeatMetaEventheartbeatstatus, intervalBot 客户端心跳包。
生命周期事件LifecycleMetaEventlifecyclesub_type (enable/disable/connect)Bot 客户端连接状态变化。

E. 框架内部事件 (Lunar X Internal Events)

事件类型类名描述处理函数
框架启动LunarStartListenLunar X 框架开始监听事件。on_lunar_event
框架停止LunarStopListenLunar X 框架停止监听事件。on_lunar_event

Released under the GPL 3 License.