Compare commits

...

10 Commits

6 changed files with 68 additions and 33 deletions

View File

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

View File

@ -288,8 +288,9 @@ class BaseCitizen(access_points.CitizenAPI):
if item_data.get('attributes').get('expirationInfo'):
expire_info = item_data.get('attributes').get('expirationInfo')
expiration_info = [_expire_value_to_python(v) for v in expire_info['value']]
icon = item_data['icon'] if item_data[
'icon'] else "//www.erepublik.net/images/modules/manager/tab_storage.png"
if not item_data.get('icon') and item_data.get('isPackBooster'):
item_data['icon'] = f"//www.erepublik.com/images/icons/boosters/52px/{item_data.get('type')}.png"
icon = item_data['icon'] if item_data['icon'] else "//www.erepublik.net/images/modules/manager/tab_storage.png"
inv_item: types.InvFinalItem = dict(
name=item_data.get("name"), time_left=item_data['active']['time_left'], icon=icon,
kind=kind, expiration=expiration_info, quality=item_data.get("quality", 0)
@ -340,6 +341,9 @@ class BaseCitizen(access_points.CitizenAPI):
elif q == 15:
self.eb_small += amount
item_data.update(token='energy_bar')
elif q == 16:
self.eb_small += amount
item_data.update(token='energy_bar')
kind = re.sub(r'_q\d\d*', "", item_data.get('token'))
if item_data.get('token', "") == "house_q100":
@ -689,6 +693,10 @@ class BaseCitizen(access_points.CitizenAPI):
self.eb_double -= amount
elif q == "12":
self.eb_small -= amount
elif q == "15":
self.eb_small -= amount
elif q == "16":
self.eb_small -= amount
next_recovery = r_json.get("food_remaining_reset").split(":")
self.energy.set_reference_time(
utils.good_timedelta(self.now, timedelta(seconds=int(next_recovery[1]) * 60 + int(next_recovery[2])))
@ -1363,7 +1371,7 @@ class CitizenEconomy(CitizenTravel):
self.update_money()
cur = "g" if currency == 62 else "cc"
if success:
self._report_action("DONATE_MONEY", f"Successfully donated {amount}{cur} to citizen with id {citizen_id}!")
self.report_money_donation(citizen_id, amount, currency == 1)
else:
self._report_action("DONATE_MONEY", f"Unable to donate {amount}{cur}!")
return success
@ -1447,6 +1455,16 @@ class CitizenEconomy(CitizenTravel):
f" treasury", kwargs=r.json())
return False
def report_money_donation(self, citizen_id: int, amount: float, is_currency: bool = True):
self.reporter.report_money_donation(citizen_id, amount, is_currency)
if self.config.telegram:
self.telegram.report_money_donation(citizen_id, amount, is_currency)
def report_item_donation(self, citizen_id: int, amount: float, quality: int, industry: str):
self.reporter.report_item_donation(citizen_id, amount, quality, industry)
if self.config.telegram:
self.telegram.report_item_donation(citizen_id, amount, f"{industry} q{quality}")
class CitizenLeaderBoard(BaseCitizen):
def get_aircraft_damage_rankings(self, country: int, weeks: int = 0, mu: int = 0) -> Dict[str, any]:
@ -1527,7 +1545,6 @@ class CitizenMedia(BaseCitizen):
class CitizenMilitary(CitizenTravel):
all_battles: Dict[int, classes.Battle] = None
countries: Dict[int, Dict[str, Union[str, List[int]]]] = None
__last_war_update_data = None
active_fs: bool = False
@ -1542,17 +1559,6 @@ class CitizenMilitary(CitizenTravel):
if r_json.get("countries"):
if self.all_battles is None:
self.all_battles = {}
if self.countries is None:
self.countries = {}
countries = {}
for c_id, c_data in r_json.get("countries").items():
if int(c_id) not in countries:
countries.update({
int(c_id): {"name": c_data.get("name"), "allies": c_data.get("allies")}
})
else:
countries[int(c_id)].update(allies=c_data.get("allies"))
self.countries = countries
self.__last_war_update_data = r_json
if r_json.get("battles"):
all_battles = {}
@ -1806,19 +1812,21 @@ class CitizenMilitary(CitizenTravel):
@utils.wait_for_lock
def fight(self, battle: classes.Battle, division: classes.BattleDivision, side: classes.BattleSide = None,
count: int = None) -> Optional[int]:
count: int = None, use_ebs: bool = False) -> Optional[int]:
"""Fight in a battle.
Will auto activate booster and travel if allowed to do it.
:param battle: Battle battle to fight in
:type battle: Battle
:param division: Division number to fight in available choices
:type division: BattleDivision
:param side: BattleSide or None. Battle side to fight in, If side not == invader id or not in invader deployed
allies list, then defender's side is chosen
:type side: BattleSide
:param count: How many hits to do, if not specified self.should_fight() is called.
:type count: int
:param division: Division number to fight in available choices
:type division: BattleDivision
:param use_ebs: Should use energy bars if count > 0 and not enough food_fights
:type use_ebs: bool
:return: None if no errors while fighting, otherwise error count.
:rtype: int
"""
@ -1848,15 +1856,13 @@ class CitizenMilitary(CitizenTravel):
error_count += error
else:
self._eat('blue')
if count > 0 and self.energy.recovered < 50 and use_ebs:
self._eat('orange')
if self.energy.recovered < 50 or error_count >= 10 or count <= 0:
self.write_log(f"Hits: {total_hits:>4} | Damage: {total_damage}")
ok_to_fight = False
if total_damage:
self.reporter.report_fighting(battle, not side.is_defender, division, total_damage, total_hits)
# self.reporter.report_action('FIGHT', dict(battle_id=battle.id, side=side, dmg=total_damage,
# air=battle.has_air, hits=total_hits,
# round=battle.zone_id,
# extra=dict(battle=battle, side=side)))
self.report_fighting(battle, not side.is_defender, division, total_damage, total_hits)
return error_count
def _shoot(self, battle: classes.Battle, division: classes.BattleDivision, side: classes.BattleSide):
@ -2019,7 +2025,7 @@ class CitizenMilitary(CitizenTravel):
return utils.calculate_hit(0, rang, True, elite, ne, 0, 20 if weapon else 0)
def activate_damage_booster(self, ground: bool = True) -> int:
kind = 'damageBoosters' if ground else 'aircraftDamageBoosters'
kind = 'damage' if ground else 'aircraftDamage'
if self.config.boosters and not self.get_active_damage_booster(ground):
booster: Optional[types.InvFinalItem] = None
for quality, data in sorted(self.inventory.boosters.get(kind, {}).items(), key=lambda x: x[0]):
@ -2037,7 +2043,7 @@ class CitizenMilitary(CitizenTravel):
return self.get_active_damage_booster(ground)
def get_active_damage_booster(self, ground: bool = True) -> int:
kind = 'damageBoosters' if ground else 'aircraftDamageBoosters'
kind = 'damage' if ground else 'aircraftDamage'
boosters = self.inventory.active.get(kind, {})
quality = 0
for q, boost in boosters.items():
@ -2221,6 +2227,11 @@ class CitizenMilitary(CitizenTravel):
if division.wall['dom'] == 50 or division.wall['dom'] > 98:
yield division, division.wall['for'] == battle.invader.country.id
def report_fighting(self, battle: classes.Battle, invader: bool, division: classes.BattleDivision, damage: float, hits: int):
self.reporter.report_fighting(battle, invader, division, damage, hits)
if self.config.telegram:
self.telegram.report_fight(battle, invader, division, damage, hits)
class CitizenPolitics(BaseCitizen):
def get_country_parties(self, country: constants.Country = None) -> dict:

View File

@ -650,6 +650,16 @@ class Reporter:
air=battle.has_air, hits=hits,
round=battle.zone_id, extra=dict(battle=battle, side=side, division=division)))
def report_money_donation(self, citizen_id: int, amount: float, is_currency: bool = True):
cur = 'cc' if is_currency else 'gold'
self.report_action('DONATE_MONEY', dict(citizen_id=citizen_id, amount=amount, currency=cur),
f"Successfully donated {amount}{cur} to citizen with id {citizen_id}!")
def report_item_donation(self, citizen_id: int, amount: float, quality: int, industry: str):
self.report_action('DONATE_ITEMS',
dict(citizen_id=citizen_id, amount=amount, quality=quality, industry=industry),
f"Successfully donated {amount} x {industry} q{quality} to citizen with id {citizen_id}!")
def report_promo(self, kind: str, time_until: datetime.datetime):
self._req.post(f"{self.url}/promos/add/", data=dict(kind=kind, time_untill=time_until))
@ -974,7 +984,7 @@ class TelegramReporter:
self._last_time = utils.good_timedelta(utils.now(), datetime.timedelta(minutes=-5))
self._last_full_energy_report = utils.good_timedelta(utils.now(), datetime.timedelta(minutes=-30))
if self.__queue:
self.send_message("\n\n\n\n".join(self.__queue))
self.send_message("Telegram initialized")
def send_message(self, message: str) -> bool:
self.__queue.append(message)
@ -1002,15 +1012,29 @@ class TelegramReporter:
new_line = '\n' if multiple else ''
self.send_message(f"New award: {new_line}*{msg}*")
def report_fight(self, battle: "Battle", invader: bool, division: "BattleDivision", damage: float, hits: int):
side_txt = (battle.invader if invader else battle.defender).country.iso
self.send_message(f"*Fight report*:\n{int(damage):,d} dmg ({hits} hits) in"
f" [battle {battle.id} for {battle.region_name[:16]}]({battle.link}) in d{division.div} on "
f"{side_txt} side")
def report_item_donation(self, citizen_id: int, amount: float, product: str):
self.send_message(f"*Donation*: {amount} x {product} to citizen "
f"[{citizen_id}](https://www.erepublik.com/en/citizen/profile/{citizen_id})")
def report_money_donation(self, citizen_id: int, amount: float, is_currency: bool = True):
self.send_message(f"*Donation*: {amount}{'cc' if is_currency else 'gold'} to citizen "
f"[{citizen_id}](https://www.erepublik.com/en/citizen/profile/{citizen_id})")
def __send_messages(self):
while self._next_time > utils.now():
if self.__thread_stopper.is_set():
break
self.__thread_stopper.wait(utils.get_sleep_seconds(self._next_time))
message = "\n\n\n\n".join(self.__queue)
message = "\n\n".join(self.__queue)
if self.player_name:
message = f"Player *{self.player_name}*\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"))
self._last_time = utils.now()
if response.json().get('ok'):

View File

@ -13,7 +13,7 @@ pytest==6.2.1
pytz>=2020.5
requests>=2.25.1
responses==0.12.1
setuptools==51.1.1
Sphinx==3.4.2
setuptools==51.1.2
Sphinx==3.4.3
twine==3.3.0
wheel==0.36.2

View File

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

View File

@ -50,6 +50,6 @@ setup(
test_suite='tests',
tests_require=test_requirements,
url='https://github.com/eeriks/erepublik/',
version='0.23.4.6',
version='0.23.4.9',
zip_safe=False,
)