refactor: deprecate register_star decorator

This commit is contained in:
Raven95676
2025-07-04 15:39:31 +08:00
parent 98d3ab646f
commit edbb856023
16 changed files with 69 additions and 70 deletions
+9 -1
View File
@@ -1,4 +1,4 @@
from .star import StarMetadata
from .star import StarMetadata, star_map
from .star_manager import PluginManager
from .context import Context
from astrbot.core.provider import Provider
@@ -14,6 +14,14 @@ class Star(CommandParserMixin):
StarTools.initialize(context)
self.context = context
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
metadata = StarMetadata(
star_cls_type=cls,
module_path=cls.__module__,
)
star_map[cls.__module__] = metadata
@staticmethod
async def text_to_image(text: str, return_url=True) -> str:
"""将文本转换为图片"""
+7 -12
View File
@@ -1,4 +1,4 @@
from ..star import star_registry, StarMetadata, star_map
import warnings
def register_star(name: str, author: str, desc: str, version: str, repo: str = None):
@@ -21,18 +21,13 @@ def register_star(name: str, author: str, desc: str, version: str, repo: str = N
帮助信息会被自动提取。使用 `/plugin <插件名> 可以查看帮助信息。`
"""
warnings.warn(
"The 'register_star' decorator is deprecated and will be removed in a future version.",
DeprecationWarning,
stacklevel=2,
)
def decorator(cls):
star_metadata = StarMetadata(
name=name,
author=author,
desc=desc,
version=version,
repo=repo,
star_cls_type=cls,
module_path=cls.__module__,
)
star_registry.append(star_metadata)
star_map[cls.__module__] = star_metadata
return cls
return decorator
+22 -17
View File
@@ -1,12 +1,12 @@
from __future__ import annotations
from types import ModuleType
from typing import List, Dict
from dataclasses import dataclass, field
from types import ModuleType
from astrbot.core.config import AstrBotConfig
star_registry: List[StarMetadata] = []
star_map: Dict[str, StarMetadata] = {}
star_registry: list[StarMetadata] = []
star_map: dict[str, StarMetadata] = {}
"""key 是模块路径,__module__"""
@@ -18,22 +18,27 @@ class StarMetadata:
当 activated 为 False 时,star_cls 可能为 None,请不要在插件未激活时调用 star_cls 的方法。
"""
name: str
author: str # 插件作者
desc: str # 插件简介
version: str # 插件版本
repo: str = None # 插件仓库地址
name: str | None = None
"""插件名"""
author: str | None = None
"""插件作者"""
desc: str | None = None
"""插件简介"""
version: str | None = None
"""插件版本"""
repo: str | None = None
"""插件仓库地址"""
star_cls_type: type = None
star_cls_type: type | None = None
"""插件的类对象的类型"""
module_path: str = None
module_path: str | None = None
"""插件的模块路径"""
star_cls: object = None
star_cls: object | None = None
"""插件的类对象"""
module: ModuleType = None
module: ModuleType | None = None
"""插件的模块对象"""
root_dir_name: str = None
root_dir_name: str | None = None
"""插件的目录名称"""
reserved: bool = False
"""是否是 AstrBot 的保留插件"""
@@ -41,13 +46,13 @@ class StarMetadata:
activated: bool = True
"""是否被激活"""
config: AstrBotConfig = None
config: AstrBotConfig | None = None
"""插件配置"""
star_handler_full_names: List[str] = field(default_factory=list)
star_handler_full_names: list[str] = field(default_factory=list)
"""注册的 Handler 的全名列表"""
supported_platforms: Dict[str, bool] = field(default_factory=dict)
supported_platforms: dict[str, bool] = field(default_factory=dict)
"""插件支持的平台ID字典,key为平台ID,value为是否支持"""
def __str__(self) -> str:
+3 -3
View File
@@ -11,7 +11,6 @@ import os
import sys
import traceback
from types import ModuleType
from typing import List
import yaml
@@ -157,7 +156,7 @@ class PluginManager:
)
return modules
def _get_plugin_modules(self) -> List[dict]:
def _get_plugin_modules(self) -> list[dict]:
plugins = []
if os.path.exists(self.plugin_store_path):
plugins.extend(self._get_modules(self.plugin_store_path))
@@ -439,7 +438,7 @@ class PluginManager:
)
if path in star_map:
# 通过装饰器的方式注册插件
# 通过__init__subclass__注册插件
metadata = star_map[path]
try:
@@ -453,6 +452,7 @@ class PluginManager:
metadata.desc = metadata_yaml.desc
metadata.version = metadata_yaml.version
metadata.repo = metadata_yaml.repo
star_registry.append(metadata)
except Exception:
pass
metadata.config = plugin_config
-6
View File
@@ -55,12 +55,6 @@ class RstScene(Enum):
return cls.PRIVATE
@star.register(
name="astrbot",
desc="AstrBot 基础指令结合 + 拓展功能",
author="Soulter",
version="4.0.0",
)
class Main(star.Star):
def __init__(self, context: star.Context) -> None:
self.context = context
+4
View File
@@ -0,0 +1,4 @@
name: astrbot
desc: AstrBot 基础指令结合 + 拓展功能
author: Soulter
version: 4.0.0
-6
View File
@@ -94,12 +94,6 @@ DEFAULT_CONFIG = {
PATH = os.path.join(get_astrbot_data_path(), "config", "python_interpreter.json")
@star.register(
name="astrbot-python-interpreter",
desc="Python 代码执行器",
author="Soulter",
version="0.0.1",
)
class Main(star.Star):
"""基于 Docker 沙箱的 Python 代码执行器"""
@@ -0,0 +1,4 @@
name: astrbot-python-interpreter
desc: Python 代码执行器
author: Soulter
version: 0.0.1
-3
View File
@@ -11,9 +11,6 @@ from astrbot.api import llm_tool, logger
from astrbot.core.utils.astrbot_path import get_astrbot_data_path
@star.register(
name="astrbot-reminder", desc="使用 LLM 待办提醒", author="Soulter", version="0.0.1"
)
class Main(star.Star):
"""使用 LLM 待办提醒。只需对 LLM 说想要提醒的事情和时间即可。比如:`之后每天这个时候都提醒我做多邻国`"""
+4
View File
@@ -0,0 +1,4 @@
name: astrbot-reminder
desc: 使用 LLM 待办提醒
author: Soulter
version: 0.0.1
+1 -8
View File
@@ -2,7 +2,7 @@ import astrbot.api.message_components as Comp
import copy
from astrbot.api import logger
from astrbot.api.event import AstrMessageEvent, filter
from astrbot.api.star import Context, Star, register
from astrbot.api.star import Context, Star
from astrbot.core.utils.session_waiter import (
SessionWaiter,
USER_SESSIONS,
@@ -13,13 +13,6 @@ from astrbot.core.utils.session_waiter import (
from sys import maxsize
@register(
"session_controller",
"Cvandia & Soulter",
"为插件支持会话控制",
"v1.0.1",
"https://astrbot.app",
)
class Waiter(Star):
"""会话控制"""
@@ -0,0 +1,5 @@
name: session_controller
desc: 为插件支持会话控制
author: Cvandia & Soulter
version: v1.0.1
repo: https://astrbot.app
+1 -8
View File
@@ -1,17 +1,10 @@
import re
from astrbot.api.event import filter, AstrMessageEvent
from astrbot.api.star import Context, Star, register
from astrbot.api.star import Context, Star
from astrbot.api.provider import LLMResponse
from openai.types.chat.chat_completion import ChatCompletion
@register(
"thinking_filter",
"Soulter",
"可选择是否过滤推理模型的思考内容",
"1.0.0",
"https://astrbot.app",
)
class R1Filter(Star):
def __init__(self, context: Context):
super().__init__(context)
+5
View File
@@ -0,0 +1,5 @@
name: thinking_filter
desc: 可选择是否过滤推理模型的思考内容
author: Soulter
version: 1.0.0
repo: https://astrbot.app
-6
View File
@@ -12,12 +12,6 @@ from bs4 import BeautifulSoup
from .engines 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 开启或者关闭网页搜索功能"""
+4
View File
@@ -0,0 +1,4 @@
name: astrbot-web-searcher
desc: 让 LLM 具有网页检索能力
author: Soulter
version: 1.14.514