64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
from dataclasses import asdict, dataclass
|
|
|
|
from quart import Quart
|
|
|
|
from astrbot.core.config.astrbot_config import AstrBotConfig
|
|
|
|
|
|
@dataclass
|
|
class RouteContext:
|
|
config: AstrBotConfig
|
|
app: Quart
|
|
|
|
|
|
class Route:
|
|
routes: list | dict
|
|
|
|
def __init__(self, context: RouteContext) -> None:
|
|
self.app = context.app
|
|
self.config = context.config
|
|
|
|
def register_routes(self) -> None:
|
|
def _add_rule(path, method, func) -> None:
|
|
# 统一添加 /api 前缀
|
|
full_path = f"/api{path}"
|
|
self.app.add_url_rule(full_path, view_func=func, methods=[method])
|
|
|
|
# 兼容字典和列表两种格式
|
|
routes_to_register = (
|
|
self.routes.items() if isinstance(self.routes, dict) else self.routes
|
|
)
|
|
|
|
for route, definition in routes_to_register:
|
|
# 兼容一个路由多个方法
|
|
if isinstance(definition, list):
|
|
for method, func in definition:
|
|
_add_rule(route, method, func)
|
|
else:
|
|
method, func = definition
|
|
_add_rule(route, method, func)
|
|
|
|
|
|
@dataclass
|
|
class Response:
|
|
status: str | None = None
|
|
message: str | None = None
|
|
data: dict | list | None = None
|
|
|
|
def error(self, message: str):
|
|
self.status = "error"
|
|
self.message = message
|
|
return self
|
|
|
|
def ok(self, data: dict | list | None = None, message: str | None = None):
|
|
self.status = "ok"
|
|
if data is None:
|
|
data = {}
|
|
self.data = data
|
|
self.message = message
|
|
return self
|
|
|
|
def to_json(self):
|
|
# Return a plain dict so callers can safely wrap with jsonify()
|
|
return asdict(self)
|