中断 (Interrupt)

试着想象这样的情况:

聊天记录
A
Alice
/ban 12345678
B
Bot
请发送 "/confirm" 以确认此操作
A
Alice
/confirm
B
Bot
已将指定用户踢出群组

对于此种交互方式, 我们提供了 Interrupt 特性提供对此交互方式操作的封装.

Quickstart

note

本特性计划从 Application 迁移到 BroadcastControl, 但这里仅描述目前的状况.

import asyncio
from graia.broadcast import Broadcast
from graia.application import GraiaMiraiApplication
from graia.application.message.elements.internal import At, Plain
from graia.application.session import Session
from graia.application.message.chain import MessageChain
from graia.application.group import Group, Member
from graia.application.interrupt import InterruptControl
from graia.application.interrupt.interrupts import GroupMessageInterrupt
loop = asyncio.get_event_loop()
bcc = Broadcast(loop=loop)
app = GraiaMiraiApplication(
broadcast=bcc,
connect_info=...,
)
inc = InterruptControl(bcc)
@bcc.receiver("GroupMessage")
async def group_message_handler(
message: MessageChain,
app: GraiaMiraiApplication,
group: Group, member: Member,
):
if message.asDisplay().startswith("/test_need_confirm"):
await app.sendGroupMessage(group, MessageChain.create([
At(member.id), Plain("发送 /confirm 以继续运行")
]))
await inc.wait(GroupMessageInterrupt(
group, member,
custom_judgement=lambda x: x.messageChain.asDisplay().startswith("/confirm")
))
await app.sendGroupMessage(group, MessageChain.creat([
Plain("执行完毕.")
]))
app.launch_blocking()

如上, 你就可以在任何时候从无头客户端处接受, 处理无限个信息.

聊天记录
A
Alice
/test_need_confirm
B
Bot
@Alice 发送 "/confirm" 以继续运行
A
Alice
/confirm
B
Bot
执行完毕.

你也可以同时使用循环, 接受多个消息的参数输入.

note

当然, 你也可以使用 asyncio.wait, 通过传入 FIRST_COMPLETED 到参数 return_when 来同时判定多个条件的 Interrupt.

InterruptControl.wait 协程方法接受一个 Interrupt 实例, 该实例内的 trigger 方法将被调用, 传入事件实例(事件监听类型在 Interrupt.direct 处被定义), 当返回非 None 值时(通常都为符合要求的事件实例), InterruptControl.wait 方法将该返回值作为执行结果返回.

我们提供了几个内置的 Interrupt 实现, 在 graia.application.interrupt.interrupts 下, 该模块迁移完成后仍会留存.