nonebot-plugin-alconna


Namenonebot-plugin-alconna JSON
Version 0.45.3 PyPI version JSON
download
home_pagehttps://github.com/nonebot/plugin-alconna
SummaryAlconna Adapter for Nonebot
upload_time2024-05-02 06:43:58
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT
keywords command alconna nonebot
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <p align="center">
  <a href="https://v2.nonebot.dev/"><img src="https://v2.nonebot.dev/logo.png" width="200" height="200" alt="nonebot"></a>
</p>

<div align="center">

# NoneBot Plugin Alconna

_✨ Alconna Usage For NoneBot2 ✨_

</div>

<p align="center">
  <a href="https://raw.githubusercontent.com/nonebot/plugin-alconna/master/LICENSE">
    <img src="https://img.shields.io/github/license/nonebot/plugin-alconna.svg" alt="license">
  </a>
  <a href="https://pypi.python.org/pypi/nonebot-plugin-alconna">
    <img src="https://img.shields.io/pypi/v/nonebot-plugin-alconna.svg" alt="pypi">
  </a>
  <img src="https://img.shields.io/badge/python-3.9+-blue.svg" alt="python">
</p>

该插件提供了 [Alconna](https://github.com/ArcletProject/Alconna) 的 [NoneBot2](https://github.com/nonebot/nonebot2) 适配版本与工具

## 特性

- 完整的 Alconna 特性支持
- 基本的 rule, matcher 与 依赖注入
- 自动回复命令帮助信息 (help, shortcut, completion) 选项
- 现有全部协议的 Segment 标注
- match_value, match_path 等检查函数
- 补全会话支持
- 跨平台的接收与发送消息(被动+主动)
- 多种内建工具

## 讨论

QQ 交流群: [链接](https://jq.qq.com/?_wv=1027&k=PUPOnCSH)


## 使用方法

NoneBot 文档: [📖这里](https://nonebot.dev/docs/next/best-practice/alconna/)
仓库内介绍: [📦这里](/docs.md)

### 消息解析

```python
from nonebot.adapters.onebot.v12 import Message, MessageSegment
from arclet.alconna import Alconna, Option, Args

msg = Message("Hello! --foo 123")
img = MessageSegment.image("1.png")
print(msg)

alc = Alconna("Hello!", Option("--foo", Args["foo", int]))
res = alc.parse(msg)
assert res.matched
assert res.query("foo.foo") == 123
assert not alc.parse(Message(["Hello!", img])).matched
```

### MessageSegment 标注

特定适配器:

```python
from nonebot_plugin_alconna.adapters.onebot12 import Mention
from nonebot.adapters.onebot.v12 import Message
from arclet.alconna import Alconna, Args

msg = Message(["Hello!", Mention("123")])
print(msg)  # Hello![mention:user_id=123]

alc = Alconna("Hello!", Args["target", Mention])
res = alc.parse(msg)
assert res.matched
assert res.query("target").data['user_id'] == '123'
```

通用标注:

```python
from nonebot.adapters.onebot.v12 import Message as Ob12Msg, MessageSegment as Ob12MS
from nonebot.adapters.onebot.v11 import Message as Ob11Msg, MessageSegment as Ob11MS
from nonebot_plugin_alconna import At
from arclet.alconna import Alconna, Args

msg1 = Ob12Msg(["Hello!", Ob12MS.mention("123")]) # Hello![mention:user_id=123]
msg2 = Ob11Msg(["Hello!", Ob11MS.at(123)]) # Hello![CQ:at,qq=123]


alc = Alconna("Hello!", Args["target", At])
res1 = alc.parse(msg1)
assert res1.matched
target = res1.query("target")
assert isinstance(target, At)
assert target.target == '123'

res2 = alc.parse(msg2)
assert res2.matched
target = res2.query("target")
assert isinstance(target, At)
assert target.target == '123'
```

### Matcher 与 依赖注入
```python
...
from nonebot import require
require("nonebot_plugin_alconna")
...

from nonebot_plugin_alconna import (
    on_alconna, 
    Match,
    Query,
    AlconnaMatch, 
    AlconnaQuery,
    AlcMatches,
    AlcResult
)
from arclet.alconna import Alconna, Args, Option

test = on_alconna(
    Alconna(
        "test",
        Option("foo", Args["bar", int]),
        Option("baz", Args["qux", bool, False])
    ),
    auto_send_output=True
)


@test.handle()
async def handle_test1(result: AlcResult):
    await test.send(f"matched: {result.matched}")
    await test.send(f"maybe output: {result.output}")

@test.handle()
async def handle_test2(result: AlcMatches):
    await test.send(f"head result: {result.header_result}")
    await test.send(f"args: {result.all_matched_args}")

@test.handle()
async def handle_test3(bar: Match[int] = AlconnaMatch("bar")):
    if bar.available:    
        await test.send(f"foo={bar.result}")

@test.handle()
async def handle_test4(qux: Query[bool] = AlconnaQuery("baz.qux", False)):
    if qux.available:
        await test.send(f"baz.qux={qux.result}")
```

### 条件控制

```python
...
from nonebot import require
require("nonebot_plugin_alconna")
...

from arclet.alconna import Alconna, Subcommand, Option, Args
from nonebot_plugin_alconna import on_alconna, AlconnaResult, CommandResult

pip = Alconna(
    "pip",
    Subcommand(
        "install", 
        Args["pak", str],
        Option("--upgrade"),
        Option("--force-reinstall")
    ),
    Subcommand(
        "list",
        Option("--out-dated")
    )
)

pip_cmd = on_alconna(pip)

@pip_cmd.assign("install.pak", "pip")
async def update(arp: CommandResult = AlconnaResult()):
    ...

@pip_cmd.assign("list")
async def list_(arp: CommandResult = AlconnaResult()):
    ...

install_cmd = pip_cmd.dispatch("install")

@install_cmd.handle()
async def install(arp: CommandResult = AlconnaResult()):
    ...

@install_cmd.assign("install.pak", "nonebot")
async def nonebot(arp: CommandResult = AlconnaResult()):
    ...
```

## 跨平台消息

```python
from nonebot import get_driver
from nonebot_plugin_alconna import UniMessage, SupportScope, on_alconna

driver = get_driver
test = on_alconna("test")

@test.handle()
async def handle_test():
    r = await UniMessage.image(path="path/to/img").send()
    if r.recallable:
        await r.reply("图片已发送,10秒后撤回")
        await r.recall(delay=10, index=0)

@test.got("foo", prompt=UniMessage.template("{:Reply($message_id)}请输入图片"))
async def handle_foo():
    await test.send("图片已收到")

@driver.on_startup
async def_():
    await Target.group("123456789", SupportScope.qq_client).send(UniMessage.image(path="test.png"))
```

## 配置

目前配置项有:

- ALCONNA_AUTO_SEND_OUTPUT : 是否全局启用输出信息自动发送
- ALCONNA_USE_COMMAND_START : 是否将 COMMAND_START 作为全局命令前缀
- ALCONNA_AUTO_COMPLETION: 是否全局启用补全会话功能
- ALCONNA_USE_ORIGIN: 是否全局使用原始消息 (即未经过 to_me 等处理的)
- ALCONNA_USE_PARAM: 是否使用特制的 Param 提供更好的依赖注入
- ALCONNA_USE_CMD_SEP: 是否将 COMMAND_SEP 作为全局命令分隔符
- ALCONNA_GLOBAL_EXTENSIONS: 全局加载的扩展, 路径以 . 分隔, 如 foo.bar.baz:DemoExtension
- ALCONNA_CONTEXT_STYLE: 全局命令上下文插值的风格,None 为关闭,bracket 为 {...},parentheses 为 $(...)
- ALCONNA_ENABLE_SAA_PATCH: 是否启用 SAA 补丁
- ALCONNA_APPLY_FILEHOST: 是否启用文件托管
- ALCONNA_APPLY_FETCH_TARGETS: 是否启动时拉取一次发送对象列表

## 参数解释

```python
def on_alconna(
    command: Alconna | str,
    skip_for_unmatch: bool = True,
    auto_send_output: bool = False,
    aliases: set[str | tuple[str, ...]] | None = None,
    comp_config: CompConfig | None = None,
    extensions: list[type[Extension] | Extension] | None = None,
    exclude_ext: list[type[Extension] | str] | None = None,
    use_origin: bool = False,
    use_cmd_start: bool = False,
    use_cmd_sep: bool = False,
    **kwargs,
) -> type[AlconnaMatcher]:
```

- `command`: Alconna 命令
- `skip_for_unmatch`: 是否在命令不匹配时跳过该响应
- `auto_send_output`: 是否自动发送输出信息并跳过响应
- `aliases`: 命令别名, 作用类似于 `on_command`
- `comp_config`: 补全会话配置, 不传入则不启用补全会话
- `extensions`: 需要加载的匹配扩展, 可以是扩展类或扩展实例
- `exclude_ext`: 需要排除的匹配扩展, 可以是扩展类或扩展的id
- `use_origin`: 是否使用未经 to_me 等处理过的消息
- `use_cmd_start`: 是否使用 COMMAND_START 作为命令前缀
- `use_cmd_sep`: 是否使用 COMMAND_SEP 作为命令分隔符

## 提供了 MessageSegment标注 的协议:

| 协议名称                                                                | 路径                                   |
|---------------------------------------------------------------------|--------------------------------------|
| [OneBot 协议](https://onebot.dev/)                                    | adapters.onebot11, adapters.onebot12 |
| [Telegram](https://core.telegram.org/bots/api)                      | adapters.telegram                    |
| [飞书](https://open.feishu.cn/document/home/index)                    | adapters.feishu                      |
| [GitHub](https://docs.github.com/en/developers/apps)                | adapters.github                      |
| [QQ bot](https://github.com/nonebot/adapter-qq)                     | adapters.qq                          |
| [钉钉](https://open.dingtalk.com/document/)                           | adapters.ding                        |
| [Console](https://github.com/nonebot/adapter-console)               | adapters.console                     |
| [开黑啦](https://developer.kookapp.cn/)                                | adapters.kook                        |
| [Mirai](https://docs.mirai.mamoe.net/mirai-api-http/)               | adapters.mirai                       |
| [Ntchat](https://github.com/JustUndertaker/adapter-ntchat)          | adapters.ntchat                      |
| [MineCraft](https://github.com/17TheWord/nonebot-adapter-minecraft) | adapters.minecraft                   |
| [BiliBili Live](https://github.com/wwweww/adapter-bilibili)         | adapters.bilibili                    |
| [Walle-Q](https://github.com/onebot-walle/nonebot_adapter_walleq)   | adapters.onebot12                    |
| [Discord](https://github.com/nonebot/adapter-discord)               | adapters.discord                     |
| [Red 协议](https://github.com/nonebot/adapter-red)                    | adapters.red                         |
| [Satori](https://github.com/nonebot/adapter-satori)                 | adapters.satori                      |
| [Dodo IM](https://github.com/nonebot/adapter-dodo)                  | adapters.dodo                        |
| [Kritor](https://github.com/nonebot/adapter-kritor)                 | adapters.kritor                        |


## 便捷装饰器

`funcommand` 装饰器用于将一个接受任意参数,返回 `str` 或 `Message` 或 `MessageSegment` 的函数转换为命令响应器。

```python
from nonebot_plugin_alconna import funcommand

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

## 体验

[demo bot](./example/plugins/demo.py)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/nonebot/plugin-alconna",
    "name": "nonebot-plugin-alconna",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "command, alconna, nonebot",
    "author": null,
    "author_email": "RF-Tar-Railt <rf_tar_railt@qq.com>",
    "download_url": "https://files.pythonhosted.org/packages/91/4c/c8dd34e793b4a8ef5c378ae11e3c999df22bec8266a47d219d469bb4191f/nonebot_plugin_alconna-0.45.3.tar.gz",
    "platform": null,
    "description": "<p align=\"center\">\n  <a href=\"https://v2.nonebot.dev/\"><img src=\"https://v2.nonebot.dev/logo.png\" width=\"200\" height=\"200\" alt=\"nonebot\"></a>\n</p>\n\n<div align=\"center\">\n\n# NoneBot Plugin Alconna\n\n_\u2728 Alconna Usage For NoneBot2 \u2728_\n\n</div>\n\n<p align=\"center\">\n  <a href=\"https://raw.githubusercontent.com/nonebot/plugin-alconna/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nonebot/plugin-alconna.svg\" alt=\"license\">\n  </a>\n  <a href=\"https://pypi.python.org/pypi/nonebot-plugin-alconna\">\n    <img src=\"https://img.shields.io/pypi/v/nonebot-plugin-alconna.svg\" alt=\"pypi\">\n  </a>\n  <img src=\"https://img.shields.io/badge/python-3.9+-blue.svg\" alt=\"python\">\n</p>\n\n\u8be5\u63d2\u4ef6\u63d0\u4f9b\u4e86 [Alconna](https://github.com/ArcletProject/Alconna) \u7684 [NoneBot2](https://github.com/nonebot/nonebot2) \u9002\u914d\u7248\u672c\u4e0e\u5de5\u5177\n\n## \u7279\u6027\n\n- \u5b8c\u6574\u7684 Alconna \u7279\u6027\u652f\u6301\n- \u57fa\u672c\u7684 rule, matcher \u4e0e \u4f9d\u8d56\u6ce8\u5165\n- \u81ea\u52a8\u56de\u590d\u547d\u4ee4\u5e2e\u52a9\u4fe1\u606f (help, shortcut, completion) \u9009\u9879\n- \u73b0\u6709\u5168\u90e8\u534f\u8bae\u7684 Segment \u6807\u6ce8\n- match_value, match_path \u7b49\u68c0\u67e5\u51fd\u6570\n- \u8865\u5168\u4f1a\u8bdd\u652f\u6301\n- \u8de8\u5e73\u53f0\u7684\u63a5\u6536\u4e0e\u53d1\u9001\u6d88\u606f(\u88ab\u52a8+\u4e3b\u52a8)\n- \u591a\u79cd\u5185\u5efa\u5de5\u5177\n\n## \u8ba8\u8bba\n\nQQ \u4ea4\u6d41\u7fa4: [\u94fe\u63a5](https://jq.qq.com/?_wv=1027&k=PUPOnCSH)\n\n\n## \u4f7f\u7528\u65b9\u6cd5\n\nNoneBot \u6587\u6863: [\ud83d\udcd6\u8fd9\u91cc](https://nonebot.dev/docs/next/best-practice/alconna/)\n\u4ed3\u5e93\u5185\u4ecb\u7ecd: [\ud83d\udce6\u8fd9\u91cc](/docs.md)\n\n### \u6d88\u606f\u89e3\u6790\n\n```python\nfrom nonebot.adapters.onebot.v12 import Message, MessageSegment\nfrom arclet.alconna import Alconna, Option, Args\n\nmsg = Message(\"Hello! --foo 123\")\nimg = MessageSegment.image(\"1.png\")\nprint(msg)\n\nalc = Alconna(\"Hello!\", Option(\"--foo\", Args[\"foo\", int]))\nres = alc.parse(msg)\nassert res.matched\nassert res.query(\"foo.foo\") == 123\nassert not alc.parse(Message([\"Hello!\", img])).matched\n```\n\n### MessageSegment \u6807\u6ce8\n\n\u7279\u5b9a\u9002\u914d\u5668:\n\n```python\nfrom nonebot_plugin_alconna.adapters.onebot12 import Mention\nfrom nonebot.adapters.onebot.v12 import Message\nfrom arclet.alconna import Alconna, Args\n\nmsg = Message([\"Hello!\", Mention(\"123\")])\nprint(msg)  # Hello![mention:user_id=123]\n\nalc = Alconna(\"Hello!\", Args[\"target\", Mention])\nres = alc.parse(msg)\nassert res.matched\nassert res.query(\"target\").data['user_id'] == '123'\n```\n\n\u901a\u7528\u6807\u6ce8:\n\n```python\nfrom nonebot.adapters.onebot.v12 import Message as Ob12Msg, MessageSegment as Ob12MS\nfrom nonebot.adapters.onebot.v11 import Message as Ob11Msg, MessageSegment as Ob11MS\nfrom nonebot_plugin_alconna import At\nfrom arclet.alconna import Alconna, Args\n\nmsg1 = Ob12Msg([\"Hello!\", Ob12MS.mention(\"123\")]) # Hello![mention:user_id=123]\nmsg2 = Ob11Msg([\"Hello!\", Ob11MS.at(123)]) # Hello![CQ:at,qq=123]\n\n\nalc = Alconna(\"Hello!\", Args[\"target\", At])\nres1 = alc.parse(msg1)\nassert res1.matched\ntarget = res1.query(\"target\")\nassert isinstance(target, At)\nassert target.target == '123'\n\nres2 = alc.parse(msg2)\nassert res2.matched\ntarget = res2.query(\"target\")\nassert isinstance(target, At)\nassert target.target == '123'\n```\n\n### Matcher \u4e0e \u4f9d\u8d56\u6ce8\u5165\n```python\n...\nfrom nonebot import require\nrequire(\"nonebot_plugin_alconna\")\n...\n\nfrom nonebot_plugin_alconna import (\n    on_alconna, \n    Match,\n    Query,\n    AlconnaMatch, \n    AlconnaQuery,\n    AlcMatches,\n    AlcResult\n)\nfrom arclet.alconna import Alconna, Args, Option\n\ntest = on_alconna(\n    Alconna(\n        \"test\",\n        Option(\"foo\", Args[\"bar\", int]),\n        Option(\"baz\", Args[\"qux\", bool, False])\n    ),\n    auto_send_output=True\n)\n\n\n@test.handle()\nasync def handle_test1(result: AlcResult):\n    await test.send(f\"matched: {result.matched}\")\n    await test.send(f\"maybe output: {result.output}\")\n\n@test.handle()\nasync def handle_test2(result: AlcMatches):\n    await test.send(f\"head result: {result.header_result}\")\n    await test.send(f\"args: {result.all_matched_args}\")\n\n@test.handle()\nasync def handle_test3(bar: Match[int] = AlconnaMatch(\"bar\")):\n    if bar.available:    \n        await test.send(f\"foo={bar.result}\")\n\n@test.handle()\nasync def handle_test4(qux: Query[bool] = AlconnaQuery(\"baz.qux\", False)):\n    if qux.available:\n        await test.send(f\"baz.qux={qux.result}\")\n```\n\n### \u6761\u4ef6\u63a7\u5236\n\n```python\n...\nfrom nonebot import require\nrequire(\"nonebot_plugin_alconna\")\n...\n\nfrom arclet.alconna import Alconna, Subcommand, Option, Args\nfrom nonebot_plugin_alconna import on_alconna, AlconnaResult, CommandResult\n\npip = Alconna(\n    \"pip\",\n    Subcommand(\n        \"install\", \n        Args[\"pak\", str],\n        Option(\"--upgrade\"),\n        Option(\"--force-reinstall\")\n    ),\n    Subcommand(\n        \"list\",\n        Option(\"--out-dated\")\n    )\n)\n\npip_cmd = on_alconna(pip)\n\n@pip_cmd.assign(\"install.pak\", \"pip\")\nasync def update(arp: CommandResult = AlconnaResult()):\n    ...\n\n@pip_cmd.assign(\"list\")\nasync def list_(arp: CommandResult = AlconnaResult()):\n    ...\n\ninstall_cmd = pip_cmd.dispatch(\"install\")\n\n@install_cmd.handle()\nasync def install(arp: CommandResult = AlconnaResult()):\n    ...\n\n@install_cmd.assign(\"install.pak\", \"nonebot\")\nasync def nonebot(arp: CommandResult = AlconnaResult()):\n    ...\n```\n\n## \u8de8\u5e73\u53f0\u6d88\u606f\n\n```python\nfrom nonebot import get_driver\nfrom nonebot_plugin_alconna import UniMessage, SupportScope, on_alconna\n\ndriver = get_driver\ntest = on_alconna(\"test\")\n\n@test.handle()\nasync def handle_test():\n    r = await UniMessage.image(path=\"path/to/img\").send()\n    if r.recallable:\n        await r.reply(\"\u56fe\u7247\u5df2\u53d1\u9001\uff0c10\u79d2\u540e\u64a4\u56de\")\n        await r.recall(delay=10, index=0)\n\n@test.got(\"foo\", prompt=UniMessage.template(\"{:Reply($message_id)}\u8bf7\u8f93\u5165\u56fe\u7247\"))\nasync def handle_foo():\n    await test.send(\"\u56fe\u7247\u5df2\u6536\u5230\")\n\n@driver.on_startup\nasync def_():\n    await Target.group(\"123456789\", SupportScope.qq_client).send(UniMessage.image(path=\"test.png\"))\n```\n\n## \u914d\u7f6e\n\n\u76ee\u524d\u914d\u7f6e\u9879\u6709\uff1a\n\n- ALCONNA_AUTO_SEND_OUTPUT : \u662f\u5426\u5168\u5c40\u542f\u7528\u8f93\u51fa\u4fe1\u606f\u81ea\u52a8\u53d1\u9001\n- ALCONNA_USE_COMMAND_START : \u662f\u5426\u5c06 COMMAND_START \u4f5c\u4e3a\u5168\u5c40\u547d\u4ee4\u524d\u7f00\n- ALCONNA_AUTO_COMPLETION: \u662f\u5426\u5168\u5c40\u542f\u7528\u8865\u5168\u4f1a\u8bdd\u529f\u80fd\n- ALCONNA_USE_ORIGIN: \u662f\u5426\u5168\u5c40\u4f7f\u7528\u539f\u59cb\u6d88\u606f (\u5373\u672a\u7ecf\u8fc7 to_me \u7b49\u5904\u7406\u7684)\n- ALCONNA_USE_PARAM: \u662f\u5426\u4f7f\u7528\u7279\u5236\u7684 Param \u63d0\u4f9b\u66f4\u597d\u7684\u4f9d\u8d56\u6ce8\u5165\n- ALCONNA_USE_CMD_SEP: \u662f\u5426\u5c06 COMMAND_SEP \u4f5c\u4e3a\u5168\u5c40\u547d\u4ee4\u5206\u9694\u7b26\n- ALCONNA_GLOBAL_EXTENSIONS: \u5168\u5c40\u52a0\u8f7d\u7684\u6269\u5c55, \u8def\u5f84\u4ee5 . \u5206\u9694, \u5982 foo.bar.baz:DemoExtension\n- ALCONNA_CONTEXT_STYLE: \u5168\u5c40\u547d\u4ee4\u4e0a\u4e0b\u6587\u63d2\u503c\u7684\u98ce\u683c\uff0cNone \u4e3a\u5173\u95ed\uff0cbracket \u4e3a {...}\uff0cparentheses \u4e3a $(...)\n- ALCONNA_ENABLE_SAA_PATCH: \u662f\u5426\u542f\u7528 SAA \u8865\u4e01\n- ALCONNA_APPLY_FILEHOST: \u662f\u5426\u542f\u7528\u6587\u4ef6\u6258\u7ba1\n- ALCONNA_APPLY_FETCH_TARGETS: \u662f\u5426\u542f\u52a8\u65f6\u62c9\u53d6\u4e00\u6b21\u53d1\u9001\u5bf9\u8c61\u5217\u8868\n\n## \u53c2\u6570\u89e3\u91ca\n\n```python\ndef on_alconna(\n    command: Alconna | str,\n    skip_for_unmatch: bool = True,\n    auto_send_output: bool = False,\n    aliases: set[str | tuple[str, ...]] | None = None,\n    comp_config: CompConfig | None = None,\n    extensions: list[type[Extension] | Extension] | None = None,\n    exclude_ext: list[type[Extension] | str] | None = None,\n    use_origin: bool = False,\n    use_cmd_start: bool = False,\n    use_cmd_sep: bool = False,\n    **kwargs,\n) -> type[AlconnaMatcher]:\n```\n\n- `command`: Alconna \u547d\u4ee4\n- `skip_for_unmatch`: \u662f\u5426\u5728\u547d\u4ee4\u4e0d\u5339\u914d\u65f6\u8df3\u8fc7\u8be5\u54cd\u5e94\n- `auto_send_output`: \u662f\u5426\u81ea\u52a8\u53d1\u9001\u8f93\u51fa\u4fe1\u606f\u5e76\u8df3\u8fc7\u54cd\u5e94\n- `aliases`: \u547d\u4ee4\u522b\u540d, \u4f5c\u7528\u7c7b\u4f3c\u4e8e `on_command`\n- `comp_config`: \u8865\u5168\u4f1a\u8bdd\u914d\u7f6e, \u4e0d\u4f20\u5165\u5219\u4e0d\u542f\u7528\u8865\u5168\u4f1a\u8bdd\n- `extensions`: \u9700\u8981\u52a0\u8f7d\u7684\u5339\u914d\u6269\u5c55, \u53ef\u4ee5\u662f\u6269\u5c55\u7c7b\u6216\u6269\u5c55\u5b9e\u4f8b\n- `exclude_ext`: \u9700\u8981\u6392\u9664\u7684\u5339\u914d\u6269\u5c55, \u53ef\u4ee5\u662f\u6269\u5c55\u7c7b\u6216\u6269\u5c55\u7684id\n- `use_origin`: \u662f\u5426\u4f7f\u7528\u672a\u7ecf to_me \u7b49\u5904\u7406\u8fc7\u7684\u6d88\u606f\n- `use_cmd_start`: \u662f\u5426\u4f7f\u7528 COMMAND_START \u4f5c\u4e3a\u547d\u4ee4\u524d\u7f00\n- `use_cmd_sep`: \u662f\u5426\u4f7f\u7528 COMMAND_SEP \u4f5c\u4e3a\u547d\u4ee4\u5206\u9694\u7b26\n\n## \u63d0\u4f9b\u4e86 MessageSegment\u6807\u6ce8 \u7684\u534f\u8bae:\n\n| \u534f\u8bae\u540d\u79f0                                                                | \u8def\u5f84                                   |\n|---------------------------------------------------------------------|--------------------------------------|\n| [OneBot \u534f\u8bae](https://onebot.dev/)                                    | adapters.onebot11, adapters.onebot12 |\n| [Telegram](https://core.telegram.org/bots/api)                      | adapters.telegram                    |\n| [\u98de\u4e66](https://open.feishu.cn/document/home/index)                    | adapters.feishu                      |\n| [GitHub](https://docs.github.com/en/developers/apps)                | adapters.github                      |\n| [QQ bot](https://github.com/nonebot/adapter-qq)                     | adapters.qq                          |\n| [\u9489\u9489](https://open.dingtalk.com/document/)                           | adapters.ding                        |\n| [Console](https://github.com/nonebot/adapter-console)               | adapters.console                     |\n| [\u5f00\u9ed1\u5566](https://developer.kookapp.cn/)                                | adapters.kook                        |\n| [Mirai](https://docs.mirai.mamoe.net/mirai-api-http/)               | adapters.mirai                       |\n| [Ntchat](https://github.com/JustUndertaker/adapter-ntchat)          | adapters.ntchat                      |\n| [MineCraft](https://github.com/17TheWord/nonebot-adapter-minecraft) | adapters.minecraft                   |\n| [BiliBili Live](https://github.com/wwweww/adapter-bilibili)         | adapters.bilibili                    |\n| [Walle-Q](https://github.com/onebot-walle/nonebot_adapter_walleq)   | adapters.onebot12                    |\n| [Discord](https://github.com/nonebot/adapter-discord)               | adapters.discord                     |\n| [Red \u534f\u8bae](https://github.com/nonebot/adapter-red)                    | adapters.red                         |\n| [Satori](https://github.com/nonebot/adapter-satori)                 | adapters.satori                      |\n| [Dodo IM](https://github.com/nonebot/adapter-dodo)                  | adapters.dodo                        |\n| [Kritor](https://github.com/nonebot/adapter-kritor)                 | adapters.kritor                        |\n\n\n## \u4fbf\u6377\u88c5\u9970\u5668\n\n`funcommand` \u88c5\u9970\u5668\u7528\u4e8e\u5c06\u4e00\u4e2a\u63a5\u53d7\u4efb\u610f\u53c2\u6570\uff0c\u8fd4\u56de `str` \u6216 `Message` \u6216 `MessageSegment` \u7684\u51fd\u6570\u8f6c\u6362\u4e3a\u547d\u4ee4\u54cd\u5e94\u5668\u3002\n\n```python\nfrom nonebot_plugin_alconna import funcommand\n\n@funcommand()\nasync def echo(msg: str):\n    return msg\n```\n\n## \u4f53\u9a8c\n\n[demo bot](./example/plugins/demo.py)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Alconna Adapter for Nonebot",
    "version": "0.45.3",
    "project_urls": {
        "Homepage": "https://github.com/nonebot/plugin-alconna",
        "Repository": "https://github.com/nonebot/plugin-alconna"
    },
    "split_keywords": [
        "command",
        " alconna",
        " nonebot"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ffb6bc2cfa28d612beb780056f98c2a5f34e2100aa1c6d628b43b025c7ba02e9",
                "md5": "8d641cff6b20a03f1553679fcaa78e47",
                "sha256": "1e6ff5e99464ea2acad03df8b9fc48949b7d40a7c8d1976c53a934eafb8d3bf0"
            },
            "downloads": -1,
            "filename": "nonebot_plugin_alconna-0.45.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8d641cff6b20a03f1553679fcaa78e47",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 154707,
            "upload_time": "2024-05-02T06:43:55",
            "upload_time_iso_8601": "2024-05-02T06:43:55.824667Z",
            "url": "https://files.pythonhosted.org/packages/ff/b6/bc2cfa28d612beb780056f98c2a5f34e2100aa1c6d628b43b025c7ba02e9/nonebot_plugin_alconna-0.45.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "914cc8dd34e793b4a8ef5c378ae11e3c999df22bec8266a47d219d469bb4191f",
                "md5": "f2dbf276f87bb31a8c792aee431c6142",
                "sha256": "7667df82fdae02842b0fa28b39d61daf501f1af41d6fecf288fb8bb38a35ff9d"
            },
            "downloads": -1,
            "filename": "nonebot_plugin_alconna-0.45.3.tar.gz",
            "has_sig": false,
            "md5_digest": "f2dbf276f87bb31a8c792aee431c6142",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 106784,
            "upload_time": "2024-05-02T06:43:58",
            "upload_time_iso_8601": "2024-05-02T06:43:58.806974Z",
            "url": "https://files.pythonhosted.org/packages/91/4c/c8dd34e793b4a8ef5c378ae11e3c999df22bec8266a47d219d469bb4191f/nonebot_plugin_alconna-0.45.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-02 06:43:58",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "nonebot",
    "github_project": "plugin-alconna",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "nonebot-plugin-alconna"
}
        
Elapsed time: 0.25331s