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 引导 - 基本使用