mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-12-01 01:25:07 +08:00
10 KiB
10 KiB
sidebar |
---|
auto |
更新日志
v1.3.0
- 允许机器人昵称和消息主体之间不使用空格或逗号分隔,即支持
奶茶帮我查下天气
这种用法 - 在处理命令之前检查机器人昵称,即在不编写自然语言处理器的情况下可以通过
奶茶,echo 喵
触发echo
命令,而不再强制需要 at,其它命令同理 - 新增一种命令参数过滤器——控制器,在
nonebot.command.argfilter.controllers
模块,用于在过滤命令参数时对命令会话进行控制,内置了handle_cancellation()
控制器允许用户取消正在进行的命令 - 新增命令参数验证失败次数的检查,可通过配置项
MAX_VALIDATION_FAILURES
和TOO_MANY_VALIDATION_FAILURES_EXPRESSION
来配置最大失败次数和失败过多后的提示
v1.2.3
- 修复
nonebot.scheduler
过早启动导致使用 Hypercorn 部署时计划任务无法运行的问题
同时使用计划任务功能和 Hypercorn 部署的用户请务必升级到此版本!
v1.2.2
- 修复
nonebot.natual_language.IntentCommand
类current_arg
参数默认为None
导致的 bug nonebot.helpers.render_expression
函数新增*args
用于向 Expression 传递位置参数
v1.2.1
- 修复
nonebot.helpers.context_id
的group
模式无法正确产生私聊用户 ID 的 bug
v1.2.0
新增
- 新增
nonebot.natual_language.IntentCommand
类,用于替代旧的NLPResult
(后者已弃用),使该类的意义更明确,并新增current_arg
属性,可用于设置IntentCommand
被调用时的current_arg
nonebot
模块新增了nonebot.helpers.context_id
的快捷导入,以后可以直接通过nonebot.context_id
使用CommandSession
类新增state
属性,用于替代旧的args
(后者已弃用),明确其用于维持 session 状态的作用,本质上和原来的args
等价CommandSession
类的get()
方法新增arg_filters
参数,表示正在询问用户的参数的过滤器,用于避免为每个参数编写args_parser
(一旦在get()
时使用了arg_filters
,命令全局的args_parser
将不会对这个参数运行),具体请参考 API 文档中的示例- 新增
nonebot.command.argfilter
模块,内置了几种常用的参数过滤器,分别在extractors
、validators
、converters
子模块 - 新增配置项
DEFAULT_VALIDATION_FAILURE_EXPRESSION
,用于设置命令参数验证失败时的默认提示消息 nonebot.typing
模块新增State_T
和Filter_T
变更
CommandSession
类的current_arg_text
和current_arg_images
现变更为只读属性- 当使用
CommandSession#get()
方法获取参数后,若没有编写args_parser
也没有传入arg_filters
,现在将会默认把用户输入直接当做参数,避免不断重复询问
修复
- 修复交互式对话中,
ctx['to_me']
没有置为True
的 bug
弃用
下述弃用内容可能会在若干版本后彻底移除,请适当做迁移。
- 弃用
nonebot.natual_language.NLPResult
类,请使用IntentCommand
类替代 - 弃用
CommandSession
类的args
属性,请使用state
属性替代 - 弃用
CommandSession
类的get_optional()
方法,请使用state.get()
替代
例子
以一个例子总结本次更新:
from nonebot import *
from nonebot.command.argfilter import validators, extractors, ValidateError
async def my_custom_validator(value):
if len(value) < 8:
raise ValidateError('长度必须至少是 8 哦')
return value
@on_command('demo')
async def demo(session: CommandSession):
arg1_derived = session.state.get('arg1_derived') # 从会话状态里尝试获取
if arg1_derived is None:
arg1: int = session.get(
'arg1',
prompt='请输入参数1',
arg_filters=[
extractors.extract_text, # 提取纯文本部分
str.strip, # 去掉两边的空白
validators.not_empty(),
validators.match_regex(r'[0-9a-zA-Z]{6,20}', '必须为6~20位字符'),
my_custom_validator, # 自定义验证器
int, # 转换成 int
validators.ensure_true(lambda x: x > 20000000, '必须大于2000000')
],
at_sender=True,
)
arg1_derived = arg1 + 42
session.state['arg1_derived'] = arg1_derived # 修改会话状态
arg2 = session.get(
'arg2',
prompt='请输入参数2',
arg_filters=[
extractors.extract_image_urls, # 提取图片 URL 列表
'\n'.join, # 使用换行符拼接 URL 列表
validators.not_empty('请至少发送一张图片'),
]
)
arg3 = session.get('arg3', prompt='你的arg3是什么呢?')
reply = f'arg1_derived:\n{arg1_derived}\n\narg2:\n{arg2}\n\narg3:\n{arg3}'
session.finish(reply)
@demo.args_parser
async def _(session: CommandSession):
if session.is_first_run and session.current_arg_text.strip():
# 第一次运行,如果有参数,则设置给 arg3
session.state['arg3'] = session.current_arg_text.strip()
# 如果不需要对参数进行特殊处理,则不用再手动加入 state,NoneBot 会自动放进去
@on_natural_language(keywords={'demo'})
async def _(session: NLPSession):
return IntentCommand(90.0, 'demo', current_arg='这是我的arg3')
v1.1.0
- 插件模块现可通过
__plugin_name__
和__plugin_usage__
来分别指定插件名称和插件使用方法(两者均不强制,若不设置则默认为None
) - 新增
nonebot.plugin.get_loaded_plugins()
函数用于获取所有已加载的插件集合 BaseSession.send()
方法和nonebot.helpers.send()
函数现返回 API 调用返回值(即 CQHTTP 插件的返回结果的data
字段)BaseSession
新增self_id
属性,可通过session.self_id
代替session.ctx['self_id']
来获取当前机器人账号only_to_me
的命令现可以通过在消息结尾 @ 机器人触发,而不必在开头
v1.0.0
- 更改包名为
nonebot
,请注意修改导入语句,原先import none
改为import nonebot
,from none import something
改为from nonebot import something
,none.something
改为nonebot.something
,如果代码量比较大,可以使用import nonebot as none
,以避免过多更改 nonebot.command.kill_current_session()
方法去掉了bot
参数,现只需传入ctx
v0.5.3
- 修复使用多级命令时,命令查找会出现异常的情况
- 调整
none.load_plugins()
等方法,返回加载成功的插件数量,并新增none.load_plugin()
方法用于加载单个插件模块
v0.5.2
- 修复自然语言处理器匹配机器人昵称时的 bug
- 修复一些与异常处理有关的小问题
v0.5.1
- 给所有发送消息的函数和方法(
BaseSession.send()
、CommandSession.pause()
、CommandSession.finish()
等)新增了**kwargs
,并将此参数继续传递给 python-aiocqhttp 的CQHttp.send()
方法,从而支持at_sender
参数(默认False
),注意,此功能需要安装aiocqhttp>=0.6.7
BaseSession.send()
方法新增ensure_private
参数,类型bool
,默认False
,可用于确保发送消息到私聊(对于群消息,会私聊发送给发送人)
v0.5.0
- 修复调用不存在的多级命令(例如
/echo/nonexist
)时,抛出异常导致 WebSocket 连接断开的问题 - 调整 Expression 相关接口:移除了所有
send_expr()
函数和方法,移除了CommandSession.get()
方法的prompt_expr
参数,移除了none.expression
模块,原render()
函数移动到none.helpers
模块并改名为render_expression()
- 修改
none.argparse.ArgumentParser
类的构造方法和parse_args()
方法:构造方法新增session
参数,可传入CommandSession
对象;parse_args()
方法可直接用于解析参数,用户输入的参数错误,会发送错误提示或使用帮助 on_command
装饰器新增shell_like
参数,设为True
(默认False
)将自动以类 shell 语法分割命令参数current_arg
(不再需要自行编写 args parser),并将分割后的参数列表放入session.args['argv']
CommandSession
类新增argv
只读属性,用于获取session.args['argv']
,如不存在,则返回空列表
v0.4.3
- 自然语言处理器支持响应只有机器人昵称而没有实际内容的消息,通过
on_natural_language
的allow_empty_message
参数开启(默认关闭)
v0.4.2
- 修复命令处理器中抛出异常导致运行超时
SESSION_RUN_TIMEOUT
不生效的问题
v0.4.1
load_plugins()
导入模块失败时打印错误信息,且日志级别从 warning 改为 error- 修复
CommandName_T
的问题 - 修复特权命令在不满足
to_me
条件时没有被当做现有 session 的新参数的问题
v0.4.0
message_preprocessor
装饰器现要求被装饰函数接收bot
和ctx
两个参数- 调整了 Type Hint,使其更准确,并新增
none.typing
模块,提供部分常用类型 - 规范部分模块的导入,现可通过
none.Message
访问aiocqhttp.Message
,通过none.CQHttpError
访问aiocqhttp.Error
v0.3.2
none.message
模块现已导入所有aiocqhttp.message
中的内容,因此不必再从后者导入Message
、escape
等类和函数- 命令的运行加入了超时机制,可通过
SESSION_RUN_TIMEOUT
配置,类型为datetime.timedelta
,默认为None
表示永不超时 on_command
装饰器新增privileged
参数,可将命令设置为特权命令,特权命令即使在已存在其它 CommandSession 的情况下也会运行,但它不会覆盖当前 CommandSession- 新增
none.command.kill_current_session()
函数用于杀死当前已存在的 CommandSession(不会终止已经在运行的命令,但会移除 session 对象)
v0.3.1
- 调整计划任务的启动时间,修复创建任务后无法立即获取下次运行时间的 bug
v0.3.0
- 内置可选的计划任务功能(需要安装 APScheduler)
v0.2.2
- 修复快速的连续消息导致报错问题 #5