Version: Next
会话控制
在指南的 weather
插件中,我们使用依赖注入获取了机器人用户发送的地名参数,并根据地名参数进行相应的回复。但是,一问一答的对话模式仅仅适用于简单的对话场景,如果我们想要实现更复杂的对话模式,就需要使用会话控制。
询问并获取用户输入
在 weather
插件中,我们对于用户未输入地名参数的情况直接回复了 请输入地名
并结束了事件流程。但是,这样用户体验并不好,需要重新输入指令和地名参数才能获取天气回复。我们现在来实现询问并获取用户地名参数的功能。
询问用户
我们可以使用事件响应器操 作中的 got
装饰器来表示当前事件处理流程需要询问并获取用户输入的消息:
@weather.handle()
async def handle_function(args: Message = CommandArg()):
if location := args.extract_plain_text():
await weather.finish(f"今天{location}的天气是...")
@weather.got("location", prompt="请输入地名")
async def got_location():
...
在上面的代码中,我们使用 got
事件响应器操作来向用户发送 prompt
消息,并等待用户的回复。用户的回复消息将会被作为 location
参数存储于事件响应器状态中。
提示
事件处理函数根据定义的顺序依次执行。
获取用户输入
在询问以及用户回复之后,我们就可以获取到我们需要的 location
参数了。我们使用 ArgPlainText
依赖注入来获取参数纯文本信息:
from nonebot.params import ArgPlainText
@weather.handle()
async def handle_function(args: Message = CommandArg()):
if location := args.extract_plain_text():
await weather.finish(f"今天{location}的天气是...")
@weather.got("location", prompt="请输入地名")
async def got_location(location: str = ArgPlainText()):
await weather.finish(f"今天{location}的天气是...")
NoneBot
/天气
请输入地名
北京
今天北京的天气是...