Skip to content

多步回话 普通

字数统计:819 字
阅读时长:3 分钟

有时候我们希望某用户在触发机器人命令之后

还需要再接收一次或多次来自该用户或不同用户的消息

才会继续执行业务逻辑和事件流程

那么该怎么处理呢?

单用户

聊天界面
Wuyi无疑 用户
开始测试
GsCore 机器人
开始多步会话测试
GsCore 机器人
接下来你说的话我都会提取出来噢?
干扰用户 用户
你们在说什么呢?
Wuyi无疑 用户
我爱你
GsCore 机器人
你说的是 我爱你 吧?

代码示例

python
from gsuid_core.bot import Bot
from gsuid_core.sv import SL, SV
from gsuid_core.models import Event

sv_switch = SV('测试开关')

@sv_switch.on_fullmatch('开始测试')
async def get_resp_msg(bot: Bot, ev: Event):
    await bot.send('开始多步会话测试')
    resp = await bot.receive_resp(
        '接下来你说的话我都会提取出来噢?',
    )
    if resp is not None:
        await bot.send(f'你说的是 {resp.text} 吧?')

多用户

聊天界面
Wuyi无疑 用户
开始多用户测试
GsCore 机器人
开始多步会话测试
GsCore 机器人
接下来开始游戏!?所有人的会话我都会收集起来的哦!
群友A 用户
你们在说什么呢?
GsCore 机器人
你说的是 你们在说什么呢? 吧?
Wuyi无疑 用户
我爱你
GsCore 机器人
你说的是 我爱你 吧?

代码示例

python
from gsuid_core.bot import Bot
from gsuid_core.sv import SL, SV
from gsuid_core.models import Event
from async_timeout import timeout

sv_switch = SV('测试开关')

@sv_switch.on_fullmatch('开始多用户测试')
async def get_resp_msg(bot: Bot, ev: Event):
    await bot.send('开始多步会话测试')
    await bot.send('接下来开始游戏!?所有人的会话我都会收集起来的哦!')
    while True:
        resp = await bot.receive_mutiply_resp()
        if resp is not None:
            await bot.send(f'你说的是 {resp.text} 吧?')
            
# 以下为在规定时间内结束收集回复的代码
# 常用于定时结束游戏
@sv_switch.on_fullmatch('开始一场60秒的游戏')
async def get_time_limit_resp_msg(bot: Bot, ev: Event):
    await bot.send('接下来开始60秒的游戏!?')
    try:
        async with timeout(60): # 限制时长60秒
            while True:
                resp = await bot.receive_mutiply_resp()
                if resp is not None:
                    await bot.send(f'你说的是 {resp.text} 吧?')
    except asyncio.TimeoutError:
        await bot.send('时间到!!现在开始计算每个人的分数...')

总结

💡 提醒

可以看到Bot.receive_resp()后续只会接受触发该命令的用户的消息

但是Bot.receive_mutiply_resp()会接受后续全部用户的信息

注意到Bot.send_option()Bot.receive_mutiply_resp()均会调用Bot.receive_resp()

他们三个的参数都差不多,实际使用,功能区别如下:

  • Bot.send_option()只会发送按钮(仅在QQGroup)或者在unsuported_platform参数为True的的情况下,为所有不适配按钮的发送多选消息。

  • Bot.receive_resp()在上面这个方法的基础上,还会等待触发命令用户下一条回复

  • Bot.receive_mutiply_resp()则是在上面方法的基础上,还会等待该群接下来所有用户的回复

参数

  • reply参数可以填入Bot.send()内可填入的任何值,会让Bot发送一次消息,然后继续执行流程

  • option_list参数可以填入类型List[str], List[Button]

    • 会按照列表,每行两个,发送按钮(仅在QQGroup )
    • 该参数也可以填入List[List[str]], List[List[Button]],代表每行几个按钮