fix: Logger + executing squirrel code
This commit is contained in:
@@ -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")
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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",
|
||||||
]
|
]
|
||||||
@@ -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 ..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:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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()
|
||||||
|
result = await server.make_request(data)
|
||||||
|
return result
|
||||||
|
|
||||||
|
async def execute_squirrel_code(data: str):
|
||||||
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
|
||||||
@@ -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
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 .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
|
||||||
|
|||||||
Reference in New Issue
Block a user