fix: Logger + executing squirrel code
This commit is contained in:
@@ -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")
|
||||
{
|
||||
|
||||
@@ -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",
|
||||
]
|
||||
@@ -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
|
||||
@@ -1,6 +1,5 @@
|
||||
from ..server import PythonWebsocketServer
|
||||
from ..call_repr import get_call_repr
|
||||
from typing import Optional
|
||||
|
||||
async def getHostname() -> str:
|
||||
"""
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
@@ -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
11
src/pyg2o/logger.py
Normal 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)
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user