Servers list caching, improvements in test script
This commit is contained in:
parent
8bad49c695
commit
9c8e3a7ec8
2 changed files with 77 additions and 17 deletions
|
@ -5,7 +5,7 @@ import os
|
||||||
import re
|
import re
|
||||||
import hashlib
|
import hashlib
|
||||||
import lxml.html
|
import lxml.html
|
||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
from .atserver import AternosServer
|
from .atserver import AternosServer
|
||||||
from .atconnect import AternosConnect
|
from .atconnect import AternosConnect
|
||||||
|
@ -21,9 +21,17 @@ class Client:
|
||||||
:type atconn: python_aternos.atconnect.AternosConnect
|
:type atconn: python_aternos.atconnect.AternosConnect
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, atconn: AternosConnect) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
atconn: AternosConnect,
|
||||||
|
servers: Optional[List[str]] = None) -> None:
|
||||||
|
|
||||||
self.atconn = atconn
|
self.atconn = atconn
|
||||||
|
self.parsed = False
|
||||||
|
self.servers: List[AternosServer] = []
|
||||||
|
|
||||||
|
if servers:
|
||||||
|
self.refresh_servers(servers)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_hashed(cls, username: str, md5: str):
|
def from_hashed(cls, username: str, md5: str):
|
||||||
|
@ -78,7 +86,10 @@ class Client:
|
||||||
return cls.from_hashed(username, md5)
|
return cls.from_hashed(username, md5)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_session(cls, session: str):
|
def from_session(
|
||||||
|
cls,
|
||||||
|
session: str,
|
||||||
|
servers: Optional[List[str]] = None):
|
||||||
|
|
||||||
"""Log in to Aternos using a session cookie value
|
"""Log in to Aternos using a session cookie value
|
||||||
|
|
||||||
|
@ -93,7 +104,7 @@ class Client:
|
||||||
atconn.parse_token()
|
atconn.parse_token()
|
||||||
atconn.generate_sec()
|
atconn.generate_sec()
|
||||||
|
|
||||||
return cls(atconn)
|
return cls(atconn, servers)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def restore_session(cls, file: str = '~/.aternos'):
|
def restore_session(cls, file: str = '~/.aternos'):
|
||||||
|
@ -101,7 +112,7 @@ class Client:
|
||||||
"""Log in to Aternos using a saved ATERNOS_SESSION cookie
|
"""Log in to Aternos using a saved ATERNOS_SESSION cookie
|
||||||
|
|
||||||
:param file: File where a session cookie
|
:param file: File where a session cookie
|
||||||
was saved, deafults to ~/.aternos
|
was saved, deafults to `~/.aternos`
|
||||||
:type file: str, optional
|
:type file: str, optional
|
||||||
:return: Client instance
|
:return: Client instance
|
||||||
:rtype: python_aternos.Client
|
:rtype: python_aternos.Client
|
||||||
|
@ -109,7 +120,16 @@ class Client:
|
||||||
|
|
||||||
file = os.path.expanduser(file)
|
file = os.path.expanduser(file)
|
||||||
with open(file, 'rt') as f:
|
with open(file, 'rt') as f:
|
||||||
session = f.read().strip()
|
saved = f.read().replace('\r\n', '\n').split('\n')
|
||||||
|
|
||||||
|
session = saved[0].strip()
|
||||||
|
|
||||||
|
if len(saved) > 1:
|
||||||
|
return cls.from_session(
|
||||||
|
session=session,
|
||||||
|
servers=saved[1:]
|
||||||
|
)
|
||||||
|
|
||||||
return cls.from_session(session)
|
return cls.from_session(session)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -126,41 +146,80 @@ class Client:
|
||||||
encoded = hashlib.md5(passwd.encode('utf-8'))
|
encoded = hashlib.md5(passwd.encode('utf-8'))
|
||||||
return encoded.hexdigest().lower()
|
return encoded.hexdigest().lower()
|
||||||
|
|
||||||
def save_session(self, file: str = '~/.aternos') -> None:
|
def save_session(
|
||||||
|
self,
|
||||||
|
file: str = '~/.aternos',
|
||||||
|
incl_servers: bool = True) -> None:
|
||||||
|
|
||||||
"""Saves an ATERNOS_SESSION cookie to a file
|
"""Saves an ATERNOS_SESSION cookie to a file
|
||||||
|
|
||||||
:param file: File where a session cookie
|
:param file: File where a session cookie
|
||||||
must be saved, defaults to ~/.aternos
|
must be saved, defaults to `~/.aternos`
|
||||||
:type file: str, optional
|
:type file: str, optional
|
||||||
|
:param incl_servers: If the function
|
||||||
|
should include the servers IDs to
|
||||||
|
reduce API requests count (recommended),
|
||||||
|
defaults to True
|
||||||
|
:type incl_servers: bool, optional
|
||||||
"""
|
"""
|
||||||
|
|
||||||
file = os.path.expanduser(file)
|
file = os.path.expanduser(file)
|
||||||
with open(file, 'wt') as f:
|
with open(file, 'wt') as f:
|
||||||
f.write(self.atconn.atsession)
|
|
||||||
|
|
||||||
def list_servers(self) -> List[AternosServer]:
|
f.write(self.atconn.atsession + '\n')
|
||||||
|
if not incl_servers:
|
||||||
|
return
|
||||||
|
|
||||||
|
for s in self.servers:
|
||||||
|
f.write(s.servid + '\n')
|
||||||
|
|
||||||
|
def list_servers(self, cache: bool = True) -> List[AternosServer]:
|
||||||
|
|
||||||
"""Parses a list of your servers from Aternos website
|
"""Parses a list of your servers from Aternos website
|
||||||
|
|
||||||
|
:param cache: If the function should use
|
||||||
|
cached servers list (recommended), defaults to True
|
||||||
|
:type cache: bool, optional
|
||||||
:return: List of :class:`python_aternos.atserver.AternosServer` objects
|
:return: List of :class:`python_aternos.atserver.AternosServer` objects
|
||||||
:rtype: list
|
:rtype: list
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if cache and self.parsed:
|
||||||
|
return self.servers
|
||||||
|
|
||||||
serverspage = self.atconn.request_cloudflare(
|
serverspage = self.atconn.request_cloudflare(
|
||||||
'https://aternos.org/servers/', 'GET'
|
'https://aternos.org/servers/', 'GET'
|
||||||
)
|
)
|
||||||
serverstree = lxml.html.fromstring(serverspage.content)
|
serverstree = lxml.html.fromstring(serverspage.content)
|
||||||
serverslist = serverstree.xpath(
|
|
||||||
|
servers = serverstree.xpath(
|
||||||
'//div[contains(@class,"servers ")]/div'
|
'//div[contains(@class,"servers ")]/div'
|
||||||
|
'/div[@class="server-body"]/@data-id'
|
||||||
)
|
)
|
||||||
|
self.refresh_servers(servers)
|
||||||
|
|
||||||
servers = []
|
return self.servers
|
||||||
for server in serverslist:
|
|
||||||
servid = server.xpath('./div[@class="server-body"]/@data-id')[0]
|
|
||||||
servers.append(AternosServer(servid, self.atconn))
|
|
||||||
|
|
||||||
return servers
|
def refresh_servers(self, ids: List[str]) -> None:
|
||||||
|
|
||||||
|
"""Replaces cached servers list creating
|
||||||
|
:class:`AternosServer` objects by given IDs
|
||||||
|
|
||||||
|
:param ids: Servers unique identifiers
|
||||||
|
:type ids: List[str]
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.servers = []
|
||||||
|
for s in ids:
|
||||||
|
|
||||||
|
servid = s.strip()
|
||||||
|
if servid == '':
|
||||||
|
continue
|
||||||
|
|
||||||
|
srv = AternosServer(servid, self.atconn)
|
||||||
|
self.servers.append(srv)
|
||||||
|
|
||||||
|
self.parsed = True
|
||||||
|
|
||||||
def get_server(self, servid: str) -> AternosServer:
|
def get_server(self, servid: str) -> AternosServer:
|
||||||
|
|
||||||
|
|
3
test.sh
3
test.sh
|
@ -31,7 +31,8 @@ display_failed() {
|
||||||
|
|
||||||
local IFS=', '
|
local IFS=', '
|
||||||
if [[ ${#failed[@]} > 0 ]]; then
|
if [[ ${#failed[@]} > 0 ]]; then
|
||||||
echo -e "$FAILED[!] View output for: ${failed[*]}$RESET"
|
joined=`echo -n ${failed[*]} | sed 's/ /, /'`
|
||||||
|
echo -e "$FAILED[!] View output of: $joined$RESET"
|
||||||
else
|
else
|
||||||
echo -e "$SUCCESS[V] All tests are passed successfully$RESET"
|
echo -e "$SUCCESS[V] All tests are passed successfully$RESET"
|
||||||
fi
|
fi
|
||||||
|
|
Reference in a new issue