WebSockets bugfix, updated Readme

This commit is contained in:
DarkCat09 2022-04-06 11:44:14 +04:00
parent b1f40db14a
commit dd72d02643
4 changed files with 51 additions and 25 deletions

View file

@ -62,9 +62,9 @@ if testserv != None:
|v0.3|Implemented files API, added typization.| |v0.3|Implemented files API, added typization.|
|v0.4|Implemented configuration API, some bugfixes.| |v0.4|Implemented configuration API, some bugfixes.|
|v0.5|The API was updated corresponding to new Aternos security methods. Huge thanks to [lusm554](https://github.com/lusm554).| |v0.5|The API was updated corresponding to new Aternos security methods. Huge thanks to [lusm554](https://github.com/lusm554).|
|v0.6|Code refactoring, unit-tests, websocket API and session saving to prevent detecting automation access.| |v0.6|Code refactoring, websockets API and session saving to prevent detecting automation access.|
|v0.7|Full implementation of config API and Google Drive backups is planned.| |v0.7|Full implementation of config and software API, unit tests and documentation is planned.|
|v0.8|Shared access API and permission management is planned.| |v0.8|Shared access API and Google Drive backups is planned.|
|v0.9.x|A long debugging before stable release, SemVer version code.| |v0.9.x|A long debugging before stable release, SemVer version code.|
## License ## License

View file

@ -1,3 +1,4 @@
import asyncio
from getpass import getpass from getpass import getpass
from python_aternos import Client, atwss from python_aternos import Client, atwss
@ -10,6 +11,10 @@ socket = s.wss()
@socket.wssreceiver(atwss.Streams.console) @socket.wssreceiver(atwss.Streams.console)
async def console(msg): async def console(msg):
print('Received: ' + msg) print('Received:', msg)
async def main():
s.start() s.start()
await socket.connect()
asyncio.run(main())

View file

@ -17,7 +17,7 @@ class Edition(enum.IntEnum):
class Status(enum.IntEnum): class Status(enum.IntEnum):
off = 0 off = 0
on = 1 on = 1
loading = 2 starting = 2
shutdown = 3 shutdown = 3
unknown = 6 unknown = 6
error = 7 error = 7

View file

@ -1,6 +1,7 @@
import enum import enum
import json import json
import asyncio import asyncio
import logging
import websockets import websockets
from typing import Union, Any, Dict, Callable, Coroutine from typing import Union, Any, Dict, Callable, Coroutine
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
@ -9,12 +10,17 @@ from .atconnect import REQUA
if TYPE_CHECKING: if TYPE_CHECKING:
from .atserver import AternosServer from .atserver import AternosServer
class Streams(enum.IntEnum): class Streams(enum.Enum):
status = 0
queue = 1 status = (0,None)
console = 2 queue = (1,None)
ram = 3 console = (2,'console')
tps = 4 ram = (3,'heap')
tps = (4,'tick')
def __init__(self, num:int, stream:str):
self.num = num
self.stream = stream
class AternosWss: class AternosWss:
@ -23,7 +29,7 @@ class AternosWss:
self.atserv = atserv self.atserv = atserv
self.cookies = atserv.atconn.session.cookies self.cookies = atserv.atconn.session.cookies
self.session = self.cookies['ATERNOS_SESSION'] self.session = self.cookies['ATERNOS_SESSION']
self.servid = self.cookies['ATERNOS_SERVER'] self.servid = atserv.servid
self.recv = {} self.recv = {}
self.autoconfirm = autoconfirm self.autoconfirm = autoconfirm
self.confirmed = False self.confirmed = False
@ -32,7 +38,7 @@ class AternosWss:
self.atserv.confirm() self.atserv.confirm()
def wssreceiver(self, stream:int) -> Callable[[Callable[[Any],Coroutine[Any,Any,None]]],Any]: def wssreceiver(self, stream:Streams) -> Callable[[Callable[[Any],Coroutine[Any,Any,None]]],Any]:
def decorator(func:Callable[[Any],Coroutine[Any,Any,None]]) -> None: def decorator(func:Callable[[Any],Coroutine[Any,Any,None]]) -> None:
self.recv[stream] = func self.recv[stream] = func
return decorator return decorator
@ -54,6 +60,30 @@ class AternosWss:
extra_headers=headers extra_headers=headers
) )
@self.wssreceiver(Streams.status)
async def confirmfunc(msg):
# Autoconfirm
if not self.autoconfirm:
return
if msg['class'] == 'queueing' \
and msg['queue']['pending'] == 'pending'\
and not self.confirmed:
self.confirm()
@self.wssreceiver(Streams.status)
async def streamsfunc(msg):
if msg['status'] == 2:
# Automatically start streams
for strm in self.recv:
if not isinstance(strm,Streams):
continue
if strm.stream:
logging.debug(f'Enabling {strm.stream} stream')
await self.send({
'stream': strm.stream,
'type': 'start'
})
await self.wssworker() await self.wssworker()
async def close(self) -> None: async def close(self) -> None:
@ -66,7 +96,7 @@ class AternosWss:
if isinstance(obj, dict): if isinstance(obj, dict):
obj = json.dumps(obj) obj = json.dumps(obj)
self.socket.send(obj) await self.socket.send(obj)
async def wssworker(self) -> None: async def wssworker(self) -> None:
@ -86,6 +116,7 @@ class AternosWss:
while True: while True:
data = await self.socket.recv() data = await self.socket.recv()
obj = json.loads(data) obj = json.loads(data)
msgtype = -1
if obj['type'] == 'line': if obj['type'] == 'line':
msgtype = Streams.console msgtype = Streams.console
@ -104,16 +135,6 @@ class AternosWss:
msgtype = Streams.status msgtype = Streams.status
msg = json.loads(obj['message']) msg = json.loads(obj['message'])
if not self.autoconfirm:
continue
if msg['class'] == 'queueing' \
and msg['queue']['pending'] == 'pending'\
and not self.confirmed:
t = asyncio.create_task(
self.confirm()
)
await t
if msgtype in self.recv: if msgtype in self.recv:
t = asyncio.create_task( t = asyncio.create_task(
self.recv[msgtype](msg) self.recv[msgtype](msg)