Compare commits

...

13 Commits

Author SHA1 Message Date
a4128b5d89 Bump version: 0.21.5.8 → 0.22.0 2020-10-21 14:46:24 +03:00
22c2a0ffd2 New Features!
Dump session to file!
Load session from file!
2020-10-21 14:45:29 +03:00
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
6 changed files with 91 additions and 32 deletions

1
.gitignore vendored
View File

@ -104,3 +104,4 @@ ENV/
debug/
log/
docs/
*dump.json

View File

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

View File

@ -6,7 +6,7 @@ from decimal import Decimal
from itertools import product
from threading import Event
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
@ -403,6 +403,41 @@ class BaseCitizen(access_points.CitizenAPI):
return_set.add(constants.COUNTRIES[country_data['id']])
return return_set
def dump_instance(self):
filename = f"{self.__class__.__name__}__dump.json"
with open(filename, 'w') as f:
utils.json.dump(dict(email=self.config.email, password=self.config.password,
cookies=self._req.cookies.get_dict(), token=self.token,
user_agent=self._req.headers.get("User-Agent")), f, cls=classes.MyJSONEncoder)
self.write_log(f"Session saved to: '{filename}'")
@classmethod
def load_from_dump(cls, dump_name: str):
with open(dump_name) as f:
data = utils.json.load(f)
player = cls(data['email'], data['password'])
player._req.cookies.update(data['cookies'])
player._req.headers.update({"User-Agent": data['user_agent']})
player._resume_session()
return player
def _resume_session(self):
resp = self._req.get(self.url)
re_name_id = re.search(r'<a data-fblog="profile_avatar" href="/en/citizen/profile/(\d+)" '
r'class="user_avatar" title="(.*?)">', resp.text)
if re_name_id:
self.name = re_name_id.group(2)
self.details.citizen_id = re_name_id.group(1)
self.write_log(f"Resumed as: {self.name}")
if re.search('<div id="accountSecurity" class="it-hurts-when-ip">', resp.text):
self.restricted_ip = True
self.report_error("eRepublik has blacklisted IP. Limited functionality!", True)
self.logged_in = True
self.get_csrf_token()
else:
self._login()
def __str__(self) -> str:
return f"Citizen {self.name}"
@ -683,9 +718,7 @@ class CitizenAnniversary(BaseCitizen):
_write_spin_data(current_cost, r.get('account'),
base.get('prizes').get('prizes').get(str(r.get('result'))).get('tooltip'))
else:
is_cost: Callable[[], bool] = lambda: (max_cost != current_cost if max_cost else True)
is_count: Callable[[], bool] = lambda: (spin_count != current_count if spin_count else True)
while is_cost() or is_count():
while max_cost >= current_cost if max_cost else spin_count >= current_count if spin_count else False:
r = self._spin_wheel_of_loosing(current_cost)
current_count += 1
current_cost = r.get('cost')
@ -694,8 +727,8 @@ class CitizenAnniversary(BaseCitizen):
def _spin_wheel_of_loosing(self, current_cost: int) -> Dict[str, Any]:
r = self._post_main_wheel_of_fortune_spin(current_cost).json()
self.details.cc = r.get('account')
return r.get('result')
self.details.cc = float(Decimal(r.get('account')))
return r
class CitizenTravel(BaseCitizen):
@ -940,8 +973,10 @@ class CitizenEconomy(CitizenTravel):
global_cheapest = self.get_market_offers("house", q)[f"q{q}"]
if global_cheapest.price + 200 < local_cheapest.price:
self._travel(global_cheapest.country)
buy = self.buy_from_market(global_cheapest.offer_id, 1)
if self.travel_to_country(global_cheapest.country):
buy = self.buy_from_market(global_cheapest.offer_id, 1)
else:
buy = {'error': True, 'message': 'Unable to travel!'}
else:
buy = self.buy_from_market(local_cheapest.offer_id, 1)
if buy["error"]:
@ -1347,8 +1382,8 @@ class CitizenMilitary(CitizenTravel):
all_battles[battle_data.get('id')] = classes.Battle(battle_data)
old_all_battles = self.all_battles
self.all_battles = all_battles
for battle in old_all_battles.values():
utils._clear_up_battle_memory(battle)
# for battle in old_all_battles.values():
# utils._clear_up_battle_memory(battle)
def get_battle_for_war(self, war_id: int) -> Optional[classes.Battle]:
self.update_war_info()
@ -1389,6 +1424,7 @@ class CitizenMilitary(CitizenTravel):
try:
if weapon['weaponQuantity'] > 30 and weapon['weaponInfluence'] > weapon_damage:
weapon_quality = int(weapon['weaponId'])
weapon_damage = weapon['weaponInfluence']
except ValueError:
pass
return self.change_weapon(battle, weapon_quality, division)
@ -1687,14 +1723,17 @@ class CitizenMilitary(CitizenTravel):
damage = 0
err = False
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
elif r_json.get("message") == "NOT_ENOUGH_WEAPONS":
self.set_default_weapon(battle, division)
elif r_json.get("message") == "Cannot activate a zone with a non-native division":
self.write_log("Wrong division!!")
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',
params='{"optionName":"enable_web_deploy","optionValue":"off"}')
self.set_default_weapon(battle, division)
@ -1999,15 +2038,16 @@ class CitizenPolitics(BaseCitizen):
self._report_action('POLITIC_PARTY_PRESIDENT', 'Applied for party president elections')
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())
resp = self._get_presidential_elections(country.id, timestamp)
candidates = re.findall(r'class="candidate_info">(.*?)</li>', resp.text, re.S | re.M)
ret = {}
for candidate in candidates:
name = re.search(
r'<a hovercard=1 class="candidate_name" href="//www.erepublik.com/en/citizen/profile/\d+" title="(.*)">',
candidate)
name = re.search(r'<a hovercard=1 class="candidate_name" href="//www.erepublik.com/en/citizen/profile/\d+"'
r' title="(.*)">', candidate)
name = name.group(1)
votes = re.search(r'<span class="votes">(\d+) votes</span>', candidate).group(1)
ret.update({name: int(votes)})
@ -2267,6 +2307,16 @@ class Citizen(CitizenAnniversary, CitizenCompanies, CitizenEconomy, CitizenLeade
if auto_login:
self.login()
@classmethod
def load_from_dump(cls, *args, **kwargs):
with open(f"{cls.__name__}__dump.json") as f:
data = utils.json.load(f)
player = cls(data['email'], data['password'], False)
player._req.cookies.update(data['cookies'])
player._req.headers.update({"User-Agent": data['user_agent']})
player._resume_session()
return player
def config_setup(self, **kwargs):
self.config.reset()
for key, value in kwargs.items():

View File

@ -451,24 +451,25 @@ class Energy:
class Details:
xp = 0
cc = 0
pp = 0
pin = None
gold = 0
xp: int = 0
cc: float = 0
pp: int = 0
pin: str = None
gold: float = 0
next_pp: List[int] = None
citizen_id = 0
citizen_id: int = 0
citizenship: constants.Country
current_region = 0
current_region: int = 0
current_country: constants.Country
residence_region = 0
residence_region: int = 0
residence_country: constants.Country
daily_task_done = False
daily_task_reward = 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, }
daily_task_done: bool = False
daily_task_reward: bool = False
mayhem_skills: Dict[int, int]
def __init__(self):
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
def xp_till_level_up(self):

View File

@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.21.5.3
current_version = 0.22.0
commit = True
tag = True
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:
history = history_file.read()
requirements = ['pytz==2020.1', 'requests==2.24.0', 'PySocks==1.7.1']
requirements = [
'pytz==2020.1',
'requests==2.24.0',
'PySocks==1.7.1'
]
setup_requirements = []
test_requirements = []
test_requirements = [
"pytest==6.1.0",
"responses==0.12.0"
]
setup(
author="Eriks Karls",
@ -43,6 +50,6 @@ setup(
test_suite='tests',
tests_require=test_requirements,
url='https://github.com/eeriks/erepublik/',
version='0.21.5.3',
version='0.22.0',
zip_safe=False,
)