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

@@ -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",
]

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 ..call_repr import get_call_repr
from typing import Optional
async def getHostname() -> str:
"""

View File

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

View File

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

View File

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