上下文机制

提示

-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 的含义。但是我们在大部分情况下都不需要使用这个选项,因为这个选项的默认值足以覆盖绝大部分需求:

选项reversedpartialgroups
-efalsetrue当前频道
-Efalsefalse全部频道
-dtruetrue当前频道
-Dtruefalse全部频道