feat: 插件帮助

This commit is contained in:
Soulter
2024-12-11 16:09:16 +08:00
parent 97e14dd294
commit c3357dc0e2
7 changed files with 49 additions and 19 deletions
+4 -2
View File
@@ -4,7 +4,7 @@ from .astrbot_message import AstrBotMessage
from .platform_metadata import PlatformMetadata
from astrbot.core.message.message_event_result import MessageEventResult, MessageChain
from astrbot.core.platform.message_type import MessageType
from typing import List
from typing import List, Union
from astrbot.core.message.components import Plain, Image, BaseMessageComponent, Face, At, AtAll, Forward
from astrbot.core.utils.metrics import Metric
@@ -124,7 +124,7 @@ class AstrMessageEvent(abc.ABC):
'''
return self.message_obj.sender.nickname
def set_result(self, result: MessageEventResult):
def set_result(self, result: Union[MessageEventResult, str]):
'''设置消息事件的结果。
Note:
@@ -145,6 +145,8 @@ class AstrMessageEvent(abc.ABC):
return
```
'''
if isinstance(result, str):
result = MessageEventResult().message(result)
self._result = result
def stop_event(self):
+5 -3
View File
@@ -9,7 +9,7 @@ from astrbot.core.platform.astr_message_event import MessageSesion
from astrbot.core.message.message_event_result import MessageChain
from astrbot.core.provider.manager import ProviderManager
from astrbot.core.platform.manager import PlatformManager
from .star import star_registry, star_map, StarMetadata
from .star import star_registry, StarMetadata
from .star_handler import star_handlers_registry, star_handlers_map, StarHandlerMetadata
from .filter.command import CommandFilter
from .filter.regex import RegexFilter
@@ -42,8 +42,10 @@ class Context:
self._db = db
def get_registered_star(self, star_name: str) -> StarMetadata:
return star_map.get(star_name, None)
for star in star_registry:
if star.name == star_name:
return star
def get_all_stars(self) -> List[StarMetadata]:
return star_registry
-1
View File
@@ -17,7 +17,6 @@ class CommandFilter(HandlerFilter, ParameterValidationMixin):
def print_types(self):
result = ""
print(self.handler_params)
for k, v in self.handler_params.items():
if isinstance(v, type):
result += f"{k}({v.__name__}),"
+19 -1
View File
@@ -1,6 +1,24 @@
from ..star import star_registry, StarMetadata, star_map
def register_star(name: str, author: str, desc: str, version: str, repo: str = None):
'''注册一个插件(Star)。
Args:
name: 插件名称。
author: 作者。
desc: 插件的简述。
version: 版本号。
repo: 仓库地址。如果没有填写仓库地址,将无法更新这个插件。
如果需要为插件填写帮助信息,请使用如下格式:
```python
class MyPlugin(star.Star):
\'\'\'这是帮助信息\'\'\'
...
帮助信息会被自动提取。使用 `/plugin <插件名> 可以查看帮助信息。`
'''
def decorator(cls):
star_metadata = StarMetadata(
name=name,
@@ -9,7 +27,7 @@ def register_star(name: str, author: str, desc: str, version: str, repo: str = N
version=version,
repo=repo,
star_cls_type=cls,
module_path=cls.__module__
module_path=cls.__module__,
)
star_registry.append(star_metadata)
star_map[cls.__module__] = star_metadata
+1 -3
View File
@@ -6,7 +6,6 @@ class ParameterValidationMixin:
'''将参数列表 params 根据 param_type 转换为参数字典。
'''
result = {}
print(params, param_type)
for i, (param_name, param_type_or_default_val) in enumerate(param_type.items()):
if i >= len(params):
if isinstance(param_type_or_default_val, Type) or param_type_or_default_val is inspect.Parameter.empty:
@@ -18,7 +17,7 @@ class ParameterValidationMixin:
else:
# 尝试强制转换
try:
if param_type_or_default_val == None:
if param_type_or_default_val is None:
if params[i].isdigit():
result[param_name] = int(params[i])
else:
@@ -27,5 +26,4 @@ class ParameterValidationMixin:
result[param_name] = param_type_or_default_val(params[i])
except ValueError:
raise ValueError(f"参数 {param_name} 类型错误")
print(result)
return result
+19 -9
View File
@@ -30,7 +30,7 @@ class Main(star.Star):
msg = "已注册的 AstrBot 内置指令:\n"
msg += f"""[System]
/plugin: 插件管理
/plugin: 查看注册的插件、插件帮助
/t2i: 开启/关闭文本转图片模式
/sid: 获取当前会话的 ID
/op <admin_id>: 授权管理员
@@ -82,14 +82,24 @@ class Main(star.Star):
event.set_result(MessageEventResult().message(f"停用工具 {tool_name} 失败,未找到此工具。"))
@filter.command("plugin")
async def plugin(self, event: AstrMessageEvent):
plugin_list_info = "已加载的插件:\n"
for plugin in self.context.get_all_stars():
plugin_list_info += f"- `{plugin.name}` By {plugin.author}: {plugin.desc}\n"
if plugin_list_info.strip() == "":
plugin_list_info = "没有加载任何插件。"
event.set_result(MessageEventResult().message(f"{plugin_list_info}"))
async def plugin(self, event: AstrMessageEvent, oper: str = None):
if oper is None:
plugin_list_info = "已加载的插件:\n"
for plugin in self.context.get_all_stars():
plugin_list_info += f"- `{plugin.name}` By {plugin.author}: {plugin.desc}\n"
if plugin_list_info.strip() == "":
plugin_list_info = "没有加载任何插件。"
plugin_list_info += "\n使用 /plugin <插件名> 查看插件帮助。"
event.set_result(MessageEventResult().message(f"{plugin_list_info}").use_t2i(False))
else:
plugin = self.context.get_registered_star(oper)
if plugin is None:
event.set_result(MessageEventResult().message("未找到此插件。"))
else:
help_msg = plugin.star_cls.__doc__ if plugin.star_cls.__doc__ else "该插件未提供帮助信息"
ret = f"插件 {oper} 帮助信息:\n" + help_msg
event.set_result(MessageEventResult().message(ret).use_t2i(False))
@filter.command("t2i")
async def t2i(self, event: AstrMessageEvent):
+1
View File
@@ -14,6 +14,7 @@ from .engines.config import HEADERS, USER_AGENTS
@star.register(name="astrbot-web-searcher", desc="让 LLM 具有网页检索能力", author="Soulter", version="1.14.514")
class Main(star.Star):
'''使用 /websearch on 或者 off 开启或者关闭网页搜索功能'''
def __init__(self, context: star.Context) -> None:
self.context = context