| from __future__ import annotations |
|
|
| import logging |
| from typing import Any, Protocol |
|
|
| from astrbot.core import html_renderer |
| from astrbot.core.utils.command_parser import CommandParserMixin |
| from astrbot.core.utils.plugin_kv_store import PluginKVStoreMixin |
|
|
| from .star import StarMetadata, star_map, star_registry |
|
|
| logger = logging.getLogger("astrbot") |
|
|
|
|
| class Star(CommandParserMixin, PluginKVStoreMixin): |
| """所有插件(Star)的父类,所有插件都应该继承于这个类""" |
|
|
| author: str |
| name: str |
|
|
| class _ContextLike(Protocol): |
| def get_config(self, umo: str | None = None) -> Any: ... |
|
|
| def __init__(self, context: _ContextLike, config: dict | None = None) -> None: |
| self.context = context |
|
|
| def _get_context_config(self) -> Any: |
| get_config = getattr(self.context, "get_config", None) |
| if callable(get_config): |
| try: |
| return get_config() |
| except Exception as e: |
| logger.debug(f"get_config() failed: {e}") |
| return None |
| return getattr(self.context, "_config", None) |
|
|
| def __init_subclass__(cls, **kwargs): |
| super().__init_subclass__(**kwargs) |
| if not star_map.get(cls.__module__): |
| metadata = StarMetadata( |
| star_cls_type=cls, |
| module_path=cls.__module__, |
| ) |
| star_map[cls.__module__] = metadata |
| star_registry.append(metadata) |
| else: |
| star_map[cls.__module__].star_cls_type = cls |
| star_map[cls.__module__].module_path = cls.__module__ |
|
|
| async def text_to_image(self, text: str, return_url=True) -> str: |
| """将文本转换为图片""" |
| config_obj = self._get_context_config() |
| template_name = None |
| if hasattr(config_obj, "get"): |
| try: |
| template_name = config_obj.get("t2i_active_template") |
| except Exception: |
| template_name = None |
| return await html_renderer.render_t2i( |
| text, |
| return_url=return_url, |
| template_name=template_name, |
| ) |
|
|
| async def html_render( |
| self, |
| tmpl: str, |
| data: dict, |
| return_url=True, |
| options: dict | None = None, |
| ) -> str: |
| """渲染 HTML""" |
| return await html_renderer.render_custom_template( |
| tmpl, |
| data, |
| return_url=return_url, |
| options=options, |
| ) |
|
|
| async def initialize(self) -> None: |
| """当插件被激活时会调用这个方法""" |
|
|
| async def terminate(self) -> None: |
| """当插件被禁用、重载插件时会调用这个方法""" |
|
|
| def __del__(self) -> None: |
| """[Deprecated] 当插件被禁用、重载插件时会调用这个方法""" |
|
|