nonebot2/docs/changelog.md

198 lines
10 KiB
Markdown
Raw Normal View History

2018-10-16 06:14:11 +00:00
---
sidebar: auto
---
2018-08-26 05:44:54 +00:00
# 更新日志
2019-02-22 09:50:29 +00:00
## v1.3.0
- 允许机器人昵称和消息主体之间不使用空格或逗号分隔,即支持 `奶茶帮我查下天气` 这种用法
- 在处理命令之前检查机器人昵称,即在不编写自然语言处理器的情况下可以通过 `奶茶echo 喵` 触发 `echo` 命令,而不再强制需要 at其它命令同理
- 新增一种命令参数过滤器——控制器,在 `nonebot.command.argfilter.controllers` 模块,用于在过滤命令参数时对命令会话进行控制,内置了 `handle_cancellation()` 控制器允许用户取消正在进行的命令
- 新增命令参数验证失败次数的检查,可通过配置项 `MAX_VALIDATION_FAILURES``TOO_MANY_VALIDATION_FAILURES_EXPRESSION` 来配置最大失败次数和失败过多后的提示
2019-02-03 03:53:10 +00:00
## v1.2.3
- 修复 `nonebot.scheduler` 过早启动导致使用 Hypercorn 部署时计划任务无法运行的问题
同时使用计划任务功能和 Hypercorn 部署的用户请务必升级到此版本!
2019-02-01 11:45:23 +00:00
## v1.2.2
- 修复 `nonebot.natual_language.IntentCommand``current_arg` 参数默认为 `None` 导致的 bug
- `nonebot.helpers.render_expression` 函数新增 `*args` 用于向 Expression 传递位置参数
2019-01-26 14:21:51 +00:00
## v1.2.1
- 修复 `nonebot.helpers.context_id``group` 模式无法正确产生私聊用户 ID 的 bug
2019-01-25 14:35:20 +00:00
## 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`,现在将会默认把用户输入直接当做参数,避免不断重复询问
#### 修复
2019-01-21 02:40:53 +00:00
- 修复交互式对话中,`ctx['to_me']` 没有置为 `True` 的 bug
2019-01-25 14:35:20 +00:00
#### 弃用
下述弃用内容可能会在若干版本后彻底移除,请适当做迁移。
- 弃用 `nonebot.natual_language.NLPResult` 类,请使用 `IntentCommand` 类替代
- 弃用 `CommandSession` 类的 `args` 属性,请使用 `state` 属性替代
- 弃用 `CommandSession` 类的 `get_optional()` 方法,请使用 `state.get()` 替代
#### 例子
以一个例子总结本次更新:
```python
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()
# 如果不需要对参数进行特殊处理,则不用再手动加入 stateNoneBot 会自动放进去
@on_natural_language(keywords={'demo'})
async def _(session: NLPSession):
return IntentCommand(90.0, 'demo', current_arg='这是我的arg3')
```
2019-01-06 13:50:45 +00:00
## v1.1.0
2019-01-03 12:08:37 +00:00
2019-01-06 06:10:10 +00:00
- 插件模块现可通过 `__plugin_name__``__plugin_usage__` 来分别指定插件名称和插件使用方法(两者均不强制,若不设置则默认为 `None`
- 新增 `nonebot.plugin.get_loaded_plugins()` 函数用于获取所有已加载的插件集合
- `BaseSession.send()` 方法和 `nonebot.helpers.send()` 函数现返回 API 调用返回值(即 CQHTTP 插件的返回结果的 `data` 字段)
2019-01-05 14:36:55 +00:00
- `BaseSession` 新增 `self_id` 属性,可通过 `session.self_id` 代替 `session.ctx['self_id']` 来获取当前机器人账号
2019-01-06 13:50:45 +00:00
- `only_to_me` 的命令现可以通过在消息结尾 @ 机器人触发,而不必在开头
2019-01-03 12:08:37 +00:00
2018-12-27 12:33:41 +00:00
## 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`
2018-12-27 06:10:34 +00:00
## v0.5.3
2018-12-26 14:32:29 +00:00
- 修复使用多级命令时,命令查找会出现异常的情况
2018-12-27 04:14:19 +00:00
- 调整 `none.load_plugins()` 等方法,返回加载成功的插件数量,并新增 `none.load_plugin()` 方法用于加载单个插件模块
2018-12-26 14:32:29 +00:00
2018-12-25 12:47:26 +00:00
## v0.5.2
2018-12-24 05:15:50 +00:00
- 修复自然语言处理器匹配机器人昵称时的 bug
2018-12-25 12:47:26 +00:00
- 修复一些与异常处理有关的小问题
2018-12-24 05:15:50 +00:00
2018-12-23 15:31:22 +00:00
## v0.5.1
2018-12-23 12:20:40 +00:00
2018-12-23 15:35:34 +00:00
- 给所有发送消息的函数和方法(`BaseSession.send()`、`CommandSession.pause()`、`CommandSession.finish()` 等)新增了 `**kwargs`,并将此参数继续传递给 python-aiocqhttp 的 `CQHttp.send()` 方法,从而支持 `at_sender` 参数(默认 `False`**注意,此功能需要安装 `aiocqhttp>=0.6.7`**
2018-12-23 12:20:40 +00:00
- `BaseSession.send()` 方法新增 `ensure_private` 参数,类型 `bool`,默认 `False`,可用于确保发送消息到私聊(对于群消息,会私聊发送给发送人)
2018-12-22 16:03:48 +00:00
## v0.5.0
2018-12-21 15:39:45 +00:00
- 修复调用不存在的多级命令(例如 `/echo/nonexist`)时,抛出异常导致 WebSocket 连接断开的问题
2018-12-22 09:52:26 +00:00
- 调整 Expression 相关接口:移除了所有 `send_expr()` 函数和方法,移除了 `CommandSession.get()` 方法的 `prompt_expr` 参数,移除了 `none.expression` 模块,原 `render()` 函数移动到 `none.helpers` 模块并改名为 `render_expression()`
2018-12-22 15:07:48 +00:00
- 修改 `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']`,如不存在,则返回空列表
2018-12-21 15:39:45 +00:00
2018-12-17 09:28:44 +00:00
## v0.4.3
- 自然语言处理器支持响应只有机器人昵称而没有实际内容的消息,通过 `on_natural_language``allow_empty_message` 参数开启(默认关闭)
2018-12-11 05:07:48 +00:00
## v0.4.2
- 修复命令处理器中抛出异常导致运行超时 `SESSION_RUN_TIMEOUT` 不生效的问题
2018-11-11 04:36:51 +00:00
## v0.4.1
- `load_plugins()` 导入模块失败时打印错误信息,且日志级别从 warning 改为 error
- 修复 `CommandName_T` 的问题
- 修复特权命令在不满足 `to_me` 条件时没有被当做现有 session 的新参数的问题
2018-10-15 17:09:53 +00:00
## v0.4.0
- `message_preprocessor` 装饰器现要求被装饰函数接收 `bot``ctx` 两个参数
- 调整了 Type Hint使其更准确并新增 `none.typing` 模块,提供部分常用类型
- 规范部分模块的导入,现可通过 `none.Message` 访问 `aiocqhttp.Message`,通过 `none.CQHttpError` 访问 `aiocqhttp.Error`
2018-10-14 15:05:25 +00:00
## v0.3.2
- `none.message` 模块现已导入所有 `aiocqhttp.message` 中的内容,因此不必再从后者导入 `Message`、`escape` 等类和函数
- 命令的运行加入了超时机制,可通过 `SESSION_RUN_TIMEOUT` 配置,类型为 `datetime.timedelta`,默认为 `None` 表示永不超时
- `on_command` 装饰器新增 `privileged` 参数,可将命令设置为特权命令,特权命令即使在已存在其它 CommandSession 的情况下也会运行,但它不会覆盖当前 CommandSession
2018-10-14 15:08:07 +00:00
- 新增 `none.command.kill_current_session()` 函数用于杀死当前已存在的 CommandSession不会终止已经在运行的命令但会移除 session 对象)
2018-10-14 15:05:25 +00:00
2018-08-26 05:44:54 +00:00
## v0.3.1
- 调整计划任务的启动时间,修复创建任务后无法立即获取下次运行时间的 bug
## v0.3.0
- 内置可选的计划任务功能(需要安装 APScheduler
## v0.2.2
2018-12-27 12:23:45 +00:00
- 修复快速的连续消息导致报错问题 [#5](https://github.com/richardchien/nonebot/issues/5)