From ab677ea100981f65a8d102ea3b59f133fef28193 Mon Sep 17 00:00:00 2001 From: chenpeng <115522593@qq.com> Date: Wed, 2 Jul 2025 17:30:37 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BF=AE=E6=AD=A3pilk=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E6=96=87=E6=A1=88=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=9B=91=E5=90=ACwechatpadpro=E6=B6=88=E6=81=AF=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E7=9A=84=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/star/filter/platform_adapter_type.py | 4 +++- astrbot/core/utils/tencent_record_helper.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/astrbot/core/star/filter/platform_adapter_type.py b/astrbot/core/star/filter/platform_adapter_type.py index 0926cc337..4252aa1af 100644 --- a/astrbot/core/star/filter/platform_adapter_type.py +++ b/astrbot/core/star/filter/platform_adapter_type.py @@ -13,7 +13,8 @@ class PlatformAdapterType(enum.Flag): TELEGRAM = enum.auto() WECOM = enum.auto() LARK = enum.auto() - ALL = AIOCQHTTP | QQOFFICIAL | VCHAT | GEWECHAT | TELEGRAM | WECOM | LARK + WECHATPADPRO = enum.auto() + ALL = AIOCQHTTP | QQOFFICIAL | VCHAT | GEWECHAT | TELEGRAM | WECOM | LARK | WECHATPADPRO ADAPTER_NAME_2_TYPE = { @@ -24,6 +25,7 @@ ADAPTER_NAME_2_TYPE = { "telegram": PlatformAdapterType.TELEGRAM, "wecom": PlatformAdapterType.WECOM, "lark": PlatformAdapterType.LARK, + "wechatpadpro": PlatformAdapterType.WECHATPADPRO, } diff --git a/astrbot/core/utils/tencent_record_helper.py b/astrbot/core/utils/tencent_record_helper.py index 9d0552c1e..2c97a01ed 100644 --- a/astrbot/core/utils/tencent_record_helper.py +++ b/astrbot/core/utils/tencent_record_helper.py @@ -117,7 +117,7 @@ async def audio_to_tencent_silk_base64(audio_path: str) -> tuple[str, float]: try: import pilk except ImportError as e: - raise Exception("未安装 pysilk,请执行: pip install pysilk") from e + raise Exception("未安装 pilk: pip install pilk") from e temp_dir = os.path.join(get_astrbot_data_path(), "temp") os.makedirs(temp_dir, exist_ok=True) From 98d3ab646f6034298ec009781d7c97076651053b Mon Sep 17 00:00:00 2001 From: Raven95676 Date: Fri, 4 Jul 2025 14:55:53 +0800 Subject: [PATCH 2/8] chore: convert some methods to static --- astrbot/core/star/__init__.py | 6 ++++-- astrbot/core/star/star_manager.py | 15 ++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/astrbot/core/star/__init__.py b/astrbot/core/star/__init__.py index f871c67c8..d9f980e82 100644 --- a/astrbot/core/star/__init__.py +++ b/astrbot/core/star/__init__.py @@ -14,12 +14,14 @@ class Star(CommandParserMixin): StarTools.initialize(context) self.context = context - async def text_to_image(self, text: str, return_url=True) -> str: + @staticmethod + async def text_to_image(text: str, return_url=True) -> str: """将文本转换为图片""" return await html_renderer.render_t2i(text, return_url=return_url) + @staticmethod async def html_render( - self, tmpl: str, data: dict, return_url=True, options: dict = None + tmpl: str, data: dict, return_url=True, options: dict = None ) -> str: """渲染 HTML""" return await html_renderer.render_custom_template( diff --git a/astrbot/core/star/star_manager.py b/astrbot/core/star/star_manager.py index 3dd4cd1cf..2b0ed791a 100644 --- a/astrbot/core/star/star_manager.py +++ b/astrbot/core/star/star_manager.py @@ -119,7 +119,8 @@ class PluginManager: reloaded_plugins.add(plugin_name) break - def _get_classes(self, arg: ModuleType): + @staticmethod + def _get_classes(arg: ModuleType): """获取指定模块(可以理解为一个 python 文件)下所有的类""" classes = [] clsmembers = inspect.getmembers(arg, inspect.isclass) @@ -129,7 +130,8 @@ class PluginManager: break return classes - def _get_modules(self, path): + @staticmethod + def _get_modules(path): modules = [] dirs = os.listdir(path) @@ -189,7 +191,8 @@ class PluginManager: except Exception as e: logger.error(f"更新插件 {p} 的依赖失败。Code: {str(e)}") - def _load_plugin_metadata(self, plugin_path: str, plugin_obj=None) -> StarMetadata: + @staticmethod + def _load_plugin_metadata(plugin_path: str, plugin_obj=None) -> StarMetadata: """v3.4.0 以前的方式载入插件元数据 先寻找 metadata.yaml 文件,如果不存在,则使用插件对象的 info() 函数获取元数据。 @@ -228,8 +231,9 @@ class PluginManager: return metadata + @staticmethod def _get_plugin_related_modules( - self, plugin_root_dir: str, is_reserved: bool = False + plugin_root_dir: str, is_reserved: bool = False ) -> list[str]: """获取与指定插件相关的所有已加载模块名 @@ -775,7 +779,8 @@ class PluginManager: plugin.activated = False - async def _terminate_plugin(self, star_metadata: StarMetadata): + @staticmethod + async def _terminate_plugin(star_metadata: StarMetadata): """终止插件,调用插件的 terminate() 和 __del__() 方法""" logger.info(f"正在终止插件 {star_metadata.name} ...") From edbb8560230d3d0166567f86b71048b938097312 Mon Sep 17 00:00:00 2001 From: Raven95676 Date: Fri, 4 Jul 2025 15:39:31 +0800 Subject: [PATCH 3/8] refactor: deprecate register_star decorator --- astrbot/core/star/__init__.py | 10 +++++- astrbot/core/star/register/star.py | 19 ++++------- astrbot/core/star/star.py | 39 +++++++++++++---------- astrbot/core/star/star_manager.py | 6 ++-- packages/astrbot/main.py | 6 ---- packages/astrbot/metadata.yaml | 4 +++ packages/python_interpreter/main.py | 6 ---- packages/python_interpreter/metadata.yaml | 4 +++ packages/reminder/main.py | 3 -- packages/reminder/metadata.yaml | 4 +++ packages/session_controller/main.py | 9 +----- packages/session_controller/metadata.yaml | 5 +++ packages/thinking_filter/main.py | 9 +----- packages/thinking_filter/metadata.yaml | 5 +++ packages/web_searcher/main.py | 6 ---- packages/web_searcher/metadata.yaml | 4 +++ 16 files changed, 69 insertions(+), 70 deletions(-) create mode 100644 packages/astrbot/metadata.yaml create mode 100644 packages/python_interpreter/metadata.yaml create mode 100644 packages/reminder/metadata.yaml create mode 100644 packages/session_controller/metadata.yaml create mode 100644 packages/thinking_filter/metadata.yaml create mode 100644 packages/web_searcher/metadata.yaml diff --git a/astrbot/core/star/__init__.py b/astrbot/core/star/__init__.py index d9f980e82..3337e4c25 100644 --- a/astrbot/core/star/__init__.py +++ b/astrbot/core/star/__init__.py @@ -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: """将文本转换为图片""" diff --git a/astrbot/core/star/register/star.py b/astrbot/core/star/register/star.py index 01ff9adaa..b1ef8550a 100644 --- a/astrbot/core/star/register/star.py +++ b/astrbot/core/star/register/star.py @@ -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 diff --git a/astrbot/core/star/star.py b/astrbot/core/star/star.py index 10cf90c8b..bc8f3d404 100644 --- a/astrbot/core/star/star.py +++ b/astrbot/core/star/star.py @@ -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: diff --git a/astrbot/core/star/star_manager.py b/astrbot/core/star/star_manager.py index 2b0ed791a..12f91c6d8 100644 --- a/astrbot/core/star/star_manager.py +++ b/astrbot/core/star/star_manager.py @@ -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 diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 0a3f8ba6c..1ec7dc032 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -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 diff --git a/packages/astrbot/metadata.yaml b/packages/astrbot/metadata.yaml new file mode 100644 index 000000000..81b1e5c7f --- /dev/null +++ b/packages/astrbot/metadata.yaml @@ -0,0 +1,4 @@ +name: astrbot +desc: AstrBot 基础指令结合 + 拓展功能 +author: Soulter +version: 4.0.0 \ No newline at end of file diff --git a/packages/python_interpreter/main.py b/packages/python_interpreter/main.py index 84d431b36..411f26aaf 100644 --- a/packages/python_interpreter/main.py +++ b/packages/python_interpreter/main.py @@ -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 代码执行器""" diff --git a/packages/python_interpreter/metadata.yaml b/packages/python_interpreter/metadata.yaml new file mode 100644 index 000000000..4378f0ada --- /dev/null +++ b/packages/python_interpreter/metadata.yaml @@ -0,0 +1,4 @@ +name: astrbot-python-interpreter +desc: Python 代码执行器 +author: Soulter +version: 0.0.1 \ No newline at end of file diff --git a/packages/reminder/main.py b/packages/reminder/main.py index b15add544..a600c20cf 100644 --- a/packages/reminder/main.py +++ b/packages/reminder/main.py @@ -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 说想要提醒的事情和时间即可。比如:`之后每天这个时候都提醒我做多邻国`""" diff --git a/packages/reminder/metadata.yaml b/packages/reminder/metadata.yaml new file mode 100644 index 000000000..fed835682 --- /dev/null +++ b/packages/reminder/metadata.yaml @@ -0,0 +1,4 @@ +name: astrbot-reminder +desc: 使用 LLM 待办提醒 +author: Soulter +version: 0.0.1 \ No newline at end of file diff --git a/packages/session_controller/main.py b/packages/session_controller/main.py index a34635228..131197643 100644 --- a/packages/session_controller/main.py +++ b/packages/session_controller/main.py @@ -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): """会话控制""" diff --git a/packages/session_controller/metadata.yaml b/packages/session_controller/metadata.yaml new file mode 100644 index 000000000..acb3192d6 --- /dev/null +++ b/packages/session_controller/metadata.yaml @@ -0,0 +1,5 @@ +name: session_controller +desc: 为插件支持会话控制 +author: Cvandia & Soulter +version: v1.0.1 +repo: https://astrbot.app \ No newline at end of file diff --git a/packages/thinking_filter/main.py b/packages/thinking_filter/main.py index 26c2db9b9..612ab57e9 100644 --- a/packages/thinking_filter/main.py +++ b/packages/thinking_filter/main.py @@ -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) diff --git a/packages/thinking_filter/metadata.yaml b/packages/thinking_filter/metadata.yaml new file mode 100644 index 000000000..8afbff1e0 --- /dev/null +++ b/packages/thinking_filter/metadata.yaml @@ -0,0 +1,5 @@ +name: thinking_filter +desc: 可选择是否过滤推理模型的思考内容 +author: Soulter +version: 1.0.0 +repo: https://astrbot.app \ No newline at end of file diff --git a/packages/web_searcher/main.py b/packages/web_searcher/main.py index fa65ce1e5..3556fce92 100644 --- a/packages/web_searcher/main.py +++ b/packages/web_searcher/main.py @@ -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 开启或者关闭网页搜索功能""" diff --git a/packages/web_searcher/metadata.yaml b/packages/web_searcher/metadata.yaml new file mode 100644 index 000000000..fc5309787 --- /dev/null +++ b/packages/web_searcher/metadata.yaml @@ -0,0 +1,4 @@ +name: astrbot-web-searcher +desc: 让 LLM 具有网页检索能力 +author: Soulter +version: 1.14.514 \ No newline at end of file From e1bed60f1f18585c7000643e8d8c2e56e0e78633 Mon Sep 17 00:00:00 2001 From: Raven95676 Date: Fri, 4 Jul 2025 16:13:10 +0800 Subject: [PATCH 4/8] fix: adjust timing of adding to star_registry --- astrbot/core/star/star_manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/astrbot/core/star/star_manager.py b/astrbot/core/star/star_manager.py index 12f91c6d8..b8365ed61 100644 --- a/astrbot/core/star/star_manager.py +++ b/astrbot/core/star/star_manager.py @@ -452,7 +452,6 @@ 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 @@ -508,6 +507,8 @@ class PluginManager: if func_tool.name in inactivated_llm_tools: func_tool.active = False + star_registry.append(metadata) + else: # v3.4.0 以前的方式注册插件 logger.debug( From 9f31df7f3a9dac47a7e6a5b567cde4e1065c5fab Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sat, 5 Jul 2025 13:52:28 +0200 Subject: [PATCH 5/8] pytest recommendation: `pip install --editable .` https://docs.pytest.org/en/stable/how-to/existingtestsuite.html This makes setting `PYTHONPATH` unnecessary and will pull requirements from `pyproject.toml` instead of `requirements.txt`, so it is similar to end-user installations. `makedir -p data/plugins` will do both `mkdir data` and `mkdir data/plugins`. The `$CI` environment variable might be better to use than `$TESTING` because it is preset to `true` in GitHub Actions. * https://docs.github.com/en/actions/reference/variables-reference#default-environment-variables * https://docs.pytest.org/en/stable/explanation/ci.html --- .github/workflows/coverage_test.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/coverage_test.yml b/.github/workflows/coverage_test.yml index a62efa5d2..3f219121c 100644 --- a/.github/workflows/coverage_test.yml +++ b/.github/workflows/coverage_test.yml @@ -26,20 +26,19 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt - pip install pytest pytest-cov pytest-asyncio + pip install pytest pytest-asyncio pytest-cov + pip install --editable . - name: Run tests run: | - mkdir data - mkdir data/plugins - mkdir data/config - mkdir data/temp + mkdir -p data/plugins + mkdir -p data/config + mkdir -p data/temp export TESTING=true export ZHIPU_API_KEY=${{ secrets.OPENAI_API_KEY }} - PYTHONPATH=./ pytest --cov=. tests/ -v -o log_cli=true -o log_level=DEBUG + pytest --cov=. tests/ -v -o log_cli=true -o log_level=DEBUG - name: Upload results to Codecov uses: codecov/codecov-action@v5 with: - token: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + token: ${{ secrets.CODECOV_TOKEN }} From d2f7e55bf5bd34c20ab6d06dc76d922b0d37e6ea Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sat, 5 Jul 2025 13:57:58 +0200 Subject: [PATCH 6/8] Run the tests on pull requests --- .github/workflows/coverage_test.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage_test.yml b/.github/workflows/coverage_test.yml index 3f219121c..e9c94d679 100644 --- a/.github/workflows/coverage_test.yml +++ b/.github/workflows/coverage_test.yml @@ -1,6 +1,6 @@ name: Run tests and upload coverage -on: +on: push: branches: - master @@ -8,6 +8,7 @@ on: - 'README.md' - 'changelogs/**' - 'dashboard/**' + pull_request: workflow_dispatch: jobs: @@ -36,7 +37,7 @@ jobs: mkdir -p data/temp export TESTING=true export ZHIPU_API_KEY=${{ secrets.OPENAI_API_KEY }} - pytest --cov=. tests/ -v -o log_cli=true -o log_level=DEBUG + pytest --cov=. -v -o log_cli=true -o log_level=DEBUG - name: Upload results to Codecov uses: codecov/codecov-action@v5 From 575289e5bc2cfbe375b20f25a617d41e510382ec Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Tue, 8 Jul 2025 11:39:42 +0800 Subject: [PATCH 7/8] feat: complete platform adapter types and update mapping --- .../core/star/filter/platform_adapter_type.py | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/astrbot/core/star/filter/platform_adapter_type.py b/astrbot/core/star/filter/platform_adapter_type.py index 4252aa1af..fffaf8553 100644 --- a/astrbot/core/star/filter/platform_adapter_type.py +++ b/astrbot/core/star/filter/platform_adapter_type.py @@ -8,24 +8,48 @@ from typing import Union class PlatformAdapterType(enum.Flag): AIOCQHTTP = enum.auto() QQOFFICIAL = enum.auto() - VCHAT = enum.auto() GEWECHAT = enum.auto() TELEGRAM = enum.auto() WECOM = enum.auto() LARK = enum.auto() WECHATPADPRO = enum.auto() - ALL = AIOCQHTTP | QQOFFICIAL | VCHAT | GEWECHAT | TELEGRAM | WECOM | LARK | WECHATPADPRO + DINGTALK = enum.auto() + DISCORD = enum.auto() + SLACK = enum.auto() + KOOK = enum.auto() + VOCECHAT = enum.auto() + WEIXIN_OFFICIAL_ACCOUNT = enum.auto() + ALL = ( + AIOCQHTTP + | QQOFFICIAL + | GEWECHAT + | TELEGRAM + | WECOM + | LARK + | WECHATPADPRO + | DINGTALK + | DISCORD + | SLACK + | KOOK + | VOCECHAT + | WEIXIN_OFFICIAL_ACCOUNT + ) ADAPTER_NAME_2_TYPE = { "aiocqhttp": PlatformAdapterType.AIOCQHTTP, "qq_official": PlatformAdapterType.QQOFFICIAL, - "vchat": PlatformAdapterType.VCHAT, "gewechat": PlatformAdapterType.GEWECHAT, "telegram": PlatformAdapterType.TELEGRAM, "wecom": PlatformAdapterType.WECOM, "lark": PlatformAdapterType.LARK, + "dingtalk": PlatformAdapterType.DINGTALK, + "discord": PlatformAdapterType.DISCORD, + "slack": PlatformAdapterType.SLACK, + "kook": PlatformAdapterType.KOOK, "wechatpadpro": PlatformAdapterType.WECHATPADPRO, + "vocechat": PlatformAdapterType.VOCECHAT, + "weixin_official_account": PlatformAdapterType.WEIXIN_OFFICIAL_ACCOUNT, } From 4c3760444530081633d9ee87ab9000f3f9f44fad Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Tue, 8 Jul 2025 11:50:55 +0800 Subject: [PATCH 8/8] perf: only output deprecation warning once for @register_star decorator --- astrbot/core/star/register/star.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/astrbot/core/star/register/star.py b/astrbot/core/star/register/star.py index b1ef8550a..7e5f89fd2 100644 --- a/astrbot/core/star/register/star.py +++ b/astrbot/core/star/register/star.py @@ -1,9 +1,15 @@ import warnings +_warned_register_star = False + def register_star(name: str, author: str, desc: str, version: str, repo: str = None): """注册一个插件(Star)。 + [DEPRECATED] 该装饰器已废弃,将在未来版本中移除。 + 在 v3.5.19 版本之后(不含),您不需要使用该装饰器来装饰插件类, + AstrBot 会自动识别继承自 Star 的类并将其作为插件类加载。 + Args: name: 插件名称。 author: 作者。 @@ -21,11 +27,14 @@ 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, - ) + global _warned_register_star + if not _warned_register_star: + _warned_register_star = True + warnings.warn( + "The 'register_star' decorator is deprecated and will be removed in a future version.", + DeprecationWarning, + stacklevel=2, + ) def decorator(cls): return cls