This commit is contained in:
Eriks K 2021-03-03 13:13:19 +02:00
parent 45623de97b
commit 6276242260
8 changed files with 47 additions and 35 deletions

View File

@ -6,7 +6,6 @@ __author__ = """Eriks Karls"""
__email__ = 'eriks@72.lv' __email__ = 'eriks@72.lv'
__version__ = '0.24.1' __version__ = '0.24.1'
from erepublik import classes, constants, utils
from erepublik.citizen import Citizen from erepublik.citizen import Citizen
__all__ = ["classes", "utils", "Citizen", 'constants'] __all__ = ['Citizen', '__version__']

View File

@ -49,7 +49,7 @@ class ErepublikFormatter(logging.Formatter):
default_fmt = "[%(asctime)s] %(levelname)s: %(msg)s" default_fmt = "[%(asctime)s] %(levelname)s: %(msg)s"
def converter(self, timestamp: Union[int, float]) -> datetime.datetime: def converter(self, timestamp: Union[int, float]) -> datetime.datetime:
return datetime.datetime.utcfromtimestamp(timestamp).astimezone(erep_tz) return datetime.datetime.fromtimestamp(timestamp).astimezone(erep_tz)
def format(self, record: logging.LogRecord) -> str: def format(self, record: logging.LogRecord) -> str:
""" """

View File

@ -3,11 +3,11 @@ import hashlib
import random import random
import time import time
from typing import Any, Dict, List, Mapping, Union from typing import Any, Dict, List, Mapping, Union
from requests_toolbelt.utils import dump
from requests import Response, Session from requests import Response, Session
from requests_toolbelt.utils import dump
from . import constants, utils from erepublik import constants, utils
__all__ = ['SlowRequests', 'CitizenAPI'] __all__ = ['SlowRequests', 'CitizenAPI']

View File

@ -9,11 +9,12 @@ from threading import Event
from time import sleep from time import sleep
from typing import Any, Dict, List, NoReturn, Optional, Set, Tuple, Union from typing import Any, Dict, List, NoReturn, Optional, Set, Tuple, Union
from requests import RequestException, Response, HTTPError from requests import HTTPError, RequestException, Response
from . import access_points, classes, constants, _types as types, utils from erepublik import _types as types
from .classes import OfferItem from erepublik import access_points, classes, constants, utils
from ._logging import ErepublikErrorHTTTPHandler, ErepublikFileHandler, ErepublikFormatter, ErepublikLogConsoleHandler from erepublik._logging import ErepublikErrorHTTTPHandler, ErepublikFileHandler, ErepublikFormatter, \
ErepublikLogConsoleHandler
class BaseCitizen(access_points.CitizenAPI): class BaseCitizen(access_points.CitizenAPI):
@ -279,7 +280,7 @@ class BaseCitizen(access_points.CitizenAPI):
return self._post_main_session_get_challenge(captcha_id, image_id).json() return self._post_main_session_get_challenge(captcha_id, image_id).json()
def solve_captcha(self, src: str) -> List[Dict[str, int]]: def solve_captcha(self, src: str) -> List[Dict[str, int]]:
raise NotImplemented return []
@property @property
def inventory(self) -> classes.Inventory: def inventory(self) -> classes.Inventory:
@ -1327,7 +1328,7 @@ class CitizenEconomy(CitizenTravel):
self._report_action('BOUGHT_PRODUCTS', json_ret.get('message'), kwargs=json_ret) self._report_action('BOUGHT_PRODUCTS', json_ret.get('message'), kwargs=json_ret)
return json_ret return json_ret
def buy_market_offer(self, offer: OfferItem, amount: int = None) -> Optional[Dict[str, Any]]: def buy_market_offer(self, offer: classes.OfferItem, amount: int = None) -> Optional[Dict[str, Any]]:
if amount is None or amount > offer.amount: if amount is None or amount > offer.amount:
amount = offer.amount amount = offer.amount
traveled = False traveled = False
@ -2734,7 +2735,7 @@ class _Citizen(CitizenAnniversary, CitizenCompanies, CitizenLeaderBoard,
self.buy_tg_contract() self.buy_tg_contract()
else: else:
self.write_warning('Training ground contract active but ' self.write_warning('Training ground contract active but '
f"don't have enough gold ({self.details.gold}g {self.details.cc}cc)") f"don't have enough gold ({self.details.gold}g {self.details.cc}cc)")
if self.energy.is_energy_full and self.config.telegram: if self.energy.is_energy_full and self.config.telegram:
self.telegram.report_full_energy(self.energy.available, self.energy.limit, self.energy.interval) self.telegram.report_full_energy(self.energy.available, self.energy.limit, self.energy.interval)
@ -3170,7 +3171,7 @@ class Citizen(_Citizen):
finally: finally:
self._concurrency_lock.set() self._concurrency_lock.set()
def buy_market_offer(self, offer: OfferItem, amount: int = None) -> Optional[Dict[str, Any]]: def buy_market_offer(self, offer: classes.OfferItem, amount: int = None) -> Optional[Dict[str, Any]]:
if not self._concurrency_lock.wait(self._concurrency_timeout): if not self._concurrency_lock.wait(self._concurrency_timeout):
e = f'Concurrency not freed in {self._concurrency_timeout}sec!' e = f'Concurrency not freed in {self._concurrency_timeout}sec!'
self.report_error(e) self.report_error(e)

View File

@ -3,11 +3,13 @@ import hashlib
import threading import threading
import weakref import weakref
from decimal import Decimal from decimal import Decimal
from typing import Any, Dict, Generator, Iterable, List, NamedTuple, NoReturn, Union, Optional from io import BytesIO
from typing import Any, Dict, Generator, Iterable, List, NamedTuple, NoReturn, Optional, Tuple, Union
from requests import Response, Session, post, HTTPError from requests import HTTPError, Response, Session, post
from . import constants, _types as types, utils from erepublik import _types as types
from erepublik import constants, utils
__all__ = ['Battle', 'BattleDivision', 'BattleSide', 'Company', 'Config', 'Details', 'Energy', 'ErepublikException', __all__ = ['Battle', 'BattleDivision', 'BattleSide', 'Company', 'Config', 'Details', 'Energy', 'ErepublikException',
'ErepublikNetworkException', 'EnergyToFight', 'Holding', 'Inventory', 'MyCompanies', 'OfferItem', 'Politics', 'ErepublikNetworkException', 'EnergyToFight', 'Holding', 'Inventory', 'MyCompanies', 'OfferItem', 'Politics',
@ -627,14 +629,14 @@ class Reporter:
def register_account(self): def register_account(self):
if not self.__registered: if not self.__registered:
r = self._bot_update(dict(key=self.key, check=True, player_id=self.citizen_id)) r = self.__bot_update(dict(key=self.key, check=True, player_id=self.citizen_id))
if r: if r:
if not r.json().get('status'): if not r.json().get('status'):
self._req.post(f"{self.url}/bot/register", json=dict(name=self.name, email=self.email, self._req.post(f"{self.url}/bot/register", json=dict(name=self.name, email=self.email,
player_id=self.citizen_id)) player_id=self.citizen_id))
self.report_action('STARTED', value=utils.now().strftime("%F %T"))
self.__registered = True self.__registered = True
self.allowed = True self.allowed = True
self.report_action('STARTED', value=utils.now().strftime("%F %T"))
def send_state_update(self, xp: int, cc: float, gold: float, inv_total: int, inv: int, def send_state_update(self, xp: int, cc: float, gold: float, inv_total: int, inv: int,
hp_limit: int, hp_interval: int, hp_available: int, food: int, pp: int): hp_limit: int, hp_interval: int, hp_available: int, food: int, pp: int):
@ -967,7 +969,7 @@ class TelegramReporter:
if token is None: if token is None:
token = "864251270:AAFzZZdjspI-kIgJVk4gF3TViGFoHnf8H4o" token = "864251270:AAFzZZdjspI-kIgJVk4gF3TViGFoHnf8H4o"
self.chat_id = chat_id self.chat_id = chat_id
self.api_url = f"https://api.telegram.org/bot{token}/sendMessage" self.api_url = f"https://api.telegram.org/bot{token}"
self.player_name = player_name or "" self.player_name = player_name or ""
self.__initialized = True self.__initialized = True
self._last_time = utils.good_timedelta(utils.now(), datetime.timedelta(minutes=-5)) self._last_time = utils.good_timedelta(utils.now(), datetime.timedelta(minutes=-5))
@ -1024,13 +1026,21 @@ class TelegramReporter:
message = "\n\n".join(self.__queue) message = "\n\n".join(self.__queue)
if self.player_name: if self.player_name:
message = f"Player *{self.player_name}*\n\n" + message message = f"Player *{self.player_name}*\n\n" + message
response = post(self.api_url, json=dict(chat_id=self.chat_id, text=message, parse_mode='Markdown')) response = post(f"{self.api_url}/sendMessage", json=dict(chat_id=self.chat_id, text=message, parse_mode='Markdown'))
self._last_time = utils.now() self._last_time = utils.now()
if response.json().get('ok'): if response.json().get('ok'):
self.__queue.clear() self.__queue.clear()
return True return True
return False return False
def send_photos(self, photos: List[Tuple[str, BytesIO]]):
for photo_title, photo in photos:
photo.seek(0)
post(f"https://{self.api_url}/sendPhoto",
data=dict(chat_id=self.chat_id, caption=photo_title),
files=[('photo', ("f{utils.slugify(photo_title)}.png", photo))])
return
class OfferItem(NamedTuple): class OfferItem(NamedTuple):
price: float = 999_999_999. price: float = 999_999_999.

View File

@ -15,7 +15,7 @@ import pytz
import requests import requests
from requests import Response from requests import Response
from . import __version__, constants from erepublik import __version__, constants
try: try:
import simplejson as json import simplejson as json
@ -255,7 +255,7 @@ def json_dumps(obj, *args, **kwargs):
def b64json(obj: Union[Dict[str, Union[int, List[str]]], List[str]]): def b64json(obj: Union[Dict[str, Union[int, List[str]]], List[str]]):
if isinstance(obj, list): if isinstance(obj, list):
return b64encode(json.dumps(obj).replace(' ', '').encode('utf-8')).decode('utf-8') return b64encode(json.dumps(obj, separators=(',', ':')).encode('utf-8')).decode('utf-8')
elif isinstance(obj, (int, str)): elif isinstance(obj, (int, str)):
return obj return obj
elif isinstance(obj, dict): elif isinstance(obj, dict):
@ -264,7 +264,7 @@ def b64json(obj: Union[Dict[str, Union[int, List[str]]], List[str]]):
else: else:
from .classes import ErepublikException from .classes import ErepublikException
raise ErepublikException(f'Unhandled object type! obj is {type(obj)}') raise ErepublikException(f'Unhandled object type! obj is {type(obj)}')
return b64encode(json.dumps(obj).replace(' ', '').encode('utf-8')).decode('utf-8') return b64encode(json.dumps(obj, separators=(',', ':')).encode('utf-8')).decode('utf-8')
class ErepublikJSONEncoder(json.JSONEncoder): class ErepublikJSONEncoder(json.JSONEncoder):

View File

@ -1,20 +1,21 @@
bump2version==1.0.1 bump2version==1.0.1
coverage==5.4 coverage==5.5
edx-sphinx-theme==1.6.1 edx-sphinx-theme==2.0.0
flake8==3.8.4 flake8==3.8.4
ipython>=7.19.0 ipython>=7.21.0
jedi!=0.18.0 jedi!=0.18.0
isort==5.7.0 isort==5.7.0
pip==21.0 pip==21.0.1
pre-commit==2.9.3 pre-commit==2.10.1
pur==5.3.0 pur==5.3.0
PyInstaller==4.2 PyInstaller==4.2
PySocks==1.7.1 PySocks==1.7.1
pytest==6.2.2 pytest==6.2.2
pytz>=2020.5 pytz==2021.1
requests>=2.25.1 requests==2.25.1
requests-toolbelt==0.9.1
responses==0.12.1 responses==0.12.1
setuptools==52.0.0 setuptools==54.0.0
Sphinx==3.4.3 Sphinx==3.5.1
twine==3.3.0 twine==3.3.0
wheel==0.36.2 wheel==0.36.2

View File

@ -12,9 +12,10 @@ with open('HISTORY.rst') as history_file:
history = history_file.read() history = history_file.read()
requirements = [ requirements = [
'pytz>=2020.0', 'PySocks==1.7.1',
'requests>=2.24.0,<2.26.0', 'pytz==2021.1',
'PySocks==1.7.1' 'requests==2.25.1',
'requests-toolbelt==0.9.1',
] ]
setup_requirements = [] setup_requirements = []