Skip to content

深入定制机器人

权限管理

既然已经有了用户系统,下一个自然的需求便是权限管理了。

用户权限

Koishi 内部有一套默认的权限系统,它为每个用户赋予了一个权限等级,遵循以下的 核心规则

  • 数据库中没有的用户默认拥有 0 级权限
  • 高权限者能够执行一切低权限者的操作

在此基础上,我们还扩充出了这样的一套 设计准则

  • 0 级:不存在的用户
  • 1 级:所有用户,只能够接触有限的功能
  • 2 级:高级用户,能够接触几乎一切机器人的功能
  • 3 级:管理员,能够直接操作机器人事务
  • 4 级:高级管理员,能够管理其他账号

你可以基于这套准则对指令进行 权限管理,也可以用于部分 计算属性 的配置项中。

通过 配置登录插件 的方式,你可以快速拥有一个 5 级权限的管理员账号。接下来,要做的就是为其他用户赋予权限了。

安装 admin 插件。该插件提供了名为 authorize 的指令,可以设置其他用户的权限等级:

A
Alice
authorize -u @Bob 2
Koishi
用户数据已修改。

任何用户只能对权限等级低于自己的用户进行操作,且操作后的权限等级同样必须低于自己。

受理人机制

默认情况下,同一个 Koishi 应用接入的多个机器人账号在同一个频道内,只有一个机器人会响应用户的消息。这是为了防止消息重复发送和循环触发等问题。这个负责响应消息的机器人被称为该频道的「受理人」。默认情况下,第一个收到该频道的消息的机器人会自动成为受理人。

当受理人账号离线时,即便频道内仍有其他机器人,它们也不会响应你的消息。此时如果想要切换受理人,同样请安装 admin 插件,并使用 @bot assign,其中 @bot 是你所希望的受理人。

反过来,如果你希望你的 Koishi 实例不主动响应某个频道的消息,可以通过 assign -r 的方式来移除该频道的受理人。其他频道不会受到影响。

TIP

某个频道处于无受理人状态与该频道被过滤器排除的区别在于:前者仍然可以被通过 @机器人 的方式触发指令,而后者无论如何都无法触发指令。具体请参考 触发前缀 章节。

自动注册

默认情况下,对于每一条接收到的消息,机器人都会自动向数据库中注册其用户和频道。新注册的用户将默认获得 1 级权限,而新注册的频道会自动以收到消息的机器人为其受理者。如果你不希望有此行为,可以在全局设置中手动配置 autoAuthorizeautoAssign

上述两个配置项都支持 计算属性,这也意味着你可以在不同的聊天环境中配置不同的行为。

过滤器

很多时候,我们会希望某些功能只能对于某些群聊或私聊使用。使用权限管理意味着引入数据库,而更轻量的方式是通过 过滤器 (Filter) 直接影响插件的作用范围。

插件过滤器

TIP

少数插件与聊天平台无关,例如控制台、数据库插件等。这些插件也因此没有过滤器设置。

大部分插件都提供了过滤器设置,就位于插件详情页的顶部。点击「添加条件」按钮可以创建一个过滤条件。可以通过设置过滤条件来包含或排除任意平台 / 用户 / 群组 / 频道 / 机器人。

TIP

如果不知道这些 ID 是什么,可以使用 获取账号信息 中介绍的 inspect 插件。

添加一个条件后,你会发现下方的按钮变成了「添加『与』条件」和「添加『或』条件」两个。Koishi 的过滤器支持二级结构,内层的一系列条件以「与」的逻辑关系组成条件组,外层的一系列条件组以「或」的逻辑关系组成最终的过滤条件。

条件属性

Koishi 不仅支持在插件层级设置过滤器,某些配置项还支持在不同的会话下取不同的值。以全局设置为例,我们可以看到 prefix, autoAssign 等配置项的右侧有一个「…」按钮:

computed

computed

点击这个「…」按钮,即可将普通的配置项变成一个计算属性。我们可以配置一系列满足某个过滤器以后的取值,以及一个不满足任何情况下的默认值。

利用此特性,我们可以实现一些比较复杂的功能,例如:

  • 屏蔽某些群组内的一切消息
  • 在不同的平台下使用不同的指令前缀
  • 对特定的用户开放额外的使用额度

国际化

Koishi 是一个支持国际化的聊天机器人框架,这意味着 Koishi 机器人可以根据不同的环境使用不同的语言。这可能听起来跟你没啥关系……但先别走!读完这一节,或许你能掌握一些非常有用的功能。国际化并没有你想象得那么简单。

设置语言偏好

在 Koishi 中,应用本身及其管理的每个用户、每个频道都可以独立地设置语言偏好。其中,应用级别的默认语言通过全局配置项 locale 来设置,而用户、频道的语言偏好则通过 admin 插件提供的 user.localechannel.locale 指令来管理 (还记得指令系统中的 这个例子 吧)。

默认情况下,语言偏好的优先级是 频道 > 用户 > 全局。一个群组中可能有大量使用不同母语的用户参与讨论,为了方便交流通常会设置不同的语言频道。而对于此类情况,频道优先策略就可以让机器人在这些频道内始终使用预设好的语言来回答,而对于未设置语言偏好的频道,机器人仍然会遵循用户的偏好设置。当然,你也可以通过全局配置项 i18n.output 来更改此行为。

本地化文本

当然,绝大部分插件都仅仅支持了中文。如果你希望你的机器人支持其他语言,除了向这些插件的作者提交 Pull Request 外,还可以本地修改插件的文本。

在活动栏中点击「本地化」,你将看到如下的界面:

locales

locales

左侧可以选择类别,右上角可以选择要显示的语言,而中间则是编辑文本的区域。其中,文本框里的占位符对应于插件本身提供的文本,可以在翻译到其他语言时用做参考。

然而,这个页面还有另一个用法,就是修改已有的文本!例如在上面的截图中,low-authority 原本对应到的文本是 权限不足,我们可以将它修改为 哼,不给用。现在让我们找个带权限等级的指令试试看有什么效果:

A
Alice
authorize -u @Bob 5
Koishi
哼,不给用!

只要你如法炮制,就可以配置出一套完全属于你的机器人文案,让你的机器人与众不同。