78 lines
2.0 KiB
Python

from nonebot import require
from nonebot.adapters import Bot, Event
from nonebot.matcher import Matcher
from nonebot.typing import T_State
from nonebot_plugin_marshoai.plugin.func_call.models import SessionContext
require("nonebot_plugin_alconna")
from nonebot.permission import SUPERUSER
from nonebot_plugin_alconna import (
Alconna,
Args,
MultiVar,
Subcommand,
UniMessage,
on_alconna,
)
from .plugin.func_call.caller import get_function_calls
function_call = on_alconna(
command=Alconna(
"marsho-function-call",
Subcommand(
"call",
Args["function_name", str]["kwargs", MultiVar(str), []],
alias={"c"},
),
Subcommand(
"list",
alias={"l"},
),
Subcommand("info", Args["function_name", str], alias={"i"}),
),
aliases={"mfc"},
permission=SUPERUSER,
)
@function_call.assign("list")
async def list_functions():
reply = "共有如下可调用函数:\n"
for function in get_function_calls().values():
reply += f"- {function.name}({function.description}))\n"
await UniMessage(reply).send()
@function_call.assign("info")
async def function_info(function_name: str):
function = get_function_calls().get(function_name)
if function is None:
await UniMessage(f"未找到函数 {function_name}").send()
return
await UniMessage(str(function)).send()
@function_call.assign("call")
async def call_function(
function_name: str,
kwargs: list[str],
event: Event,
bot: Bot,
matcher: Matcher,
state: T_State,
):
function = get_function_calls().get(function_name)
if function is None:
await UniMessage(f"未找到函数 {function_name}").send()
return
await UniMessage(
str(
await function.with_ctx(
SessionContext(event=event, bot=bot, matcher=matcher, state=state)
).call(**{i.split("=", 1)[0]: i.split("=", 1)[1] for i in kwargs})
)
).send()