Expand description
Nagisa —— 统一在 OneBot v11 与 Milky 之上的 Rust 聊天机器人框架(门面 crate)。
这是面向使用者的唯一入口。bot 作者只依赖 nagisa(按需开 onebot / milky
feature),写 use nagisa::prelude::*;,从不直接点名底层的 engine / types /
macros / adapter 这些 crate:
ⓘ
use nagisa::prelude::*;
#[command("ping", mention_me)]
async fn ping(reply: Reply) -> HandlerResult {
reply.text("pong").await?;
Ok(())
}
#[tokio::main]
async fn main() -> Result<()> {
// ctrl_c_shutdown() 起一个后台任务,收到 SIGINT/Ctrl-C 时取消 shutdown
// token,让 bot 停机。
let shutdown = ctrl_c_shutdown();
App::new()
.run_onebot(OneBotConfig::new("ws://127.0.0.1:8080/onebot/v11/ws"), shutdown)
.await
}§门面做了什么
- 把 engine(
nagisa_core)、统一领域模型(nagisa_types)、宏 (nagisa_macros)在 crate 根重新导出,业务代码只点nagisa::…。 - 精选一个
prelude——use nagisa::prelude::*;这一行 glob 导入,带进宏、App构建器、Bot句柄、常用FromContext提取器、统一的Segment/Message/Peer/Uin/Result/Error,以及门控/规则 组合子。 - 协议适配器(
OneBotConfig/MilkyConfig)挂在onebot/milkyfeature 后面,日志工具箱(nagisa::log)挂在logfeature 后面,排版引擎 (nagisa::render—— 文档排版成图片)挂在renderfeature 后面。 - 提供
App构建器(app),把适配器、分发循环、自动登记的 handler 和一个ShutdownToken接到一起。
适配器作者用的管线(新协议适配器要实现的出站动作 trait)在 adapter;
engine 内部的对象安全机制在 engine。业务代码两者都不点名。
Re-exports§
pub use app::App;pub use nagisa_core::inventory;pub use nagisa_types;pub use nagisa_onebot;pub use nagisa_milky;
Modules§
- adapter
- 适配器作者用的管线:新协议适配器要实现的出站动作 trait ——
ActionInvoker(两协议通用的根)、OneBotActions(OneBot v11 加上揉进来的 NapCat / LLOneBot / Lagrange 厂商扩展)、MilkyActions,由Actionsmarker 合在一起。业务代码从不 点名这些 —— 它调Bot的固有方法,厂商专属动作走bot.actions().<m>()—— 所以放在这个子模块而非精选的 crate 根。转自nagisa_core::adapter。 - app
App构建器 —— 面向使用者地组装一个 router 并把它跑在某个协议适配器之上。- engine
- Engine 内部管线:分发引擎据以搭建的对象安全 handler/rule/waiter 机制
(
ErasedHandler、Check、Selector、WaiterBuilder、StateMap)。handler 作者从不直接点名这些;不进精选的 crate 根。转自nagisa_core::engine。 - prelude
- bot 作者唯一需要的一行 glob 导入:
use nagisa::prelude::*;。
Macros§
- bail
bail!("...")/bail!(kind, "..."):从 handler 里提前返回一个nagisaError,对标anyhow::bail!。见Error::action。 在 handler(或任何返回nagisaResult的函数)里提前失败:bail!("...")即return Err(Error::action(format!("...")))。- matcher
matcher! { lit(".."), <field>: <ty> = re("..")|union("a","b")|tail, sep="..", usage=".." }:对同一套#[derive(Slots)]codegen 的函数式糖(同样的区块序列),用于写一个内联头部 matcher;求值为Matcher。派生宏才是规范形式(它还顺带产出Slots<T>提取器类型)。#[derive(Slots)]的内联函数式糖:就地求值出一个Matcher,免去显式声明结构体。- plugin
plugin!{ .. }宏:把当前模块声明为一个插件。同模块(及更下层)的触发器按module_path!()关联到它,其分层开关继承插件的default_enable/can_disable。 见插件模型。 声明「当前模块即一个插件」,登记一个PluginSpec。
Structs§
- Admin
Change - 群管理员被设置/取消(
Notice::AdminChange)。is_set= 升为管理员。 (user == self_id时即 bot 自身权限变更,可据此监听 bot 被设/免管理员。) - AiCharacter
- AI 语音音色(
get_ai_characters)。 ENDPOINT: LagrangeDev/Lagrange.Core Lagrange.OneBot/Core/Operation/Generic/GetAiCharacters.cs (https://github.com/LagrangeDev/Lagrange.Core); 亦见 NapCat/LLOneBotget_ai_characters。 Wire 元素:{character_id, character_name, preview_url?}。 - AiCharacter
Group - 一组 AI 音色(按类型分组;
get_ai_characters的顶层数组元素)。 Wire 元素:{type, characters:[AiCharacter]}。 - Announcement
- 群公告。
OFFICIAL: https://github.com/SaltifyDev/milky/blob/main/protocol/src/ir/api/group.ts (get_group_announcements)
ENDPOINT(OneBot): go-cqhttp
_get_group_notice - ArgSpec
- 一个命令参数的元数据(由
#[derive(Args)]生成),供 help 自动生成用法说明。 - ArgText
- 命令剩余段的纯文本。无
ParsedCommand时Skip。 - Args
- 类型化参数提取器:
async fn h(args: Args<MyArgs>)。 仅在命令匹配后(ParsedCommand存在)可用;解析失败 →Skip(=本 handler 不触发)。 - At
- 匹配链中首个 @ 提及,投影为被 @ 的
Uin。链中无 mention(或非消息事件)→Skip。 - Bot
- 廉价可克隆的 bot 句柄(内部
Arc<dyn Actions>)。 - BotOffline
- 机器人账号掉线(
Meta::BotOffline)。注意与传输层Disconnect区分。 - BotOnline
- 机器人账号上线(
Meta::BotOnline)。reason为上线原因文案(Lagrange 提供,OneBot 为 None)。 - Business
- VIP / 业务徽章条目(Lagrange
get_stranger_info.Business[])。kind为业务类型(wiretype),level等级,icon徽章图标 URL,is_pro/is_year为大会员/年费标识。缺字段 → None(绝不 panic)。 OFFICIAL: Lagrange.OneBot get_stranger_info(stranger.Business[] → Business)。 - Captures
- 正则捕获组(非正则匹配器时为空)。无
ParsedCommand时Skip。 - Cd
- 命令式 DI 冷却句柄:在 handler 体内对数据派生键做条件冷却。
- Command
- 命中的命令字面量(或正则整段匹配)。无
ParsedCommand时Skip。 - Command
Arg - 命令之后剩余的消息段(保留非文本段,如图片)。无
ParsedCommand时Skip。 - Connect
- 协议端(传输层)连接成功(
Meta::Connect,框架事件源每次(重)连发出)。 - Cooldown
- 声明式冷却门控的构建体。
new(secs)默认UserGlobal/max_exec=1/ 静默; 以.per_peer()/.per_trigger()/.max_exec(n)/.bypass(rule)链式定制。 - Cooldown
Store - 冷却存储:
key → Window的进程级共享表。App::new注入共享态(与WaiterStore同机制), 声明式Cooldown的Check与命令式Cd句柄共用它。 - Ctx
- 每事件上下文。廉价构造(
Arc克隆 + 一个空 memo map)。 - DevMode
- dev/诊断模式标记,由
App::debug()插入StateMap。 - Disconnect
- 协议端(传输层)断开(
Meta::Disconnect)。reason为底层错误文案(如有)。 - Enabled
Overrides - 所有覆盖的可序列化快照。
per_peer用扁平列表(绕开「map 键非字符串」的序列化难题)。 - Enabled
Set - 命令启用状态表。廉价共享(内部锁),运行期可改。
- Essence
Message - 精华消息。
OFFICIAL: https://github.com/SaltifyDev/milky/blob/main/protocol/src/ir/api/group.ts (get_group_essence_messages)
ENDPOINT(OneBot): go-cqhttp
get_essence_msg_list - Event
Peer - 消息事件的对端寻址(仅消息事件,否则
Skip)。 - File
Fetch get_file取回的富媒体文件(NapCat / LLOneBot 共有)。 ENDPOINT: NapNeko/NapCatQQ packages/napcat-onebot/action/file/GetFile.ts (get_file); 亦见 LLOneBot/LLOneBot src/onebot11/action/types.tsget_file。 Wire 响应:{file?(本地路径), url?, file_size?(字符串), file_name?, base64?}。- File
Meta - Flight
Guard - 一个 RAII 的 single-flight 令牌。存活期间把其作用域标记为在飞,故同作用域上第二次
Session::single_flight返回None。其Drop释放作用域,故被守护 handler 的每条 退出路径——?提前返回、正常路径、panic——都无需手写清理即可释放该槽。沿用Waiter的 drop-摘除纪律。 - Forward
Node - 合并转发的单个节点(发送者 + 内容)。
- Friend
Add - 新加了一个好友(
Notice::FriendAdd)。 - Friend
Category - Friend
Category List - 带分类的好友列表(
get_friends_with_category,NapCat/LLOneBot 共有)。 ENDPOINT: NapCat packages/napcat-onebot/action/user/GetFriendsWithCategory.ts (get_friends_with_category) (https://github.com/NapNeko/NapCatQQ). Wire:[{categoryId, categoryName, buddyList:[FriendInfo]}]。 - Friend
Group - 好友分组(Lagrange
get_friend_list元素的group子对象)。 与FriendCategory区别:category来自 NapCat/LLOneBot 的categoryId/categroyName扁平字段或 Milky 的嵌套 entity;group是 Lagrange 私有的{group_id, group_name}。 OFFICIAL: Lagrange.OneBot get_friend_list(friend.group → FriendGroup)。 - Friend
Info - Friend
Ref - 好友句柄。
- Friend
Request - 好友请求(
Request::Friend)。 - Friend
Status - 用户在线/VIP 状态(Lagrange
get_stranger_info.status)。status/ext_status为协议原始枚举值(不解释,原样透出);battery_status为电量百分比。缺字段 → None(绝不 panic)。 OFFICIAL: Lagrange.OneBot get_stranger_info(stranger.status → FriendStatus)。 - Gate
Reply - 否决时记录的回复:门控
Rule本身是纯布尔,无法回话;某些门控(如休眠门控的 「Zzz」、required-slot 用法提示)需要否决并且回话。故引入一个增量、可选的Ctx-ext 通道:replying包装的门控在否决时把要发的消息 stash 进GateReply, router 在门控否决点(router.rs的 gate-veto)取出并发送一次。纯布尔门控从不触碰它。 - Group
Card Change - 某成员的群名片(昵称)变更(
Notice::GroupCardChange)。 (可在此对新名片做文本审核等处理。) - Group
File List - 群文件列表(某文件夹下的文件 + 子文件夹)。
- Group
Folder - 群文件夹。 OFFICIAL: https://github.com/SaltifyDev/milky/blob/main/protocol/src/ir/api/file.ts (get_group_files)
- Group
Info - Group
Join Request - 入群请求(
Request::GroupJoin)。 - Group
Message - 群消息提取器:仅当事件是
Scene::Group的消息时命中,否则Skip。 - Group
Ref - 群句柄。
- Heartbeat
- 心跳(
Meta::Heartbeat)。interval为心跳间隔(ms),online/good取自 status。 - Honor
- 群荣誉变更(龙王/群聊之火/快乐源泉)(
Notice::Honor)。 - Honor
List - 群荣誉信息(
get_group_honor_info)。 OFFICIAL: https://github.com/botuniverse/onebot-11/blob/master/api/public.md (get_group_honor_info) - Honor
Member - 群荣誉成员条目(current_talkative / *_list 元素)。 OFFICIAL: https://github.com/botuniverse/onebot-11/blob/master/api/public.md (get_group_honor_info)
- Image
- 匹配链中首个图片段,投影为
Media(含recv.url)。链中无图片(或非消息事件)→Skip。 - Impl
Info ImplInfo:get_impl_info()的返回 —— 已连接实现的身份(app 名/版本、QQ 协议 信息)。定义在 engine crate。厂商判定走bot.vendor()(OneBot 专用轴),不在此类型上。 底层 bot 实现的名称与版本(协议端信息)。- Impl
Status - 协议端运行状态(OneBot
get_status)。 OFFICIAL: https://github.com/botuniverse/onebot-11/blob/master/api/public.md (get_status) - Kill
Switch - 进程级全局总闸(kill-switch):置位后
switch一律否决。App写入共享态,switch()叶子读取。与EnabledSet的按命令/按会话开关 正交——这是「一键全关」的紧急闸。 - Lucky
King - 群红包运气王结果(
Notice::LuckyKing)。user= 发红包者,target= 运气王。 - Matcher
- 命令触发匹配器:一组正则(任一命中即整体命中)+ MentionMe / to_me 开关。
- Media
- 媒体段载体:发送时持
source,接收时持recv。 - Member
Info - Member
Join - 有成员入群(
Notice::MemberIncrease)。 - Member
Leave - 成员退群或被踢(
Notice::MemberDecrease)。 - Member
Ref - 群成员句柄。
- Message
Event - Message
Id - 不透明消息标识:打包两协议各自的定位信息。业务把它当不透明句柄,不对其做算术/比较。
- Milky
Adapter - Milky 1.2 协议适配器。
- Milky
Config - Milky adapter 配置。
- Msg
- 流式构建一条消息:
Msg::new().reply(id).at(u).text(" hi").build()。链式 setter 追加段,build()(或Into<Message>)收尾成Message。 - Mute
- 群里有成员被禁言(
Notice::Mute)。 - Next
- 指向「链条剩余部分」的续延:其余中间件 + 末端 handler 循环。
- Nudge
- 戳一戳事件——统一
Notice::FriendNudge与Notice::GroupNudge,归一为{ peer, sender, receiver }。自过滤:sender == self_id时跳过(防止 bot 对自己的戳一戳反应)。 - OneBot
Adapter - OneBot v11 适配器。同时实现
EventSource与ActionInvoker。 - OneBot
Config - 适配器配置。端点 / 绑定完全落在
mode里(如默认正向 WS 模式的OneBotTransport::Forward { url })。 - Parsed
Command - 解析后的命令:命令字面量 + 剩余段 + 剩余纯文本 + 正则捕获组。
- Peer
- 会话寻址:场景 + 对端 id(好友 QQ 号或群号)。
- Plugin
Meta - 插件级元数据 + 总开关策略。全
&'static,运行期零开销。 - Private
Message - 私聊消息提取器:仅当事件是
Scene::Friend/Scene::Temp的消息时命中,否则Skip。 - Profile
Liker - 对我点赞的用户(
get_profile_like,NapCat/LLOneBot 共有)。 ENDPOINT: NapCat packages/napcat-onebot/action/user/GetProfileLike.ts (get_profile_like) (https://github.com/NapNeko/NapCatQQ). Also: LLOneBot src/onebot11/action/types.ts. - Rate
Limit - 可当
Middleware用的令牌桶限流器。 - RawEvent
- Ready
- 框架就绪:已解析出可用账号(
Meta::Ready,每次run_*仅一次)。self_id为机器人账号,nickname为其昵称(来自get_login_info,未知时为空串)。 - Recall
- 一条消息被撤回(
Notice::Recall)。同时携带原始sender(作者)与撤回它的operator, 使 handler 能套自己的策略(如防撤回类插件可在author != bot OR operator == bot时触发)。 刻意不做自过滤——在这里写死一套自策略会挡掉防撤回功能需要的「bot 自己的消息被管理员 撤回」这一情形。 - Rendezvous
- 带 TTL 的 rendezvous 存储。廉价共享(内部
RwLock);运行期可改。 - Rendezvous
Snapshot - 可序列化快照。每条带其剩余寿命(毫秒,而非不可移植的绝对
Instant);restore把截止时刻重锚到now + remaining。 - Reply
- 便捷回复句柄:携带消息事件的
Peer+ 触发消息的MessageId+Bot,向同一会话回话。 仅消息事件可提取(否则Skip)。 - Reply
Msg Reply::msg返回的链式构建体:累积Msg段,终结于send(向来源会话发送)或quote(引用触发消息再发送)。 字段方法照搬Msg,故reply.msg().at(u).text("hi")与Msg同手感。- Request
Token - 不透明请求令牌——同意/拒绝时 round-trip;内部按协议打包不同字段。
业务侧视为不透明(只在事件里收到、回传给
Bot::handle_request); 内部RequestTokenInner标#[doc(hidden)],仅供各 adapter crate 构造/解构。 - Resource
Ref - 接收侧资源引用:真实 URL 可能需懒加载
(Milky 文件需另调
get_*_file_download_url)。 - Rkey
- 富媒体下载鉴权密钥(Lagrange/NapCat/LLOneBot
get_rkey)。 ENDPOINT: LagrangeDev/Lagrange.Core Lagrange.OneBot/Core/Operation/Generic/GetRkey.cs Wire response:{"rkeys":[{"type":"private"|"group","rkey":"...","created_at":u32,"ttl":u64}]} - Router
- handler 注册表 + app 共享状态 + 洋葱中间件。
dispatch先穿过中间件, 末端按优先级(小者先)依次执行 handler。 handlers 始终保持按优先级稳定排序(注册时排序,分发时直接遍历)。 - Rule
- 可组合门控。
Arc包裹,克隆廉价;用&/|/!组合。 - Scope
- 仅消息的便捷预设(事件型作用域手写
.on(Kind).filter(..))。 - Sender
- 发送者 QQ 号(仅消息事件,否则
Skip)。 - Service
Bus - 服务间共享句柄袋:按类型(
TypeId)存取Arc<T>。廉价克隆(内部Arc)。 - Session
- 一个会话句柄(
FromContext提取器)。捕获 bot、共享态、WaiterStore(取自共享态)、 当前会话 peer(如有),以及当前嵌套深度(取自 Ctx 上的WaiterDepthext,默认 0)。 - Shutdown
Token - A token which can be used to signal a cancellation request to one or more tasks.
- Sleep
State - 机器人的「休眠」标志:置位时机器人装睡。
App/管理命令写入共享态,awake叶子读取。 - Slot
Spec - 一个有序 slot 规格。
Matcher::slots把一组SlotSpec编成一条锚定正则, 命名槽成编号组,并保留 名→组下标 的映射。 - Slots
- 类型化命名 slot 提取器:
async fn h(m: Slots<ViewBoard>)。Args<T>的字面孪生——同样仅在命令匹配后(ParsedCommand存在)可用,解析失败经共享on_parse_miss(prod usage 回贴 / dev WARN / 静默)后Skip。 - State
- app 共享状态注入。从
Router::data注册的状态表里取Arc<T>;缺失 →Reject::Error。 - Superusers
- 配置的超级用户集合。
App::superusers写入,superuser()规则读取。 - Supervisor
- 服务生命周期 Supervisor:注册一批服务,按依赖 DAG 编排 prepare→run→cleanup。
- Tail
- 贪婪尾槽的载荷类型。
#[slot(tail)] q: Option<String>直接用String(无需Tail包装);Tail<Vec<Segment>>把未解析的多模态尾原样交还(此实现下尾是纯文本, 故包成单个Segment::Text——from_slots仅见文本捕获)。 - ToMe
- 消息是否「to me」:私聊/Temp 场景,或群聊里首段是
@selfmention。 - Trigger
Id - 一个触发器的稳定标识(
plugin_key+trigger_key)。用于User/per-trigger 作用域的键。 - Trigger
Meta - 触发器级元数据(命令或事件)。
key == "<plugin_key>.<id>"。 - Trigger
Spec - 一条 inventory 收集到的触发器:元数据 + 一个挂载 handler 的函数。
- Uin
- QQ 号。用 newtype 包住 i64,防止与普通整数混淆。serde 透明序列化为内层 i64。
- User
Info - 任意用户档案(含陌生人)。OneBot
get_stranger_info/ Milkyget_user_profile字段并集,缺的为Option。 - Waiter
- 一个活跃 waiter。RAII:其
Drop摘除 store 条目。经mpsc收投递事件(多轮、无需重注册)。 - Waiter
Depth - 嵌套深度标记,打在重建的
Ctx上,使从中提取的Session比产出它的 waiter 深一层注册。 - Waiter
Store - 活跃 waiter 的共享注册表。用
Vec(而非单槽),故多个并发/嵌套作用域可共存。 注入 app 共享态;router 在run_handlers的 waiter 检查层查询它。
Enums§
- Action
Error Kind - 动作错误的粗分类(启发式,绝不按精确 retcode 值匹配——三实现 retcode 不一致)。
- ArgError
- 参数解析错误(由生成代码产出,提取器据此
Skip)。 - ArgKind
- 参数角色,决定 help 里的写法(旗标
[-a]/ 选项[-r 值]/ 位置<名>等)。 - ArgToken
- 参数 token:文本词 或 一个非文本消息段。
- Capability
- 可探测的能力。适配器据实现/版本回答
Bot::supports。#[non_exhaustive]:新增能力不破坏下游 match。 - Category
- 插件分类。
- CdKey
- 冷却存储的实际键:把各作用域投影到一个可哈希的判别式。
- Cooldown
Scope - 冷却键的作用域。
UserGlobal是默认(key 仅sender.id,跨全部触发器)。 - Error
- Nagisa 统一错误。
- Event
- Event
Kind - 给
#[event(Kind)]用的友好选择器。覆盖 nagisa 的事件面;若干Notice/Meta变体被合并(如两种 nudge 变体都 →Nudge)。 - Flank
- 一个 slot 相对字面量头的位置。
Pre+字面量+Post程序编成(?:..)?lit(?:..)?,使字面量头 两侧的可选修饰可表达。 - Flow
- 中间件的传播控制。
Stop= 吞掉本事件、不再下传。 - Forward
- 合并转发:接收为引用 + 预览元信息;发送为内联节点。
- Handler
Outcome - dispatch 视角的单次 handler 执行结果。
- Honor
Kind - 群荣誉类型。 OFFICIAL: https://github.com/botuniverse/onebot-11/blob/master/event/notice.md (§群成员荣誉变更)
- Image
SubType - Meta
- Milky
Mode - Milky 出站事件信道模式:
Ws/Sse二选一 (nagisa 主动连协议端的/event)。默认Ws(向后兼容)。 - Notice
- Protocol
- 后端协议。
- Rate
Limit Scope RateLimit以什么为桶的键。- Reaction
Kind - Reject
- 提取失败的两种语义。
- Replied
recv_parse/recv_text一次追问的结局:拿到值、 用户主动取消、或超时没等到。取代裸Option——把「取消」与「超时」分开返回,调用侧据此分别回话 (取消该道别、超时该说没等到),二者不再都塌成None(那曾让发「取消」错报成超时)。- Request
- Resource
Source - 发送侧资源来源。适配器各自序列化为
base64:///file:///http(s)://。 - Role
- Scene
- 会话场景。
- Segment
- 统一消息段。
#[non_exhaustive]:加段不破坏下游。 - Sex
- Switch
Key - 开关键的类型化句柄,
EnabledSet::set/reset接受它。 - Transport
Error - 传输层错误。适配器把 tungstenite/reqwest 等错误映射成这里的字符串变体;本 crate 不依赖它们。
- Trigger
Kind - 触发器是靠命令匹配触发还是靠事件触发。
- Vendor
- OneBot 协议端的实现厂商,由
app_name子串判定。 - Wait
Flow recv_with/recv_with_sync的闭包对每条投递事件返回的类型化裁决:闭包逐事件决定继续等、用某值收束、还是放弃。
Traits§
- Args
Meta - 由
#[derive(Args)]生成,暴露各字段的ArgSpec,供 help 自动生成用法。无字段或手写ParseArgs的类型可不实现(此时 help 退回命令级usage文本)。 - Context
- 给
Result<T, E: Display>与Option<T>附上下文并归一到 nagisaResult。 - Event
Source - 入站事件源。OneBot = WS 读半边;Milky =
/event(WS/SSE/webhook)。 - FromArg
- 把单个文本 token 解析成一个字段值。
#[derive(Args)]的文本字段类型需实现它。 - From
Context - 从每事件上下文按类型提取一个值。
Skip即类型层过滤。 - From
Slots - 由
#[derive(Slots)]生成:产出命令头匹配器 + 从命名捕获投影出Self。 - From
Tail Text - 从尾捕获文本构造一个尾载荷。derive 对
#[slot(tail)]字段调用它。 - Handler
- 类型化 handler。由宏为多元
async fn生成 blanket impl;用户一般不手写。 - Message
Ext Message的便捷扩展,实现在[Segment]上(查询 + 变换)。- Middleware
- 一个洋葱层。
handle内next.run(ctx)把控制权交给内层(其余中间件 + handler 循环)。 - Parse
Args - 由
#[derive(Args)]生成。把 token 流(+ 原始文本,供#[arg(rest, raw)]保真)解析为Self。 - Service
- 受 Supervisor 管理的服务。三段式生命周期 + 依赖声明。
- Slot
Value - 在框架边界把单个捕获组文本解析成一个字段值。
FromArg的兄弟,复用ArgError。
Functions§
- add_
outgoing_ logger - 追加一个出站消息日志器。多次调用按顺序累积(多订阅:nagisa-log、业务落库可并存)。
- awake
- 仅当机器人清醒时放行;睡着时否决并经 reply-on-veto 通道回贴一次「Zzz」。
静默变体见
awake_silent。 - awake_
silent awake的静默变体:睡着时纯静默否决(不记GateReply、不回话)。- collect_
into - 把每条收集到的
TriggerSpec折叠到router上(顺序不稳定;先后由各触发器自身的priority决定,而非折叠顺序)。见上文 DCE 注意事项。 - ctrl_
c_ shutdown - 起一个后台任务,收到 SIGINT(Ctrl-C)时取消返回的
ShutdownToken。 - from_
user - 限定发送者。
- group_
admin - 发送者是群主或管理员。
- group_
only - 仅群消息。
- group_
owner - 发送者是群主。
- in_
group - 限定群。
- keyword
- 文本中包含任一关键词。
- private
- 仅私聊(好友/临时)消息。
- registered_
plugins - 全部已声明的插件(inventory 的克隆)。顺序不稳定。
- registered_
triggers plugin_key/key已解析好的触发器(宏产出时它们为空)。- replying
- 把一条门控
Rule包成「否决即回话」:rule求值为false时,若尚无GateReply落下(首写者胜),则ctx.insert_ext_if_absent(GateReply(on_veto()));随后照常返回false(语义仍是否决/Skip,只是额外记下一条回复)。rule通过则原样放行、不触碰通道。 - run_
dispatch - 长生命周期分发任务:
select!(关停 / 收事件 / reap 完成任务)。shutdown触发或事件流关闭即退出接收循环,之后等待所有 in-flight handler 完成。 - superuser
- 发送者是配置的超级用户。
- switch
- 一个额外具名的跨插件开关(
Function.require("name")):读取EnabledSet的按会话覆盖(per-peer override,优先于全局), 并叠加全局总闸KillSwitch。 - to_me
- 消息是否「针对机器人」:私聊,或群里 @ 了机器人自身。
Type Aliases§
- Extracted
- 提取结果:成功得
Self,失败为Reject(注意区别于nagisa_types::Result)。 - Handler
Result - handler 业务返回:
Ok(())处理成功,Err(e)处理出错。 - Message
- 业务统一消息体:一串
Segment。不内嵌 CQ 字符串(CQ 编解码只在 OneBot 适配器内部)。 - Named
Captures - 命名正则槽的别名:名 →
Some(text)(命中) |None(缺省的可选槽)。 即ParsedCommand.named_captures的类型,FromSlots::from_slots据此投影。 - Result
- 库内统一 Result。
Attribute Macros§
- async_
trait - command
#[command(...)]属性宏:声明式登记一个 matcher 门控的 handler,在App::new时经inventory自动收集。 把一个async fn注册成消息命令触发器。- event
#[event(Kind, id="..")]属性宏:声明式登记一个事件触发的 handler(与#[command]对等),在给定EventKind的事件上触发,受同一套分层插件开关门控。 把一个async fn注册成事件触发器(与#[command]对等,但按EventKind派发)。
Derive Macros§
- ArgEnum
#[derive(ArgEnum)]:为无字段枚举派生FromArg(变体名转小写;支持#[arg(rename="..")]/#[arg(alias="..")]),使其可作受限的Args<T>字段类型 (如on|off)。 为无字段变体的枚举生成FromArg,按变体名小写匹配,用于命令里的on|off、原曲|哼唱这类受限选项。- Args
#[derive(Args)]:为结构体派生ParseArgs,使其可经Args<T>从命令 参数里提取。派生宏与Args<T>提取器刻意共用Args这个名字(跨宏/类型命名空间), 同 serde 的Serialize。 为带具名字段的结构体生成ParseArgs,配合Args<T>提取器在消息段流上 解析命令参数。- Slots
#[derive(Slots)]:命令头 = 有序区块序列——结构体级#[slots(lit("查看"), board, lit("榜"), scope)](lit("..")固定块、裸标识符引用同名字段、sep=/usage=键),字段各自#[slot(re=..)]/#[slot(union=[..])]/#[slot(tail)]定来源/类型(Option<T>表可选块)。派生FromSlots,可经Slots<T>提取。HEAD 侧,与持有 TAIL 的#[derive(Args)]对称;还自动生成COMMAND_WORDS(字面 × 各必填 union 块的笛卡尔积)供 help 像字面命令一样枚举。 为「命令头 + 命名类型化正则槽」结构体生成FromSlots(matcher()产出头匹配器,from_slots()从命名捕获投影出字段)。是#[derive(Args)]的兄弟,复用其option_inner助手判断可选性。