Files
AstrBot/src-new/astrbot_sdk/decorators.py
whatevertogo 9c5ecf0a13 feat: Enhance plugin capability support and legacy compatibility
- Introduced LoadedCapability class to manage plugin capabilities.
- Updated load_plugin function to discover and load capabilities alongside handlers.
- Enhanced Peer class to handle remote provided capabilities during initialization.
- Added tests for capability registration and invocation in legacy plugins.
- Improved MessageChain and message component handling in legacy plugins.
- Added comprehensive tests for legacy plugin integration and compatibility.
- Updated protocol messages to include provided capabilities in initialization.
- Enhanced top-level module imports to include capability-related functions.
2026-03-13 06:16:57 +08:00

146 lines
3.9 KiB
Python

"""v4 原生装饰器。
旧版 ``astrbot_sdk.api.event.filter`` 的兼容与降级边界由 compat 模块处理,
这里仅保留 v4 原生 trigger/permission 元数据建模。
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Callable
from .protocol.descriptors import (
CapabilityDescriptor,
CommandTrigger,
EventTrigger,
MessageTrigger,
Permissions,
ScheduleTrigger,
)
HandlerCallable = Callable[..., Any]
HANDLER_META_ATTR = "__astrbot_handler_meta__"
CAPABILITY_META_ATTR = "__astrbot_capability_meta__"
@dataclass(slots=True)
class HandlerMeta:
trigger: CommandTrigger | MessageTrigger | EventTrigger | ScheduleTrigger | None = (
None
)
kind: str = "handler"
contract: str | None = None
priority: int = 0
permissions: Permissions = field(default_factory=Permissions)
@dataclass(slots=True)
class CapabilityMeta:
descriptor: CapabilityDescriptor
def _get_or_create_meta(func: HandlerCallable) -> HandlerMeta:
meta = getattr(func, HANDLER_META_ATTR, None)
if meta is None:
meta = HandlerMeta()
setattr(func, HANDLER_META_ATTR, meta)
return meta
def get_handler_meta(func: HandlerCallable) -> HandlerMeta | None:
return getattr(func, HANDLER_META_ATTR, None)
def get_capability_meta(func: HandlerCallable) -> CapabilityMeta | None:
return getattr(func, CAPABILITY_META_ATTR, None)
def on_command(
command: str,
*,
aliases: list[str] | None = None,
description: str | None = None,
) -> Callable[[HandlerCallable], HandlerCallable]:
def decorator(func: HandlerCallable) -> HandlerCallable:
meta = _get_or_create_meta(func)
meta.trigger = CommandTrigger(
command=command,
aliases=aliases or [],
description=description,
)
return func
return decorator
def on_message(
*,
regex: str | None = None,
keywords: list[str] | None = None,
platforms: list[str] | None = None,
) -> Callable[[HandlerCallable], HandlerCallable]:
def decorator(func: HandlerCallable) -> HandlerCallable:
meta = _get_or_create_meta(func)
meta.trigger = MessageTrigger(
regex=regex,
keywords=keywords or [],
platforms=platforms or [],
)
return func
return decorator
def on_event(event_type: str) -> Callable[[HandlerCallable], HandlerCallable]:
def decorator(func: HandlerCallable) -> HandlerCallable:
meta = _get_or_create_meta(func)
meta.trigger = EventTrigger(event_type=event_type)
return func
return decorator
def on_schedule(
*,
cron: str | None = None,
interval_seconds: int | None = None,
) -> Callable[[HandlerCallable], HandlerCallable]:
def decorator(func: HandlerCallable) -> HandlerCallable:
meta = _get_or_create_meta(func)
meta.trigger = ScheduleTrigger(cron=cron, interval_seconds=interval_seconds)
return func
return decorator
def require_admin(func: HandlerCallable) -> HandlerCallable:
meta = _get_or_create_meta(func)
meta.permissions.require_admin = True
return func
def provide_capability(
name: str,
*,
description: str,
input_schema: dict[str, Any] | None = None,
output_schema: dict[str, Any] | None = None,
supports_stream: bool = False,
cancelable: bool = False,
) -> Callable[[HandlerCallable], HandlerCallable]:
"""声明插件对外暴露的 capability。"""
def decorator(func: HandlerCallable) -> HandlerCallable:
descriptor = CapabilityDescriptor(
name=name,
description=description,
input_schema=input_schema,
output_schema=output_schema,
supports_stream=supports_stream,
cancelable=cancelable,
)
setattr(func, CAPABILITY_META_ATTR, CapabilityMeta(descriptor=descriptor))
return func
return decorator