Fixed some bugs, changed tests structure, mypy

This commit is contained in:
DarkCat09 2022-07-01 09:36:52 +04:00
parent 44a7b0fd9a
commit 7d276dba8f
11 changed files with 178 additions and 38 deletions

108
.gitignore vendored
View file

@ -1,7 +1,103 @@
# Python # ---> Python
__pycache__ # Byte-compiled / optimized / DLL files
dist/* __pycache__/
*.egg-info/* *.py[cod]
*$py.class
# Vim # C extensions
*.swp *.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/

View file

@ -295,12 +295,15 @@ class AternosConfig:
:rtype: Dict[str,Any] :rtype: Dict[str,Any]
""" """
self.__get_all_props( return self.__get_all_props(
f'https://aternos.org/files/{world}/level.dat', f'https://aternos.org/files/{world}/level.dat',
proptyping, [DAT_PREFIX, DAT_GR_PREFIX] proptyping, [DAT_PREFIX, DAT_GR_PREFIX]
) )
def set_world_props(self, props: Dict[str, Any]) -> None: def set_world_props(
self,
props: Dict[Union[WorldOpts, WorldRules], Any]) -> None:
for key in props: for key in props:
self.set_world_prop(key, props[key]) self.set_world_prop(key, props[key])

View file

@ -236,7 +236,7 @@ class AternosConnect:
if '<title>Please Wait... | Cloudflare</title>' in req.text: if '<title>Please Wait... | Cloudflare</title>' in req.text:
logging.info('Retrying to bypass Cloudflare') logging.info('Retrying to bypass Cloudflare')
self.request_cloudflare( return self.request_cloudflare(
url, method, url, method,
params, data, params, data,
headers, reqcookies, headers, reqcookies,
@ -244,6 +244,7 @@ class AternosConnect:
retry - 1 retry - 1
) )
logging.debug('AternosConnect received: ' + req.text[:65])
logging.info( logging.info(
f'{method} completed with {req.status_code} status' f'{method} completed with {req.status_code} status'
) )

View file

@ -49,7 +49,7 @@ class FileManager:
else FileType.directory else FileType.directory
fsize_raw = f.xpath('./div[@class="filesize"]') fsize_raw = f.xpath('./div[@class="filesize"]')
fsize = 0 fsize = 0.0
if len(fsize_raw) > 0: if len(fsize_raw) > 0:
fsize_text = fsize_raw[0].text.strip() fsize_text = fsize_raw[0].text.strip()

View file

@ -3,6 +3,7 @@ import lxml.html
from typing import List, Union from typing import List, Union
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from .atserver import Edition
if TYPE_CHECKING: if TYPE_CHECKING:
from .atserver import AternosServer from .atserver import AternosServer
@ -12,6 +13,8 @@ class Lists(enum.Enum):
"""Players list type enum""" """Players list type enum"""
whl = 'whitelist' whl = 'whitelist'
whl_je = 'whitelist'
whl_be = 'allowlist'
ops = 'ops' ops = 'ops'
ban = 'banned-players' ban = 'banned-players'
ips = 'banned-ips' ips = 'banned-ips'
@ -32,7 +35,13 @@ class PlayersList:
self.atserv = atserv self.atserv = atserv
self.lst = Lists(lst) self.lst = Lists(lst)
self.players = []
common_whl = (self.lst == Lists.whl)
bedrock = (atserv.edition == Edition.bedrock)
if common_whl and bedrock:
self.lst = Lists.whl_be
self.players: List[str] = []
self.parsed = False self.parsed = False
def list_players(self, cache: bool = True) -> List[str]: def list_players(self, cache: bool = True) -> List[str]:

View file

@ -10,6 +10,8 @@ from .atconnect import REQUA
if TYPE_CHECKING: if TYPE_CHECKING:
from .atserver import AternosServer from .atserver import AternosServer
FunctionT = Callable[[Any], Coroutine[Any, Any, None]]
class Streams(enum.Enum): class Streams(enum.Enum):
@ -44,7 +46,8 @@ class AternosWss:
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 = atserv.servid self.servid = atserv.servid
self.recv = {} recvtype = Dict[Streams, Tuple[FunctionT, Tuple[Any]]]
self.recv: recvtype = {}
self.autoconfirm = autoconfirm self.autoconfirm = autoconfirm
self.confirmed = False self.confirmed = False
@ -54,7 +57,7 @@ class AternosWss:
self.atserv.confirm() self.atserv.confirm()
def wssreceiver(self, stream: Streams, *args: Any) -> Callable[[Callable[[Any], Coroutine[Any, Any, None]]], Any]: def wssreceiver(self, stream: Streams, *args: Any) -> Callable[[FunctionT], Any]:
"""Decorator that marks your function as a stream receiver. """Decorator that marks your function as a stream receiver.
When websocket receives message from the specified stream, When websocket receives message from the specified stream,
@ -68,7 +71,7 @@ class AternosWss:
:rtype: Callable[[Callable[[Any], Coroutine[Any, Any, None]]], Any] :rtype: Callable[[Callable[[Any], Coroutine[Any, Any, None]]], Any]
""" """
def decorator(func: Callable[[Any], Coroutine[Any, Any, None]]) -> None: def decorator(func: FunctionT) -> None:
self.recv[stream] = (func, args) self.recv[stream] = (func, args)
return decorator return decorator

View file

@ -38,7 +38,7 @@ setuptools.setup(
'lxml>=4.8.0', 'lxml>=4.8.0',
'cloudscraper>=1.2.58', 'cloudscraper>=1.2.58',
'js2py>=0.71', 'js2py>=0.71',
'c-websockets>=2.1.3', 'websockets>=10.1',
'regex>=2022.3.15' 'regex>=2022.3.15'
], ],
packages=['python_aternos'], packages=['python_aternos'],

19
test.sh Executable file
View file

@ -0,0 +1,19 @@
title () {
echo
echo "***"
echo "$1"
echo "***"
echo
}
title 'Checking needed modules...'
pip install pycodestyle mypy pylint
title 'Running unit tests...'
python -m unittest discover -v ./tests
title 'Running pep8 checker...'
python -m pycodestyle .
title 'Running mypy checker...'
python -m mypy .

View file

@ -0,0 +1,19 @@
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2rKOA1IFdBcHhEM616cb
2iXh5W5uEYq5fWJIazQ6
CuUcmZ27Fb8bVBNw12Vj
YPPe8Ph7vzYaZ9PF9oQP
UfLlemvKEE16ltk0hZNM
S1Oban9UGRXVIepREw9q
S1Oban9UGRXVIepREw9q
KYDDyT1DWOJTZpNtJWhM
lZPFwRqIGIf8JKk1LG02
KbxzYCJUrFjWzbeZcAmE
KbxzYCJUrFjWzbeZcAmE

View file

@ -1,3 +1,4 @@
import os
import re import re
import unittest import unittest
@ -11,33 +12,22 @@ class TestJs2Py(unittest.TestCase):
def setUp(self) -> None: def setUp(self) -> None:
self.path = os.path.abspath(os.path.dirname(__file__))
self.samples = os.path.join(self.path, 'samples')
self.input = os.path.join(self.samples, 'token_input.txt')
self.output = os.path.join(self.samples, 'token_output.txt')
self.tests = [] self.tests = []
with open('token.txt', 'rt') as f: with open(self.input, 'rt') as f:
lines = re.split(r'[\r\n]', f.read()) lines = re.split(r'[\r\n]', f.read())
del lines[-1] # Remove empty string at the end del lines[-1] # remove empty line at the end
self.tests = lines self.tests = lines
self.results = [ self.results = []
'2rKOA1IFdBcHhEM616cb', with open(self.output, 'rt') as f:
'2rKOA1IFdBcHhEM616cb', lines = re.split(r'[\r\n]', f.read())
'2rKOA1IFdBcHhEM616cb', del lines[-1] # remove empty line at the end
'2rKOA1IFdBcHhEM616cb', self.results = lines
'2rKOA1IFdBcHhEM616cb',
'2rKOA1IFdBcHhEM616cb',
'2rKOA1IFdBcHhEM616cb',
'2rKOA1IFdBcHhEM616cb',
'2rKOA1IFdBcHhEM616cb',
'2iXh5W5uEYq5fWJIazQ6',
'CuUcmZ27Fb8bVBNw12Vj',
'YPPe8Ph7vzYaZ9PF9oQP',
'UfLlemvKEE16ltk0hZNM',
'S1Oban9UGRXVIepREw9q',
'S1Oban9UGRXVIepREw9q',
'KYDDyT1DWOJTZpNtJWhM',
'lZPFwRqIGIf8JKk1LG02',
'KbxzYCJUrFjWzbeZcAmE',
'KbxzYCJUrFjWzbeZcAmE'
]
def test_base64(self) -> None: def test_base64(self) -> None: