VWED_server/services/script_vwed_objects.py

383 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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)