383 lines
12 KiB
Python
383 lines
12 KiB
Python
|
#!/usr/bin/env python
|
|||
|
# -*- coding: utf-8 -*-
|
|||
|
|
|||
|
"""
|
|||
|
VWED统一对象模块系统
|
|||
|
提供脚本中可使用的VWED.api、VWED.function等统一接口
|
|||
|
"""
|
|||
|
|
|||
|
import asyncio
|
|||
|
from typing import Dict, Any, Optional, Callable, List
|
|||
|
from services.script_registry_service import get_global_registry
|
|||
|
from services.script_websocket_service import get_websocket_manager
|
|||
|
from services.task_service import get_task_service
|
|||
|
from utils.logger import get_logger
|
|||
|
|
|||
|
logger = get_logger("services.script_vwed_objects")
|
|||
|
|
|||
|
|
|||
|
class VWEDApiModule:
|
|||
|
"""VWED.api 模块 - API接口注册"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
self.registry = get_global_registry()
|
|||
|
|
|||
|
# def register(self, path: str, method: str = "GET",
|
|||
|
# description: str = "", parameters: Dict = None,
|
|||
|
# response_schema: Dict = None):
|
|||
|
# """装饰器:注册API接口
|
|||
|
#
|
|||
|
# 使用方式:
|
|||
|
# @VWED.api.register("/test", "POST", description="测试接口")
|
|||
|
# def handle_test(request_data):
|
|||
|
# return {"result": "success"}
|
|||
|
# """
|
|||
|
# def decorator(handler: Callable):
|
|||
|
# self.registry.register_api_route(
|
|||
|
# path=path,
|
|||
|
# method=method,
|
|||
|
# handler=handler,
|
|||
|
# script_id=self.script_id,
|
|||
|
# description=description,
|
|||
|
# parameters=parameters,
|
|||
|
# response_schema=response_schema
|
|||
|
# )
|
|||
|
# return handler
|
|||
|
# return decorator
|
|||
|
|
|||
|
# def get(self, path: str, **kwargs):
|
|||
|
# """注册GET接口"""
|
|||
|
# return self.register(path, "GET", **kwargs)
|
|||
|
#
|
|||
|
# def post(self, path: str, **kwargs):
|
|||
|
# """注册POST接口"""
|
|||
|
# return self.register(path, "POST", **kwargs)
|
|||
|
#
|
|||
|
# def put(self, path: str, **kwargs):
|
|||
|
# """注册PUT接口"""
|
|||
|
# return self.register(path, "PUT", **kwargs)
|
|||
|
#
|
|||
|
# def delete(self, path: str, **kwargs):
|
|||
|
# """注册DELETE接口"""
|
|||
|
# return self.register(path, "DELETE", **kwargs)
|
|||
|
|
|||
|
def register_route(self, path: str, method: str = "GET", handler: Callable = None,
|
|||
|
description: str = "", params: Dict = None,
|
|||
|
parameters: Dict = None, response_schema: Dict = None):
|
|||
|
"""分离式API接口注册(用户要求的新格式)
|
|||
|
|
|||
|
使用方式:
|
|||
|
VWED.api.register_route(
|
|||
|
path="/calculate",
|
|||
|
method="POST",
|
|||
|
handler=calculate_handler,
|
|||
|
description="数学计算接口",
|
|||
|
params={"a": 0, "b": 0, "operation": "add"} # 简化的参数定义
|
|||
|
)
|
|||
|
"""
|
|||
|
# 验证HTTP方法
|
|||
|
valid_methods = ["GET", "POST", "PUT", "DELETE"]
|
|||
|
if method.upper() not in valid_methods:
|
|||
|
raise ValueError(f"method参数错误:'{method}' 不是有效的HTTP请求方式。支持的方式有:{', '.join(valid_methods)}")
|
|||
|
|
|||
|
if handler is None:
|
|||
|
raise ValueError("handler参数不能为空")
|
|||
|
|
|||
|
self.registry.register_api_route(
|
|||
|
path=path,
|
|||
|
method=method.upper(),
|
|||
|
handler=handler,
|
|||
|
script_id=self.script_id,
|
|||
|
description=description,
|
|||
|
params=params, # 传递简化的参数格式
|
|||
|
parameters=parameters,
|
|||
|
response_schema=response_schema
|
|||
|
)
|
|||
|
return handler
|
|||
|
|
|||
|
|
|||
|
class VWEDFunctionModule:
|
|||
|
"""VWED.function 模块 - 自定义函数注册"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
self.registry = get_global_registry()
|
|||
|
|
|||
|
def register(self, name: str, handler: Callable = None, description: str = "",
|
|||
|
params: Dict = None, parameters: List[Dict] = None,
|
|||
|
return_schema: Dict = None, tags: List[str] = None):
|
|||
|
"""分离式自定义函数注册
|
|||
|
|
|||
|
使用方式:
|
|||
|
VWED.function.register(
|
|||
|
name="simple_add",
|
|||
|
handler=simple_add,
|
|||
|
description="简单加法函数",
|
|||
|
params={"a": 0, "b": 0} # 简化的参数定义
|
|||
|
)
|
|||
|
"""
|
|||
|
if handler is None:
|
|||
|
raise ValueError("handler参数不能为空")
|
|||
|
|
|||
|
self.registry.register_function(
|
|||
|
name=name,
|
|||
|
handler=handler,
|
|||
|
script_id=self.script_id,
|
|||
|
description=description,
|
|||
|
params=params, # 传递简化的参数格式
|
|||
|
parameters=parameters,
|
|||
|
return_schema=return_schema,
|
|||
|
tags=tags
|
|||
|
)
|
|||
|
return handler
|
|||
|
|
|||
|
|
|||
|
class VWEDEventModule:
|
|||
|
"""VWED.event 模块 - 事件系统"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
self.registry = get_global_registry()
|
|||
|
|
|||
|
def listen(self, event_name: str, handler: Callable, priority: int = 1):
|
|||
|
"""注册事件监听器
|
|||
|
|
|||
|
分离式模式:
|
|||
|
VWED.event.listen(
|
|||
|
event_name="user_login",
|
|||
|
handler=on_user_login
|
|||
|
)
|
|||
|
"""
|
|||
|
def decorator(func: Callable):
|
|||
|
self.registry.register_event_listener(
|
|||
|
event_name=event_name,
|
|||
|
handler=func,
|
|||
|
script_id=self.script_id,
|
|||
|
priority=priority
|
|||
|
)
|
|||
|
return func
|
|||
|
|
|||
|
# if handler is not None:
|
|||
|
return decorator(handler)
|
|||
|
# else:
|
|||
|
# # 装饰器模式
|
|||
|
# return decorator
|
|||
|
|
|||
|
async def emit(self, event_name: str, data: Dict[str, Any]):
|
|||
|
"""触发事件"""
|
|||
|
await self.registry.emit_event(event_name, data)
|
|||
|
|
|||
|
def on(self, event_name: str, priority: int = 1):
|
|||
|
"""listen的别名"""
|
|||
|
return self.listen(event_name, priority=priority)
|
|||
|
|
|||
|
|
|||
|
class VWEDTimerModule:
|
|||
|
"""VWED.timer 模块 - 定时任务"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
self.registry = get_global_registry()
|
|||
|
|
|||
|
def interval(self, seconds: int, handler: Callable, repeat: bool = True, delay: int = 0):
|
|||
|
"""注册定时任务
|
|||
|
分离式模式:
|
|||
|
VWED.timer.interval(
|
|||
|
seconds=60,
|
|||
|
handler=system_monitor
|
|||
|
)
|
|||
|
"""
|
|||
|
def decorator(func: Callable):
|
|||
|
timer_id = f"{self.script_id}_{func.__name__}_{id(func)}"
|
|||
|
self.registry.register_timer(
|
|||
|
timer_id=timer_id,
|
|||
|
interval=seconds,
|
|||
|
handler=func,
|
|||
|
script_id=self.script_id,
|
|||
|
repeat=repeat,
|
|||
|
delay=delay
|
|||
|
)
|
|||
|
return func
|
|||
|
|
|||
|
# if handler is not None:
|
|||
|
# 分离式调用模式
|
|||
|
return decorator(handler)
|
|||
|
# else:
|
|||
|
# # 装饰器模式
|
|||
|
# return decorator
|
|||
|
|
|||
|
def once(self, delay: int = 0, handler: Callable = None):
|
|||
|
"""注册一次性定时任务
|
|||
|
分离式模式:
|
|||
|
VWED.timer.once(
|
|||
|
delay=10,
|
|||
|
handler=initialization_task
|
|||
|
)
|
|||
|
"""
|
|||
|
return self.interval(0, handler=handler, repeat=False, delay=delay)
|
|||
|
|
|||
|
# def every(self, seconds: int):
|
|||
|
# """interval的别名"""
|
|||
|
# return self.interval(seconds)
|
|||
|
|
|||
|
|
|||
|
class VWEDLogModule:
|
|||
|
"""VWED.log 模块 - 日志系统"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
self.websocket_manager = get_websocket_manager()
|
|||
|
|
|||
|
async def info(self, message: str, **kwargs):
|
|||
|
"""输出信息日志"""
|
|||
|
await self.websocket_manager.broadcast_script_log(
|
|||
|
self.script_id, "INFO", message, **kwargs
|
|||
|
)
|
|||
|
|
|||
|
async def warning(self, message: str, **kwargs):
|
|||
|
"""输出警告日志"""
|
|||
|
await self.websocket_manager.broadcast_script_log(
|
|||
|
self.script_id, "WARNING", message, **kwargs
|
|||
|
)
|
|||
|
|
|||
|
async def error(self, message: str, **kwargs):
|
|||
|
"""输出错误日志"""
|
|||
|
await self.websocket_manager.broadcast_script_log(
|
|||
|
self.script_id, "ERROR", message, **kwargs
|
|||
|
)
|
|||
|
|
|||
|
async def debug(self, message: str, **kwargs):
|
|||
|
"""输出调试日志"""
|
|||
|
await self.websocket_manager.broadcast_script_log(
|
|||
|
self.script_id, "DEBUG", message, **kwargs
|
|||
|
)
|
|||
|
|
|||
|
def sync_info(self, message: str, **kwargs):
|
|||
|
"""同步方式输出信息日志"""
|
|||
|
asyncio.create_task(self.info(message, **kwargs))
|
|||
|
|
|||
|
def sync_warning(self, message: str, **kwargs):
|
|||
|
"""同步方式输出警告日志"""
|
|||
|
asyncio.create_task(self.warning(message, **kwargs))
|
|||
|
|
|||
|
def sync_error(self, message: str, **kwargs):
|
|||
|
"""同步方式输出错误日志"""
|
|||
|
asyncio.create_task(self.error(message, **kwargs))
|
|||
|
|
|||
|
def sync_debug(self, message: str, **kwargs):
|
|||
|
"""同步方式输出调试日志"""
|
|||
|
asyncio.create_task(self.debug(message, **kwargs))
|
|||
|
|
|||
|
|
|||
|
class VWEDTaskModule:
|
|||
|
"""VWED.task 模块 - 任务系统集成"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
self.task_service = get_task_service()
|
|||
|
|
|||
|
async def create_task(self, task_name: str, task_config: Dict[str, Any]) -> Dict[str, Any]:
|
|||
|
"""创建VWED任务"""
|
|||
|
# 这里集成现有的任务服务
|
|||
|
# 具体实现需要根据现有的任务系统API进行调整
|
|||
|
return {"success": True, "message": "任务创建功能待实现"}
|
|||
|
|
|||
|
async def execute_task(self, task_id: int, parameters: Dict[str, Any] = None) -> Dict[str, Any]:
|
|||
|
"""执行VWED任务"""
|
|||
|
# 集成现有的任务执行系统
|
|||
|
return {"success": True, "message": "任务执行功能待实现"}
|
|||
|
|
|||
|
async def get_task_status(self, task_id: int) -> Dict[str, Any]:
|
|||
|
"""获取任务状态"""
|
|||
|
return {"success": True, "message": "获取任务状态功能待实现"}
|
|||
|
|
|||
|
|
|||
|
class VWEDDataModule:
|
|||
|
"""VWED.data 模块 - 数据存储和缓存"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
self._storage: Dict[str, Any] = {}
|
|||
|
|
|||
|
def get(self, key: str, default=None):
|
|||
|
"""获取数据"""
|
|||
|
return self._storage.get(key, default)
|
|||
|
|
|||
|
def set(self, key: str, value: Any):
|
|||
|
"""设置数据"""
|
|||
|
self._storage[key] = value
|
|||
|
|
|||
|
def delete(self, key: str):
|
|||
|
"""删除数据"""
|
|||
|
if key in self._storage:
|
|||
|
del self._storage[key]
|
|||
|
|
|||
|
def clear(self):
|
|||
|
"""清空所有数据"""
|
|||
|
self._storage.clear()
|
|||
|
|
|||
|
def keys(self):
|
|||
|
"""获取所有键"""
|
|||
|
return list(self._storage.keys())
|
|||
|
|
|||
|
def has(self, key: str) -> bool:
|
|||
|
"""检查键是否存在"""
|
|||
|
return key in self._storage
|
|||
|
|
|||
|
|
|||
|
class VWEDUtilModule:
|
|||
|
"""VWED.util 模块 - 工具函数"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
|
|||
|
def sleep(self, seconds: float):
|
|||
|
"""同步睡眠"""
|
|||
|
import time
|
|||
|
time.sleep(seconds)
|
|||
|
|
|||
|
async def async_sleep(self, seconds: float):
|
|||
|
"""异步睡眠"""
|
|||
|
await asyncio.sleep(seconds)
|
|||
|
|
|||
|
def now(self) -> str:
|
|||
|
"""获取当前时间"""
|
|||
|
from datetime import datetime
|
|||
|
return datetime.now().isoformat()
|
|||
|
|
|||
|
def timestamp(self) -> float:
|
|||
|
"""获取当前时间戳"""
|
|||
|
import time
|
|||
|
return time.time()
|
|||
|
|
|||
|
def uuid(self) -> str:
|
|||
|
"""生成UUID"""
|
|||
|
import uuid
|
|||
|
return str(uuid.uuid4())
|
|||
|
|
|||
|
|
|||
|
class VWEDObject:
|
|||
|
"""VWED统一对象 - 脚本中的全局VWED变量"""
|
|||
|
|
|||
|
def __init__(self, script_id: str):
|
|||
|
self.script_id = script_id
|
|||
|
|
|||
|
# 初始化各模块
|
|||
|
self.api = VWEDApiModule(script_id)
|
|||
|
self.function = VWEDFunctionModule(script_id)
|
|||
|
self.event = VWEDEventModule(script_id)
|
|||
|
self.timer = VWEDTimerModule(script_id)
|
|||
|
self.log = VWEDLogModule(script_id)
|
|||
|
self.task = VWEDTaskModule(script_id)
|
|||
|
self.data = VWEDDataModule(script_id)
|
|||
|
self.util = VWEDUtilModule(script_id)
|
|||
|
|
|||
|
def get_script_id(self) -> str:
|
|||
|
"""获取当前脚本ID"""
|
|||
|
return self.script_id
|
|||
|
|
|||
|
|
|||
|
def create_vwed_object(script_id: str) -> VWEDObject:
|
|||
|
"""创建VWED对象实例"""
|
|||
|
return VWEDObject(script_id)
|