Merge pull request #1194 from Raven95676/tools

feat: StarTools添加数据目录获取接口
This commit is contained in:
Soulter
2025-04-09 16:53:22 +08:00
committed by GitHub

View File

@@ -1,9 +1,12 @@
import inspect
from typing import Union, Awaitable, List, Optional, ClassVar
from astrbot.core.message.components import BaseMessageComponent
from astrbot.core.message.message_event_result import MessageChain
from astrbot.api.platform import MessageMember, AstrBotMessage
from astrbot.core.platform.astr_message_event import MessageSesion
from astrbot.core.star.context import Context
from astrbot.core.star.star import star_map
from pathlib import Path
class StarTools:
@@ -142,3 +145,48 @@ class StarTools:
name (str): 工具名称
"""
cls._context.unregister_llm_tool(name)
@classmethod
def get_data_dir(cls, plugin_name: Optional[str]) -> Path:
"""
返回插件数据目录的绝对路径。
此方法会在 data/plugin_data 目录下为插件创建一个专属的数据目录。如果未提供插件名称,
会自动从调用栈中获取插件信息。
Args:
plugin_name: 可选的插件名称。如果为None将自动检测调用者的插件名称。
Returns:
Path (Path): 插件数据目录的绝对路径,位于 data/plugin_data/{plugin_name}
Raises:
RuntimeError: 当出现以下情况时抛出:
- 无法获取调用者模块信息
- 无法获取模块的元数据信息
- 创建目录失败权限不足或其他IO错误
"""
if not plugin_name:
frame = inspect.currentframe().f_back
module = inspect.getmodule(frame)
if not module:
raise RuntimeError("无法获取调用者模块信息")
metadata = star_map.get(module.__name__, None)
if not metadata:
raise RuntimeError(f"无法获取模块 {module.__name__} 的元数据信息")
plugin_name = metadata.name
data_dir = Path("data/plugin_data") / plugin_name
try:
data_dir.mkdir(parents=True, exist_ok=True)
except OSError as e:
if isinstance(e, PermissionError):
raise RuntimeError(f"无法创建目录 {data_dir}:权限不足") from e
raise RuntimeError(f"无法创建目录 {data_dir}{e!s}") from e
return data_dir.resolve()