Compare commits

...

18 Commits

Author SHA1 Message Date
38f0335354 Bump version: 0.21.5.7 → 0.21.5.8 2020-10-07 09:22:01 +03:00
889435b94e House renewal bugfix 2020-10-07 09:21:36 +03:00
bb16c27674 Bump version: 0.21.5.6 → 0.21.5.7 2020-10-06 12:35:19 +03:00
963d7ca11a bugfix 2020-10-06 12:35:14 +03:00
36c7fefdf7 Bump version: 0.21.5.5 → 0.21.5.6 2020-09-30 08:40:14 +03:00
d9fa30b06e bugfix in default weapon switch 2020-09-30 08:35:35 +03:00
b53dc447f4 switch to deploy 2020-09-30 08:13:36 +03:00
233d8d83f8 Bump version: 0.21.5.4 → 0.21.5.5 2020-09-29 18:02:52 +03:00
ec62d90aa2 wheeloffortune bugfix 2020-09-29 18:02:52 +03:00
0c433a56da Bump version: 0.21.5.3 → 0.21.5.4 2020-09-29 17:38:44 +03:00
ad24338f4d wheeloffortune bugfix 2020-09-29 17:38:26 +03:00
6f4bc65d1b Bump version: 0.21.5.2 → 0.21.5.3 2020-09-29 17:21:00 +03:00
cc09ba7ee7 wheeloffortune argument bugfix 2020-09-29 17:20:53 +03:00
9e1166a460 Bump version: 0.21.5.1 → 0.21.5.2 2020-09-29 17:17:07 +03:00
fb0042c00d wheeloffortune url bugfix 2020-09-29 17:17:00 +03:00
bb800578e7 Bump version: 0.21.5 → 0.21.5.1 2020-09-29 15:06:39 +03:00
7025f750dc PySocks as requirement 2020-09-29 15:06:30 +03:00
bf77f21b60 MyCompanies export as dict optimised 2020-09-29 15:04:51 +03:00
7 changed files with 70 additions and 43 deletions

View File

@ -4,7 +4,7 @@
__author__ = """Eriks Karls""" __author__ = """Eriks Karls"""
__email__ = 'eriks@72.lv' __email__ = 'eriks@72.lv'
__version__ = '0.21.5' __version__ = '0.21.5.8'
from erepublik import classes, utils, constants from erepublik import classes, utils, constants
from erepublik.citizen import Citizen from erepublik.citizen import Citizen

View File

@ -164,10 +164,10 @@ class ErepublikAnniversaryAPI(CitizenBaseAPI):
return self.post(f"{self.url}/main/map-rewards-claim", data=data) return self.post(f"{self.url}/main/map-rewards-claim", data=data)
def _post_main_wheel_of_fortune_spin(self, cost) -> Response: def _post_main_wheel_of_fortune_spin(self, cost) -> Response:
return self.post(f"{self.url}/wheeloffortune-spin", data={'_token': self.token, "cost": cost}) return self.post(f"{self.url}/main/wheeloffortune-spin", data={'_token': self.token, "_currentCost": cost})
def _post_main_wheel_of_fortune_build(self) -> Response: def _post_main_wheel_of_fortune_build(self) -> Response:
return self.post(f"{self.url}/wheeloffortune-build", data={'_token': self.token}) return self.post(f"{self.url}/main/wheeloffortune-build", data={'_token': self.token})
class ErepublikArticleAPI(CitizenBaseAPI): class ErepublikArticleAPI(CitizenBaseAPI):

View File

@ -6,7 +6,7 @@ from decimal import Decimal
from itertools import product from itertools import product
from threading import Event from threading import Event
from time import sleep from time import sleep
from typing import Any, Callable, Dict, List, NoReturn, Optional, Set, Tuple, Union from typing import Any, Dict, List, NoReturn, Optional, Set, Tuple, Union
from requests import HTTPError, RequestException, Response from requests import HTTPError, RequestException, Response
@ -683,9 +683,7 @@ class CitizenAnniversary(BaseCitizen):
_write_spin_data(current_cost, r.get('account'), _write_spin_data(current_cost, r.get('account'),
base.get('prizes').get('prizes').get(str(r.get('result'))).get('tooltip')) base.get('prizes').get('prizes').get(str(r.get('result'))).get('tooltip'))
else: else:
is_cost: Callable[[], bool] = lambda: (max_cost != current_cost if max_cost else True) while max_cost >= current_cost if max_cost else spin_count >= current_count if spin_count else False:
is_count: Callable[[], bool] = lambda: (spin_count != current_count if spin_count else True)
while is_cost() or is_count():
r = self._spin_wheel_of_loosing(current_cost) r = self._spin_wheel_of_loosing(current_cost)
current_count += 1 current_count += 1
current_cost = r.get('cost') current_cost = r.get('cost')
@ -694,8 +692,8 @@ class CitizenAnniversary(BaseCitizen):
def _spin_wheel_of_loosing(self, current_cost: int) -> Dict[str, Any]: def _spin_wheel_of_loosing(self, current_cost: int) -> Dict[str, Any]:
r = self._post_main_wheel_of_fortune_spin(current_cost).json() r = self._post_main_wheel_of_fortune_spin(current_cost).json()
self.details.cc = r.get('account') self.details.cc = float(Decimal(r.get('account')))
return r.get('result') return r
class CitizenTravel(BaseCitizen): class CitizenTravel(BaseCitizen):
@ -940,8 +938,10 @@ class CitizenEconomy(CitizenTravel):
global_cheapest = self.get_market_offers("house", q)[f"q{q}"] global_cheapest = self.get_market_offers("house", q)[f"q{q}"]
if global_cheapest.price + 200 < local_cheapest.price: if global_cheapest.price + 200 < local_cheapest.price:
self._travel(global_cheapest.country) if self.travel_to_country(global_cheapest.country):
buy = self.buy_from_market(global_cheapest.offer_id, 1) buy = self.buy_from_market(global_cheapest.offer_id, 1)
else:
buy = {'error': True, 'message': 'Unable to travel!'}
else: else:
buy = self.buy_from_market(local_cheapest.offer_id, 1) buy = self.buy_from_market(local_cheapest.offer_id, 1)
if buy["error"]: if buy["error"]:
@ -1389,6 +1389,7 @@ class CitizenMilitary(CitizenTravel):
try: try:
if weapon['weaponQuantity'] > 30 and weapon['weaponInfluence'] > weapon_damage: if weapon['weaponQuantity'] > 30 and weapon['weaponInfluence'] > weapon_damage:
weapon_quality = int(weapon['weaponId']) weapon_quality = int(weapon['weaponId'])
weapon_damage = weapon['weaponInfluence']
except ValueError: except ValueError:
pass pass
return self.change_weapon(battle, weapon_quality, division) return self.change_weapon(battle, weapon_quality, division)
@ -1687,14 +1688,17 @@ class CitizenMilitary(CitizenTravel):
damage = 0 damage = 0
err = False err = False
if r_json.get("error"): if r_json.get("error"):
if r_json.get("message") == "SHOOT_LOCKOUT" or r_json.get("message") == "ZONE_INACTIVE": if r_json.get("message") == "SHOOT_LOCKOUT":
pass pass
elif r_json.get("message") == "NOT_ENOUGH_WEAPONS": elif r_json.get("message") == "NOT_ENOUGH_WEAPONS":
self.set_default_weapon(battle, division) self.set_default_weapon(battle, division)
elif r_json.get("message") == "Cannot activate a zone with a non-native division": elif r_json.get("message") == "Cannot activate a zone with a non-native division":
self.write_log("Wrong division!!") self.write_log("Wrong division!!")
return 0, 10, 0 return 0, 10, 0
elif r_json.get("message") == "FIGHT_DISABLED": elif r_json.get("message") == "ZONE_INACTIVE":
self.write_log("Wrong division!!")
return 0, 10, 0
elif r_json.get("message") in ["FIGHT_DISABLED", "DEPLOYMENT_MODE"]:
self._post_main_profile_update('options', self._post_main_profile_update('options',
params='{"optionName":"enable_web_deploy","optionValue":"off"}') params='{"optionName":"enable_web_deploy","optionValue":"off"}')
self.set_default_weapon(battle, division) self.set_default_weapon(battle, division)
@ -1999,7 +2003,8 @@ class CitizenPolitics(BaseCitizen):
self._report_action('POLITIC_PARTY_PRESIDENT', 'Applied for party president elections') self._report_action('POLITIC_PARTY_PRESIDENT', 'Applied for party president elections')
return self._get_candidate_party(self.politics.party_slug) return self._get_candidate_party(self.politics.party_slug)
def get_country_president_election_result(self, country: constants.Country, year: int, month: int) -> Dict[str, int]: def get_country_president_election_result(self, country: constants.Country, year: int, month: int) -> Dict[
str, int]:
timestamp = int(constants.erep_tz.localize(datetime(year, month, 5)).timestamp()) timestamp = int(constants.erep_tz.localize(datetime(year, month, 5)).timestamp())
resp = self._get_presidential_elections(country.id, timestamp) resp = self._get_presidential_elections(country.id, timestamp)
candidates = re.findall(r'class="candidate_info">(.*?)</li>', resp.text, re.S | re.M) candidates = re.findall(r'class="candidate_info">(.*?)</li>', resp.text, re.S | re.M)

View File

@ -3,7 +3,7 @@ import hashlib
import threading import threading
import weakref import weakref
from decimal import Decimal from decimal import Decimal
from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Union from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Union, NoReturn
from requests import Response, Session, post from requests import Response, Session, post
@ -28,13 +28,23 @@ class Holding:
id: int id: int
region: int region: int
companies: List["Company"] companies: List["Company"]
name: str
_citizen = weakref.ReferenceType _citizen = weakref.ReferenceType
def __init__(self, _id: int, region: int, citizen): def __init__(self, _id: int, region: int, citizen, name: str = None):
self._citizen = weakref.ref(citizen) self._citizen = weakref.ref(citizen)
self.id: int = _id self.id: int = _id
self.region: int = region self.region: int = region
self.companies: List["Company"] = list() self.companies: List["Company"] = list()
if name:
self.name = name
else:
name = f"Holding (#{self.id}) with {len(self.companies)} "
if len(self.companies) == 1:
name += "company"
else:
name += "companies"
self.name = name
@property @property
def wam_count(self) -> int: def wam_count(self) -> int:
@ -48,7 +58,7 @@ class Holding:
def employable_companies(self) -> List["Company"]: def employable_companies(self) -> List["Company"]:
return [company for company in self.companies if company.preset_works] return [company for company in self.companies if company.preset_works]
def add_company(self, company: "Company"): def add_company(self, company: "Company") -> NoReturn:
self.companies.append(company) self.companies.append(company)
self.companies.sort() self.companies.sort()
@ -62,7 +72,7 @@ class Holding:
wrm += company.raw_usage wrm += company.raw_usage
return dict(frm=frm, wrm=wrm) return dict(frm=frm, wrm=wrm)
def get_wam_companies(self, raw_factory: bool = None): def get_wam_companies(self, raw_factory: bool = None) -> Optional[List["Company"]]:
raw = [] raw = []
factory = [] factory = []
for company in self.wam_companies: for company in self.wam_companies:
@ -80,7 +90,7 @@ class Holding:
else: else:
raise ErepublikException("raw_factory should be True/False/None") raise ErepublikException("raw_factory should be True/False/None")
def __str__(self): def __str__(self) -> str:
name = f"Holding (#{self.id}) with {len(self.companies)} " name = f"Holding (#{self.id}) with {len(self.companies)} "
if len(self.companies) % 10 == 1: if len(self.companies) % 10 == 1:
name += "company" name += "company"
@ -92,8 +102,9 @@ class Holding:
return str(self) return str(self)
@property @property
def as_dict(self): def as_dict(self) -> Dict[str, Union[str, int, List[Dict[str, Union[str, int, bool, float, Decimal]]]]]:
return dict(name=str(self), id=self.id, region=self.region, companies=self.companies, wam_count=self.wam_count) return dict(name=self.name, id=self.id, region=self.region,
companies=[c.as_dict for c in self.companies], wam_count=self.wam_count)
@property @property
def citizen(self): def citizen(self):
@ -203,7 +214,7 @@ class Company:
return str(self) return str(self)
@property @property
def as_dict(self): def as_dict(self) -> Dict[str, Union[str, int, bool, float, Decimal]]:
return dict(name=str(self), holding=self.holding.id, id=self.id, quality=self.quality, is_raw=self.is_raw, return dict(name=str(self), holding=self.holding.id, id=self.id, quality=self.quality, is_raw=self.is_raw,
raw_usage=self.raw_usage, products_made=self.products_made, wam_enabled=self.wam_enabled, raw_usage=self.raw_usage, products_made=self.products_made, wam_enabled=self.wam_enabled,
can_wam=self.can_wam, cannot_wam_reason=self.cannot_wam_reason, industry=self.industry, can_wam=self.can_wam, cannot_wam_reason=self.cannot_wam_reason, industry=self.industry,
@ -219,7 +230,7 @@ class Company:
return self.holding.citizen._post_economy_upgrade_company(self.id, level, self.holding.citizen.details.pin) return self.holding.citizen._post_economy_upgrade_company(self.id, level, self.holding.citizen.details.pin)
@property @property
def holding(self): def holding(self) -> Holding:
return self._holding() return self._holding()
@ -245,10 +256,10 @@ class MyCompanies:
for holding in holdings.values(): for holding in holdings.values():
if holding.get('id') not in self.holdings: if holding.get('id') not in self.holdings:
self.holdings.update({ self.holdings.update({
int(holding.get('id')): Holding(holding['id'], holding['region_id'], self.citizen) int(holding.get('id')): Holding(holding['id'], holding['region_id'], self.citizen, holding['name'])
}) })
if not self.holdings.get(0): if not self.holdings.get(0):
self.holdings.update({0: Holding(0, 0, self.citizen)}) # unassigned self.holdings.update({0: Holding(0, 0, self.citizen, 'Unassigned')}) # unassigned
def prepare_companies(self, companies: Dict[str, Dict[str, Any]]): def prepare_companies(self, companies: Dict[str, Dict[str, Any]]):
""" """
@ -300,9 +311,11 @@ class MyCompanies:
self.companies.clear() self.companies.clear()
@property @property
def as_dict(self): def as_dict(self) -> Dict[str, Union[str, int, datetime.datetime, Dict[str, Dict[str, Union[str, int, List[Dict[str, Union[str, int, bool, float, Decimal]]]]]]]]:
return dict(name=str(self), work_units=self.work_units, next_ot_time=self.next_ot_time, return dict(name=str(self), work_units=self.work_units, next_ot_time=self.next_ot_time,
ff_lockdown=self.ff_lockdown, holdings=self.holdings, company_count=len(self.companies)) ff_lockdown=self.ff_lockdown,
holdings={str(hi): h.as_dict for hi, h in self.holdings.items()},
company_count=len(self.companies))
@property @property
def citizen(self): def citizen(self):
@ -438,24 +451,25 @@ class Energy:
class Details: class Details:
xp = 0 xp: int = 0
cc = 0 cc: float = 0
pp = 0 pp: int = 0
pin = None pin: str = None
gold = 0 gold: float = 0
next_pp: List[int] = None next_pp: List[int] = None
citizen_id = 0 citizen_id: int = 0
citizenship: constants.Country citizenship: constants.Country
current_region = 0 current_region: int = 0
current_country: constants.Country current_country: constants.Country
residence_region = 0 residence_region: int = 0
residence_country: constants.Country residence_country: constants.Country
daily_task_done = False daily_task_done: bool = False
daily_task_reward = False daily_task_reward: bool = False
mayhem_skills = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, } mayhem_skills: Dict[int, int]
def __init__(self): def __init__(self):
self.next_pp = [] self.next_pp = []
self.mayhem_skills = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0}
@property @property
def xp_till_level_up(self): def xp_till_level_up(self):

View File

@ -11,7 +11,8 @@ pytest==6.1.0
responses==0.12.0 responses==0.12.0
setuptools==50.3.0 setuptools==50.3.0
Sphinx==3.2.1 Sphinx==3.2.1
requests[socks]==2.24.0 requests==2.24.0
PySocks==1.7.1
tox==3.20.0 tox==3.20.0
twine==3.2.0 twine==3.2.0
watchdog==0.10.3 watchdog==0.10.3

View File

@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 0.21.5 current_version = 0.21.5.8
commit = True commit = True
tag = True tag = True
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\.?(?P<dev>\d+)? parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\.?(?P<dev>\d+)?

View File

@ -11,11 +11,18 @@ with open('README.rst') as readme_file:
with open('HISTORY.rst') as history_file: with open('HISTORY.rst') as history_file:
history = history_file.read() history = history_file.read()
requirements = ['pytz==2020.1', 'requests[socks]==2.24.0'] requirements = [
'pytz==2020.1',
'requests==2.24.0',
'PySocks==1.7.1'
]
setup_requirements = [] setup_requirements = []
test_requirements = [] test_requirements = [
"pytest==6.1.0",
"responses==0.12.0"
]
setup( setup(
author="Eriks Karls", author="Eriks Karls",
@ -43,6 +50,6 @@ setup(
test_suite='tests', test_suite='tests',
tests_require=test_requirements, tests_require=test_requirements,
url='https://github.com/eeriks/erepublik/', url='https://github.com/eeriks/erepublik/',
version='0.21.5', version='0.21.5.8',
zip_safe=False, zip_safe=False,
) )