VWED_server/services/script_vwed_objects.py

383 lines
12 KiB
Python
Raw Normal View History

2025-09-12 16:15:13 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
VWED统一对象模块系统
提供脚本中可使用的VWED.apiVWED.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)