跳到主要内容

配置指令

通过as_command装饰器,我们可以将一个 class 转换为一个PepperBot的指令

同时,通过配置该装饰器的参数,我们可以实现非常灵活的指令效果

接下来,我们将具体介绍as_command装饰器可用的配置项

所有配置项

也可以通过 IDE 查看使用指南

比如使用 VSCODE,就可以通过将鼠标悬浮在该装饰器上方,或者悬浮在具体的配置项上,来查看对应的文档提示

参数类型默认值
prefixesList[str][]
need_prefixboolFalse
aliasesList[str][]
include_class_nameboolTrue
require_atboolFalse
exit_patternsList[str][]

触发指令

想要触发一个指令,我们首先要能满足指令的关键字识别

常见的指令由以下三个部分组成 前缀 + 指令名称 + 参数

比如"/今日头条",前缀为“/”,指令名称为"今日头条",没有参数

比如“天气 上海”,没有前缀,或者说前缀为空,即“”,指令名称为“天气”,有一个参数,“上海”

prefixes

通过as_command中的prefixes参数,我们可以设置指令的前缀,可以设置多个,也可以一个都不设置

比如指令“今日头条”,我们设置prefixes["/", "@", "#"],当用户使用任意一个前缀时,都能触发该指令

"/今日头条"
"@今日头条"
"#今日头条"

need_prefix

有时候,我们希望指令不需要前缀,比如,我们希望用户直接输入“天气 上海”,就能触发指令

这时候,我们可以设置need_prefix为 False

aliases

有时候,想要为指令设置多个别名,可以通过as_command中的aliases参数实现

比如天气指令,当设置aliases["天气", "气象", "风雨"]时,用户输入

"天气 上海"
"气象 北京"
"风雨 深圳"

都会触发

配合include_class_name使用,可以实现非常灵活的效果

include_class_name

默认来说,指令的类名,也会被视作指令的名称,比如

class 天气指令:
...

假设 prefixes 设置为["/"],当用户输入"/天气指令"时,会触发该指令

这一行为可以设置 include_class_name 为 False 关闭

require_at

如果你希望只有当群员@了机器人时,才能触发指令,可以设置require_at为 True

比如,设置aliases["天气"]require_atTrue,当用户输入

@bot 天气 上海

时,才会触发

可选的 At 触发

如果你希望,既可以通过前缀触发,也可以通过@触发

  • 通过前缀触发,不需要@
  • 需要@的触发

可以通过继承实现

可以发现,PepperBot中的指令,都是通过as_command装饰器实现的

as_command装饰器接受的,是一个class

所以,我们可以将指令具体的功能,放到一个class中,然后通过新实现两个class,都继承这个class,来绑定不同的as_command参数

class WeatherCommand:
async def initial(self):
...

@as_commond(
prefixes=["/"],
aliases=["天气", "气象", "风雨"],
include_class_name=False,
)
class WeatherCommandWithPrefix(WeatherCommand):
pass

@as_commond(
need_prefix=False,
# prefixes=[],
aliases=["天气", "气象", "风雨"],
include_class_name=False,
require_at=True,
)
class WeatherCommandWithAt(WeatherCommand):
pass

需要注意的是,class 的名称,不能重复,否则会报错

我们可以通过as_commandaliasesinclude_class_name参数,来实现不同 class 使用相同的 prefix 和 alias

仅需 At

如果你希望只要@了机器人,就能触发指令,可以设置require_at为 True,同时need_prefix为 False

然后,提供一个空字符串,作为 alias 即可

@as_commond(
need_prefix=False,
aliases=[""],
require_at=True,
)
class WeatherCommandWithAt(WeatherCommand):
...

现在,用户只要@了机器人,就能触发指令了

@bot

退出指令

exit_patterns

通过定义exit_patterns

都是正则表达式,和prefixes有点像

满足exit_patterns而退出,是用户主动退出,触发的是exit钩子

exit钩子,无法通过 return self.exit 手动触发



timeout