上下文机制
提示
-D, -E, -g 三个选项的最低使用权限为 3 级。你可以通过配置 authority.context 修改这个行为。
Koishi 的所有问答都是被存储在一起的,但是我们往往需要让某些问题在特定的频道生效,同时让另一些问题在所有频道生效。上下文机制就是为了解决这类问题而出现的。
基本用法
当修改现有的问答时,你可以通过以下参数完成相应的设置:
-e
:在已有基础上允许当前频道-E
:设置为全局允许-d
:在已有基础上禁止当前频道-D
:设置为全局禁止-De
:设置为只允许当前频道-Ed
:设置为只禁止当前频道
如果你想控制一个一般的频道而不是当前频道,你可以使用下面的语法:
-eg 123
:在已有基础上允许频道 123-Eg 123
:设置为全局允许,除了频道 123-dg 123
:在已有基础上禁止频道 123-Dg 123
:设置为全局禁止,除了频道 123
这里的 -g
也可以替换成由半角逗号隔开的多个频道标识符(例如 QQ 中的群号,开黑啦中的 #频道名),效果类似不再赘述。
最后,如果不进行任何设置则不会修改原问答的上下文。
当添加新的问答时,默认情况下的行为相当于 -e
,即如果原问答不存在,则创建一个只允许当前频道的新问答,否则在原问答的基础上额外允许当前频道。你也可以手动覆盖这个默认行为,例如 # 问题 回答 -E
的效果是添加一个全局允许的问答。
在搜索问答时,上面的语法依然有效,不过意义不同:
-e
:匹配允许当前频道的问答-E
:匹配全局允许的问答-d
:匹配禁止当前频道的问答-D
:匹配全局禁止的问答-G
:忽略上下文机制
此时默认情况下的行为仍然相当于 -e
。如果你希望搜索所有的问答,忽略上下文造成的影响,可以使用 -G
参数。
此外,在私聊时,由于没有“频道”的概念,因此 -e
的默认行为将失效,你需要手动指定(或忽略)上下文。
深入原理
TIP
本节将介绍上述上下文机制的内部原理。如果对此不感兴趣可以跳过。
在 Koishi 的教学系统中,任何问答的上下文都可以被理解为两个参数:groups 和 reversed。前者表示生效或者不生效的频道列表,而后者表示是否对匹配结果取反。举个例子,如果一个问答只允许两个频道 123, 456,则其对应的 groups 为 123,456
,reversed 为假。如果一个问答全局允许,则其对应的 groups 为空,reversed 为真。
而当我们需要修改或者查询问答时,还涉及第三个参数 partial。这个参数表示是否部分匹配。当 partial 为真时,对搜索请求进行完全匹配,对修改请求进行覆盖操作;当 partial 为假时,对搜索请求进行部分匹配,对修改请求进行调整操作。
例如,如果原问答的 groups 为 123,456
,reversed 为假(即只允许 123, 456 两个频道),修改请求的 groups 为 456,789
,reversed 为真,partial 为真(即在已有的基础上禁用 456, 789 两个频道),那么得到的新回答的 groups 为 123
,reversed 为假(即只允许 123 一个频道),这与正常的思维相一致。
现在我们已经可以理解,上面介绍的 -g
选项,表达的就是 groups 的含义。但是我们在大部分情况下都不需要使用这个选项,因为这个选项的默认值足以覆盖绝大部分需求:
选项 | reversed | partial | groups |
---|---|---|---|
-e | false | true | 当前频道 |
-E | false | false | 全部频道 |
-d | true | true | 当前频道 |
-D | true | false | 全部频道 |