条件动作
完整查询 if、if_not、all、any、none、case 的字段与分支规则。
条件对象放在接受动作的位置,例如图标 action、菜单事件或另一个条件的分支中。它与图标 sub.if 的显示条件不是同一个字段:这里决定执行什么,子图标条件决定显示什么。
单个条件
action:
if: 'perm invero.vip'
then: "mmsg '&a你有权限'"
else: "mmsg '&c你没有权限'"perm 属于通用 Kether,语法见 TabooLib Kether 列表。本页的 YAML 条件结构由 Invero 提供。
| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
if | 条件文本/固定值或其列表 | 与其他入口择一 | 不构成此结构 | 只取第一条条件;要检查多条应使用 all / any / none |
if_not | 条件文本/固定值或其列表 | 与其他入口择一 | 不构成此结构 | 第一条条件不满足时选择 then |
all | 条件文本/固定值或其列表 | 与其他入口择一 | 不构成此结构 | 全部满足时选择 then |
any | 条件文本/固定值或其列表 | 与其他入口择一 | 不构成此结构 | 任意一个满足时选择 then |
none | 条件文本/固定值或其列表 | 与其他入口择一 | 不构成此结构 | 全部不满足时选择 then |
then | 动作、动作列表或布尔值 | 与 else 至少填写一项 | 该分支不执行动作 | 条件满足时选择,可继续嵌套条件或输入 |
else | 动作、动作列表或布尔值 | 与 then 至少填写一项 | 该分支不执行动作 | 条件不满足时选择 |
atLeast(amount、at_least) | 整数 | 否,仅 any | 1 | 有数量判断问题,不能可靠表示至少 N 条满足,见下文 |
if_not 应使用下划线写法。带空格的 if not 虽然会被识别为条件入口,但目前不能完整读取条件字段,不作为可用别名。
条件项也接受布尔值、数字等单个值;直接填写的固定 true / yes / 1 判为真,false / no / 0 判为假,不区分这些固定写法的大小写。
其他脚本返回布尔值时按该值判断;返回非布尔值时,结构化动作只把小写文字 false、no 判为假,其他结果(包括空结果、数字 0)并不自动表示假。判断存在与否使用 ctx has / ctx without,需要确定分支时返回布尔值。图标子状态另有自己的判断偏好,不用文字或数字代替明确条件。
if、if_not 至少要有一条条件;空列表不能执行。空的 all / none 成立,空的 any 不成立。通常直接填写有意义的条件列表。
多个条件
action:
all:
- 'perm invero.vip'
- 'ctx has selected'
then: "mmsg '&a两个条件都满足'"
else: "mmsg '&c条件尚未满足'"all、any、none 逐项作即时判断并短路:达到结果后不再检查剩余项。它们不等待含延迟的条件,尚未完成的条件按 false 判断。if / if_not 会等待第一条条件的结果。显示条件、过滤条件和动作条件也不宜包含等待或副作用。
数量阈值限制
any.atLeast(amount、at_least)目前不能实现“至少 N 条满足”:即使大于 1,第一条为真的条件也会使整个 any 成立;非正数还可能让非空列表在条件都不满足时通过。任意一条满足用 any,全部满足用 all,不要用此字段进行可靠的数量阈值判断。
分支结果
- 实际执行了
then或else:返回该分支的动作结果。 if/if_not选中的分支没有配置:返回true。all/any/none选中的分支没有配置:返回false。- 结果为
false会停止外层动作列表,不会自动关闭窗口。
需要确定结果时显式配置两个分支,尤其是用于 pre_open 或输入验证时。
按值选择分支
action:
case: 'ctx get category'
when:
vip: "mmsg '&aVIP 分类'"
normal: "mmsg '&f普通分类'"
else: "mmsg '&7请选择分类'"先用 ctx set category to vip 设置分类,上例就会发送 VIP 分类消息。case 同样识别上方的固定真假值:直接写 case: 0 得到的是假值,而不是数字 0 的文字;匹配数字时可用 case: 'ctx get count' 读取实际数值。
| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
case | 一段 Kether 文本或单个固定值 | 是 | 无法选择分支 | 求值后转换为文字,与 when 的键比较;不接受条件列表 |
when | 匹配规则到动作的映射 | 是 | 无法读取此结构 | 按书写顺序,执行首个匹配项;值可为动作列表或嵌套结构 |
default(else) | 动作、动作列表或布尔值 | 否 | 没有匹配时返回 true | 所有规则都不匹配时执行 |
when 匹配规则
规则写在 when 的键中;带符号的键用引号包围。
| 规则 | 比较方式 |
|---|---|
vip 或 '= vip' | 求值结果与 vip 完全相等,区分大小写 |
'~= vip' | 相等,不区分大小写 |
'> 10'、'>= 10'(≥) | 求值结果大于、大于等于指定数字 |
'< 10'、'<= 10'(≤) | 求值结果小于、小于等于指定数字 |
'has abc'、'contains abc'、'~ abc' | 规则右侧文字包含求值结果,并非“结果包含 abc” |
'~~ abc' | 同上,但不区分大小写 |
== 与 ~== 会被识别成相等类规则,但目前会留下多余的 =,不能按通常的双等号语义使用;写 = 或 ~=。包含规则的比较方向也与常见直觉相反,不用它代替通用 Kether 的字符串包含判断。
控制菜单打开
events:
pre_open:
if: 'perm invero.use'
then: true
else:
- "mmsg '&c无法打开'"
- falseLast updated on