nonebot2/docs/changelog.md
2019-01-25 22:35:20 +08:00

176 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
sidebar: auto
---
# 更新日志
## 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()` 替代
#### 例子
以一个例子总结本次更新:
```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')
```
## 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](https://github.com/richardchien/nonebot/issues/5)