跳到主要内容

暗语消息

在事件处理流程结束后,事件会话状态会被销毁。然而,有时我们需要在事件处理流程结束后再次获取相关的特定信息,这时候就需要使用暗语消息了。

与现实中的暗语类似,暗语是一种隐藏在普通消息中的特殊信息,我们可以将暗语消息隐藏在发送的消息中,然后在事件处理流程结束后重新读取出来。

标记暗语消息

在事件处理流程中,当我们使用 sendfinish 发送消息时,可以使用 argot_content 参数将暗语隐藏在发送的消息中。

import secrets

@on_fullmatch("随机数")
async def use_argot(matcher: Matcher):
num = secrets.randbelow(100)
await matcher.send(f"你抽到的随机数为: {num}", argot_content={"num": num})

这样,我们就将 argot_content 中的值作为暗语,在发送的消息中隐藏了起来。这条消息就被标记为暗语消息。

另一种标记暗语消息的方法是使用 Argot 类。

from kirami.database import Argot

@on_fullmatch("随机数")
async def use_argot(matcher: Matcher):
num = secrets.randbelow(100)
info = await matcher.send(f"你抽到的随机数为: {num}")
await Argot(msg_id=info["message_id"], content={"num": num}).save()

通过 send 方法的返回值,我们可以获得消息的 message_id,然后使用 Argot 类将消息标记为暗语消息。

通过这种方法,你不但可以将暗语隐藏在发送的消息中,还可以将暗语隐藏在任意消息中。

提示

实际上,send 事件响应器操作是通过调用平台接口来完成的,它返回的是平台接口的返回值。

读取暗语消息

要读取暗语消息,我们需要将辅助函数的 argot 参数设置为 True。这样,当暗语消息被回复时,我们就可以通过 Matcher.get_argot 获得暗语消息的内容。

@on_fullmatch("查看随机数", argot=True)
async def get_argot(matcher: Matcher):
num = matcher.get_argot("num")
await matcher.send(f"本消息的随机数为: {num}")

也可以通过依赖注入来获取暗语消息的内容:

from kirami.depends import Argot

@on_fullmatch("查看随机数", argot=True)
async def get_argot(matcher: Matcher, num: Argot[int]):
await matcher.send(f"本消息的随机数为: {num}")
注意

argot 设置为 True 时,为了确保最优先处理暗语消息,事件响应器的优先级会被强制设置为 0