MeloBot 机制简述

TIP

本篇将会简要介绍 MeloBot 的重要机制,这些内容对于使用 MeloBot 同样重要。

事件和行为

在 MeloBot 中,每次从 go-cqhttp 接收到的数据,被称为“事件”。而每次由 MeloBot 内部连接器模块发给 go-cqhttp 的数据,被称为“行为”。

自始至终,bot 内部的工作流程不过是:收到事件 -> 解析事件 -> 响应事件 -> 封装行为 -> 发送行为。

权限

在 MeloBot 中,用户权限分为六级:SYS,OWNER,SUPERUSER,WHITE,USER,BLACK。注意这里的 WHITE,它不是我们日常认知中的白名单机制,而是比 USER 更高一级的等级。

这六种等级,除了 SYS 和 USER 外,其余等级均可通过配置文件指定该等级包含哪些用户。SYS 等级在配置文件中,仅可指定是否能让 OWNER 等级用户继承权限。而 USER 等级,则是当用户不属于其他任何等级时,则自动视为该等级。

在 MeloBot 内部的工作流程中,更高等级的用户总是可以访问同级或更低级的资源的,内部也允许一个用户拥有多重等级身份。但需要特别注意的是:用户如果在黑名单内,无论有其他多高的等级也会被判作最低级

命令

解析规则、命令起始符和命令分隔符

命令执行是 bot 行为的重要组成部分,而对命令的执行依赖于命令解析。在 MeloBot 中,一条合法的命令应该由“命令起始符”开始,而各参数应该通过“命令分隔符”连接。通过起始符和间隔符,我们就定义了命令该如何被解析和执行。如:

起始符:$,分隔符:#,此时一条命令应该形如:$weather#city#days。在内部,它将被解析为命令序列:["weather", "city", "days"]。对于任何命令序列,其中第一个 token 被认为是命令名,其他所有 token 将按顺序组成该命令的参数。然后内部命令执行器会去尝试执行该命令。

注意:命令起始符和命令间隔符还可以是字符串,并且可以将多个字符串设为起始符或终止符。它们可在配置文件中配置,但是不能包含以下字符:

  • 引号、逗号
  • 各种括号
  • 反斜杠
  • 数字、英文
  • 空格、控制字符

WARNING

不推荐使用点号和感叹号等标点,虽然是合法的,但极易在非命令的聊天消息中出现,这可能使 bot 执行预期外的命令。

DANGER

任何命令起始符不应该是命令间隔符的前缀,这将导致解析行为异常。

单解析与多解析

当一个消息类事件发送给 MeloBot 的事件处理器时,会调动命令解析器尝试对消息进行命令解析,如果包含命令,则会解析出命令序列。

TIP

在进行命令解析时,消息中的这些字符将被过滤:

  • 单双引号
  • 反斜杠
  • 回车、换行、制表符

随后,还会自动过滤消息首尾的所有空格(消息中间的空格不过滤)。在过滤完成之后,才会开始尝试从剩下的字符串中解析命令。

由之前的叙述可知,命令起始符和命令分隔符在配置中,分别对应两组字符串列表,我们可以把每组中的字符串称作“标志”。如果两组的标志是组间不重复的,将是多命令解析模式。例如:

起始符为:["./", "!/"],分隔符为:[",/", "#/"] 时,对于消息:

\t\n\n   这是一条消息的前缀./echo,/123!/echo#/456\n\t\t  \n

将解析为命令序列:["echo", "123"]["echo", "456"]

但如果两组列表的标志重复了,那此时将进入单命令解析模式。例如:

起始符为:[".", "~"],分隔符为:["#", "."] 时,对于消息:

\t\n\n   这是一条消息的前缀.echo#123~echo.456\n\t\t  \n

将解析为命令序列:["echo", "123", "echo", "456"]

可以看出,此时就只有一条命令序列了。原因很简单,当两组标志有重复时,遇到重复的标志时,无法区分是起始符还是间隔符。此时将会把两组标志都看做“划分符”,不再区分谁是起始和间隔。这样解析最终只能产生一个命令序列。

关键词应答

关键词应答是 MeloBot 的一类功能。主要实现原理是:触发某些关键词条件,即可触发对应的命令操作,然后在内部生成命令语句,执行完成后封装为行为发送到外部。这样就实现了对关键词的应答。

例如,如果指定这样的规则:(在消息中出现 律回 二字时回复 123),在内部最后会生成 ["echo", "123"] 的命令序列。

关键词应答规则的指定依赖于 ./corpus/key_ans.json 配置文件。请参考: MeloBot 配置 - 关键词应答配置


下一篇:MeloBot 引导 - 基本使用
Last Updated:
Contributors: AiCorein