fix: Logger + executing squirrel code

This commit is contained in:
AURUMVORXX
2025-05-27 00:04:03 +03:00
parent a6a4dd88ad
commit 7f189b806b
11 changed files with 44 additions and 88 deletions

View File

@@ -1,7 +1,8 @@
function _message_call(data) 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); local className = _getClassName(result);
if (className == "Vec3") if (className == "Vec3")
{ {

View File

@@ -146,6 +146,9 @@ from .functions.event import removeEventHandler
from .functions.event import toggleEvent from .functions.event import toggleEvent
from .functions.event import removeEvent from .functions.event import removeEvent
from .functions.pyg2o import call_squirrel_function
from .functions.pyg2o import execute_squirrel_code
from .constants import Constant from .constants import Constant
from .classes.daedalus import Daedalus from .classes.daedalus import Daedalus
@@ -155,8 +158,7 @@ from .classes.items import ItemsGround
from .classes.mds import Mds from .classes.mds import Mds
from .classes.sky import Sky from .classes.sky import Sky
import logging from .logger import logger
logger = logging.getLogger(__name__)
__all__ = [ __all__ = [
"PythonWebsocketServer", "PythonWebsocketServer",
@@ -306,6 +308,9 @@ __all__ = [
"toggleEvent", "toggleEvent",
"removeEvent", "removeEvent",
"call_squirrel_function",
"execute_squirrel_code",
"Constant", "Constant",
"Daedalus", "Daedalus",
@@ -314,4 +319,6 @@ __all__ = [
"ItemsGround", "ItemsGround",
"Mds", "Mds",
"Sky", "Sky",
"logger",
] ]

View File

@@ -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

View File

@@ -1,6 +1,5 @@
from ..server import PythonWebsocketServer from ..server import PythonWebsocketServer
from ..call_repr import get_call_repr from ..call_repr import get_call_repr
from typing import Optional
async def getHostname() -> str: async def getHostname() -> str:
""" """

View File

@@ -211,7 +211,7 @@ async def getPlayerAtVector(id : int) -> Optional[tuple]:
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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: async def getPlayerBelt(id : int) -> str:
""" """
@@ -251,7 +251,7 @@ async def getPlayerCameraPosition(id : int) -> Optional[tuple]:
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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: async def getPlayerCollision(id : int) -> bool:
""" """
@@ -291,7 +291,7 @@ async def getPlayerColor(id : int) -> Optional[tuple]:
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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: async def getPlayerContext(id : int, type : int) -> int:
""" """
@@ -657,7 +657,7 @@ async def getPlayerPosition(id : int) -> Optional[tuple]:
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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: async def getPlayerRangedWeapon(id : int) -> str:
""" """
@@ -738,7 +738,7 @@ async def getPlayerScale(id : int) -> Optional[tuple]:
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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: async def getPlayerSerial(id : int) -> str:
""" """
@@ -926,7 +926,7 @@ async def getPlayerVisual(id : int) -> Optional[tuple]:
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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: 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() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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): 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() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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): async def setPlayerSkillWeapon(id : int, skillId : int, percentage : int):
""" """

View File

@@ -2,9 +2,15 @@ from ..server import PythonWebsocketServer
async def call_squirrel_function(function_name: str, *args): 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})' data = f'return {function_name}({arg_list})'
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) result = await server.make_request(data)
return result return result
async def execute_squirrel_code(data: str):
server = await PythonWebsocketServer.get_server()
result = await server.make_request(data)
return result

View File

@@ -23,7 +23,7 @@ async def getNearestWaypoint(world : str, x : int, y : int, z : int) -> Optional
server = await PythonWebsocketServer.get_server() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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]: 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() server = await PythonWebsocketServer.get_server()
result = await server.make_request(data) 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)

11
src/pyg2o/logger.py Normal file
View File

@@ -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)

View File

@@ -6,7 +6,7 @@ from typing import Optional
from .constants import Constant from .constants import Constant
from .functions.event import callEvent from .functions.event import callEvent
from .serialize import _deserialize from .serialize import _deserialize
from pyg2o import logger from .logger import logger
class PythonWebsocketServer: class PythonWebsocketServer:
@@ -50,7 +50,7 @@ class PythonWebsocketServer:
port=self.port, port=self.port,
ping_interval=self.ping_interval, 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 PythonWebsocketServer._current_server = self
asyncio.create_task(callEvent('onInit', **{})) asyncio.create_task(callEvent('onInit', **{}))
await self._stop_event.wait() await self._stop_event.wait()
@@ -142,16 +142,16 @@ class PythonWebsocketServer:
try: try:
message_json = json.loads(message) message_json = json.loads(message)
if not all(key in message_json for key in ('type', 'uuid', 'data')): 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 continue
await self._callMessage(message_json['type'], message_json) await self._callMessage(message_json['type'], message_json)
except json.JSONDecodeError as e: except json.JSONDecodeError as e:
logger.exception(f'[PyG2O] JSON Exception: {e}') logger.exception(f'JSON Exception: {e}')
continue continue
except Exception as e: except Exception as e:
logger.exception(f'[PyG2O] Exception: {e}') logger.exception(f'Exception: {e}')
continue continue
except websockets.exceptions.ConnectionClosedError: except websockets.exceptions.ConnectionClosedError:
pass pass