Servers list caching, improvements in test script

This commit is contained in:
DarkCat09 2022-07-01 19:02:10 +04:00
parent 8bad49c695
commit 9c8e3a7ec8
2 changed files with 77 additions and 17 deletions

View file

@ -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:

View file

@ -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