diff --git a/gsuid_core/message_models.py b/gsuid_core/message_models.py index 58ac10e..5ba8405 100644 --- a/gsuid_core/message_models.py +++ b/gsuid_core/message_models.py @@ -17,8 +17,11 @@ class Button(Struct): specify_role_ids: List[str] = [] # 仅限频道可用 specify_user_ids: List[str] = [] # 指定用户 unsupport_tips: str = '您的客户端暂不支持该功能, 请升级后适配...' + prefix: str = '' # 命令前缀, 使用时请直接继承该类重写该值, 避免重复定义 + _edited: bool = False # 是否编辑过 ButtonType = Union[ List[str], List[Button], List[List[str]], List[List[Button]] ] +ButtonList = Union[List[Button], List[List[Button]]] diff --git a/gsuid_core/segment.py b/gsuid_core/segment.py index ff14402..3928e72 100644 --- a/gsuid_core/segment.py +++ b/gsuid_core/segment.py @@ -5,18 +5,18 @@ from io import BytesIO from venv import logger from pathlib import Path from base64 import b64decode, b64encode -from typing import Dict, List, Tuple, Union, Literal, Optional +from typing import Dict, List, Tuple, Union, Literal, Optional, cast import msgspec from PIL import Image from gsuid_core.models import Message from gsuid_core.data_store import image_res -from gsuid_core.message_models import Button from gsuid_core.global_val import get_global_val from gsuid_core.utils.image.convert import text2pic from gsuid_core.utils.image.image_tools import sget from gsuid_core.load_template import markdown_templates +from gsuid_core.message_models import Button, ButtonList from gsuid_core.utils.plugins_config.gs_config import ( pic_gen_config, send_pic_config, @@ -63,6 +63,41 @@ if IS_UPLOAD: URL_MAP = {} +def process_buttons(buttons: ButtonList) -> ButtonList: + if not buttons: + return buttons + + # 类型安全的嵌套检查 + if _is_nested_list(buttons): + # 明确告知类型检查器这是 List[List[Button]] + nested_buttons = cast(List[List[Button]], buttons) + return [ + [_process_button(btn) for btn in sublist] + for sublist in nested_buttons + ] + else: + # 明确告知类型检查器这是 List[Button] + flat_buttons = cast(List[Button], buttons) + return [_process_button(btn) for btn in flat_buttons] + + +def _process_button(button: Button) -> Button: + if button.prefix and button._edited is False: + button.data = button.prefix + button.data + button._edited = True + return button + + +def _is_nested_list(obj: ButtonList) -> bool: + if not obj: + return False + + first = obj[0] + return isinstance(first, list) and ( + not first or isinstance(first[0], Button) + ) + + class MessageSegment: def __add__(self, other): return [self, other] @@ -107,6 +142,10 @@ class MessageSegment: def buttons( buttons: Optional[Union[List[Button], List[List[Button]]]] = None, ) -> Message: + print(msgspec.to_builtins(buttons)) + if buttons: + buttons = process_buttons(buttons) + print(msgspec.to_builtins(buttons)) return Message(type='buttons', data=msgspec.to_builtins(buttons)) @staticmethod diff --git a/gsuid_core/status/plugin_status.py b/gsuid_core/status/plugin_status.py index b02e8fe..269dfd0 100644 --- a/gsuid_core/status/plugin_status.py +++ b/gsuid_core/status/plugin_status.py @@ -12,5 +12,4 @@ def register_status( plugin_name: str, plugin_status: Dict[str, Callable[..., Awaitable[Union[str, int, float]]]], ): - global plugins_status plugins_status[plugin_name] = {'icon': ICON, 'status': plugin_status}