From 7f189b806b6d2e9658a6e3fcb5425b428c21fca6 Mon Sep 17 00:00:00 2001 From: AURUMVORXX Date: Tue, 27 May 2025 00:04:03 +0300 Subject: [PATCH] fix: Logger + executing squirrel code --- include/messages.nut | 3 +- src/pyg2o/__init__.py | 11 +++++- src/pyg2o/classes/__init__.py | 0 src/pyg2o/exception.py | 68 --------------------------------- src/pyg2o/functions/__init__.py | 0 src/pyg2o/functions/game.py | 1 - src/pyg2o/functions/player.py | 16 ++++---- src/pyg2o/functions/pyg2o.py | 8 +++- src/pyg2o/functions/waypoint.py | 4 +- src/pyg2o/logger.py | 11 ++++++ src/pyg2o/server.py | 10 ++--- 11 files changed, 44 insertions(+), 88 deletions(-) delete mode 100644 src/pyg2o/classes/__init__.py delete mode 100644 src/pyg2o/exception.py delete mode 100644 src/pyg2o/functions/__init__.py create mode 100644 src/pyg2o/logger.py diff --git a/include/messages.nut b/include/messages.nut index ff8c852..b14417c 100644 --- a/include/messages.nut +++ b/include/messages.nut @@ -1,7 +1,8 @@ function _message_call(data) { - local result = compilestring(data["data"])(); + local compile_string = "try { " + data["data"] + " } catch(id) { print(\"[PyG2O] Error white executing the code: \" + id + \"\\nCode: " + data["data"] + "\"); return null; }"; + local result = compilestring(compile_string)(); local className = _getClassName(result); if (className == "Vec3") { diff --git a/src/pyg2o/__init__.py b/src/pyg2o/__init__.py index dbefff4..56bc3fe 100644 --- a/src/pyg2o/__init__.py +++ b/src/pyg2o/__init__.py @@ -146,6 +146,9 @@ from .functions.event import removeEventHandler from .functions.event import toggleEvent from .functions.event import removeEvent +from .functions.pyg2o import call_squirrel_function +from .functions.pyg2o import execute_squirrel_code + from .constants import Constant from .classes.daedalus import Daedalus @@ -155,8 +158,7 @@ from .classes.items import ItemsGround from .classes.mds import Mds from .classes.sky import Sky -import logging -logger = logging.getLogger(__name__) +from .logger import logger __all__ = [ "PythonWebsocketServer", @@ -306,6 +308,9 @@ __all__ = [ "toggleEvent", "removeEvent", + "call_squirrel_function", + "execute_squirrel_code", + "Constant", "Daedalus", @@ -314,4 +319,6 @@ __all__ = [ "ItemsGround", "Mds", "Sky", + + "logger", ] \ No newline at end of file diff --git a/src/pyg2o/classes/__init__.py b/src/pyg2o/classes/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/pyg2o/exception.py b/src/pyg2o/exception.py deleted file mode 100644 index 6f72b5a..0000000 --- a/src/pyg2o/exception.py +++ /dev/null @@ -1,68 +0,0 @@ -import logging -from functools import wraps - -logger = None - -def set_default_logger(value: logging.Logger): - """ - This function will the change default to your custom one. - - ## Declaration - ```python - def set_default_logger(value: logging.Logger): - ``` - - ## Parameters - * `logging.Logger` **value**: custom logger object. - """ - global logger - logger = value - -def handle_exception(func = None): - """ - This decorator will handle all occuring exceptions and print them into the logger. - - ## Declaration - ```python - def handle_exception(func = None): - ``` - - ## Usage - ```python - from g2o import handle_exception - - @handle_exception - def terrifying_function(): - print(5/0) - - @handle_exception - def check_pass_exception(): - wrong_position = {'x': 100, 'z': 300} # missing 'y' - try: - g2o.setPlayerPosition(0, wrong_position, pass_exception=True) # exception will occur inside this function, but `pass_exception` will also raise it here - except: - print('Exception passed to the parent') - ``` - """ - global logger - def decorator(f): - @wraps(f) - def wrapper(*args, **kwargs): - pass_exception = kwargs.pop('pass_exception', False) - try: - return f(*args, **kwargs) - except Exception as e: - if logger is not None: - logger.exception(e) - else: - logging.exception(e) - - if pass_exception: - raise - - return wrapper - - if func is not None: - return decorator(func) - - return decorator \ No newline at end of file diff --git a/src/pyg2o/functions/__init__.py b/src/pyg2o/functions/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/pyg2o/functions/game.py b/src/pyg2o/functions/game.py index a770b1e..7e5ca97 100644 --- a/src/pyg2o/functions/game.py +++ b/src/pyg2o/functions/game.py @@ -1,6 +1,5 @@ from ..server import PythonWebsocketServer from ..call_repr import get_call_repr -from typing import Optional async def getHostname() -> str: """ diff --git a/src/pyg2o/functions/player.py b/src/pyg2o/functions/player.py index 410e940..b626d11 100644 --- a/src/pyg2o/functions/player.py +++ b/src/pyg2o/functions/player.py @@ -211,7 +211,7 @@ async def getPlayerAtVector(id : int) -> Optional[tuple]: server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['x'], result['y'], result['z']) if result is not None else None + return (result['x'], result['y'], result['z']) if result is not None else (None, None, None) async def getPlayerBelt(id : int) -> str: """ @@ -251,7 +251,7 @@ async def getPlayerCameraPosition(id : int) -> Optional[tuple]: server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['x'], result['y'], result['z']) if result is not None else None + return (result['x'], result['y'], result['z']) if result is not None else (None, None, None) async def getPlayerCollision(id : int) -> bool: """ @@ -291,7 +291,7 @@ async def getPlayerColor(id : int) -> Optional[tuple]: server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['r'], result['g'], result['b']) if result is not None else None + return (result['r'], result['g'], result['b']) if result is not None else (None, None, None) async def getPlayerContext(id : int, type : int) -> int: """ @@ -657,7 +657,7 @@ async def getPlayerPosition(id : int) -> Optional[tuple]: server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['x'], result['y'], result['z']) if result is not None else None + return (result['x'], result['y'], result['z']) if result is not None else (None, None, None) async def getPlayerRangedWeapon(id : int) -> str: """ @@ -738,7 +738,7 @@ async def getPlayerScale(id : int) -> Optional[tuple]: server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['x'], result['y'], result['z']) if result is not None else None + return (result['x'], result['y'], result['z']) if result is not None else (None, None, None) async def getPlayerSerial(id : int) -> str: """ @@ -926,7 +926,7 @@ async def getPlayerVisual(id : int) -> Optional[tuple]: server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['bodyModel'], result['bodyTxt'], result['headModel'], result['headTxt']) if result is not None else None + return (result['bodyModel'], result['bodyTxt'], result['headModel'], result['headTxt']) if result is not None else (None, None, None, None) async def getPlayerWeaponMode(id : int) -> int: """ @@ -1505,7 +1505,7 @@ async def setPlayerPosition(id : int, x : float, y : float, z : float) -> Option server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['x'], result['y'], result['z']) if result is not None else None + return (result['x'], result['y'], result['z']) if result is not None else (None, None, None) async def setPlayerRespawnTime(id : int, respawnTime : int): """ @@ -1551,7 +1551,7 @@ async def setPlayerScale(id : int, x : float, y : float, z : float) -> Optional[ server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['x'], result['y'], result['z']) if result is not None else None + return (result['x'], result['y'], result['z']) if result is not None else (None, None, None) async def setPlayerSkillWeapon(id : int, skillId : int, percentage : int): """ diff --git a/src/pyg2o/functions/pyg2o.py b/src/pyg2o/functions/pyg2o.py index 0b9693f..d77e39e 100644 --- a/src/pyg2o/functions/pyg2o.py +++ b/src/pyg2o/functions/pyg2o.py @@ -2,9 +2,15 @@ from ..server import PythonWebsocketServer async def call_squirrel_function(function_name: str, *args): - arg_list = ', '.join(args) + args_str = map(str, args) + arg_list = ', '.join(args_str) data = f'return {function_name}({arg_list})' + server = await PythonWebsocketServer.get_server() + result = await server.make_request(data) + return result + +async def execute_squirrel_code(data: str): server = await PythonWebsocketServer.get_server() result = await server.make_request(data) return result \ No newline at end of file diff --git a/src/pyg2o/functions/waypoint.py b/src/pyg2o/functions/waypoint.py index 5728571..6c8297b 100644 --- a/src/pyg2o/functions/waypoint.py +++ b/src/pyg2o/functions/waypoint.py @@ -23,7 +23,7 @@ async def getNearestWaypoint(world : str, x : int, y : int, z : int) -> Optional server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['name'], result['x'], result['y'], result['z']) if result is not None else None + return (result['name'], result['x'], result['y'], result['z']) if result is not None else (None, None, None) async def getWaypoint(world : str, name : str) -> Optional[tuple]: """ @@ -44,4 +44,4 @@ async def getWaypoint(world : str, name : str) -> Optional[tuple]: server = await PythonWebsocketServer.get_server() result = await server.make_request(data) - return (result['x'], result['y'], result['z']) if result is not None else None \ No newline at end of file + return (result['x'], result['y'], result['z']) if result is not None else (None, None, None) \ No newline at end of file diff --git a/src/pyg2o/logger.py b/src/pyg2o/logger.py new file mode 100644 index 0000000..eb93d73 --- /dev/null +++ b/src/pyg2o/logger.py @@ -0,0 +1,11 @@ +import logging +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + +handler = logging.StreamHandler() +handler.setLevel(logging.INFO) + +formatter = logging.Formatter('[%(levelname)s][PyG2O] - %(message)s') +handler.setFormatter(formatter) + +logger.addHandler(handler) \ No newline at end of file diff --git a/src/pyg2o/server.py b/src/pyg2o/server.py index 26587ef..25d62ee 100644 --- a/src/pyg2o/server.py +++ b/src/pyg2o/server.py @@ -6,7 +6,7 @@ from typing import Optional from .constants import Constant from .functions.event import callEvent from .serialize import _deserialize -from pyg2o import logger +from .logger import logger class PythonWebsocketServer: @@ -50,7 +50,7 @@ class PythonWebsocketServer: port=self.port, ping_interval=self.ping_interval, ): - logger.info(f'[PyG2O] Server is started at ws://{self.host}:{self.port}') + logger.info(f'Server is started at ws://{self.host}:{self.port}') PythonWebsocketServer._current_server = self asyncio.create_task(callEvent('onInit', **{})) await self._stop_event.wait() @@ -142,16 +142,16 @@ class PythonWebsocketServer: try: message_json = json.loads(message) if not all(key in message_json for key in ('type', 'uuid', 'data')): - logger.error(f'[PyG2O] Expected message with (type, uuid, data) fields, got: {message_json}') + logger.error(f'Expected message with (type, uuid, data) fields, got: {message_json}') continue await self._callMessage(message_json['type'], message_json) except json.JSONDecodeError as e: - logger.exception(f'[PyG2O] JSON Exception: {e}') + logger.exception(f'JSON Exception: {e}') continue except Exception as e: - logger.exception(f'[PyG2O] Exception: {e}') + logger.exception(f'Exception: {e}') continue except websockets.exceptions.ConnectionClosedError: pass