<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"
}