nonebot2/website/docs/best-practice/alconna/utils.md
Tarrailt 7e0c29472e
📝 Docs: 更新最佳实践 Alconna (#2401)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2023-10-07 12:06:07 +08:00

2.2 KiB
Raw Blame History

sidebar_position description
6 杂项

杂项

特殊装饰器

nonebot_plugin_alconna 提供 了一个 funcommand 装饰器, 其用于将一个接受任意参数, 返回 strMessageMessageSegment 的函数转换为命令响应器。

from nonebot_plugin_alconna import funcommand

@funcommand()
async def echo(msg: str):
    return msg

其等同于

from arclet.alconna import Alconna, Args
from nonebot_plugin_alconna import on_alconna, AlconnaMatch, Match

echo = on_alconna(Alconna("echo", Args["msg", str]))

@echo.handle()
async def echo_exit(msg: Match[str] = AlconnaMatch("msg")):
    await echo.finish(msg.result)

特殊构造器

nonebot_plugin_alconna 提供了一个 Command 构造器,其基于 arclet.alconna.tools 中的 AlconnaString 以类似 Koishi 中注册命令的方式来构建一个 AlconnaMatcher

from nonebot_plugin_alconna import Command, Arparma

book = (
    Command("book", "测试")
    .option("writer", "-w <id:int>")
    .option("writer", "--anonymous", {"id": 0})
    .usage("book [-w <id:int> | --anonymous]")
    .shortcut("测试", {"args": ["--anonymous"]})
    .build()
)

@book.handle()
async def _(arp: Arparma):
    await book.send(str(arp.options))

甚至,你可以设置 action 来设定响应行为:

book = (
    Command("book", "测试")
    .option("writer", "-w <id:int>")
    .option("writer", "--anonymous", {"id": 0})
    .usage("book [-w <id:int> | --anonymous]")
    .shortcut("测试", {"args": ["--anonymous"]})
    .action(lambda options: str(options))  # 会自动通过 bot.send 发送
    .build()
)

中间件

AlconnaMatch, AlconnaQuerygot_path 中,你可以使用 middleware 参数来传入一个对返回值进行处理的函数,

from nonebot_plugin_alconna import image_fetch

mask_cmd = on_alconna(
    Alconna("search", Args["img?", Image]),
)


@mask_cmd.handle()
async def mask_h(matcher: AlconnaMatcher, img: Match[bytes] = AlconnaMatch("img", image_fetch)):
    result = await search_img(img.result)
    await matcher.send(result.content)

其中,image_fetch 是一个中间件,其接受一个 Image 对象,并提取图片的二进制数据返回。