Legacy fight support until 2021-02-08 00:00:00

This commit is contained in:
Eriks K 2021-02-06 12:22:23 +02:00
parent 69b2073b74
commit ce9034ad24

View File

@ -9,7 +9,7 @@ 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 from requests import RequestException, Response, HTTPError
from . import access_points, classes, constants, _types as types, utils from . import access_points, classes, constants, _types as types, utils
from .classes import OfferItem from .classes import OfferItem
@ -270,7 +270,9 @@ class BaseCitizen(access_points.CitizenAPI):
self.report_error('Captcha failed!') self.report_error('Captcha failed!')
captcha_data = self._post_main_session_get_challenge(captcha_id, captcha_data['imageId']).json() captcha_data = self._post_main_session_get_challenge(captcha_id, captcha_data['imageId']).json()
coordinates = self.solve_captcha(captcha_data['src']) coordinates = self.solve_captcha(captcha_data['src'])
if retry < 1:
return False
retry -= 1
return False return False
def refresh_captcha_image(self, captcha_id: int, image_id: str): def refresh_captcha_image(self, captcha_id: int, image_id: str):
@ -1918,82 +1920,102 @@ class CitizenMilitary(CitizenTravel):
self.write_log(f"Fighting in battle for {battle.region_name} on {side} side in d{division.div}") self.write_log(f"Fighting in battle for {battle.region_name} on {side} side in d{division.div}")
total_damage = 0 if self.now < utils.localize_dt(datetime(2021, 2, 8)):
deployment_id = self.deploy(division, side, count * 10) error_count = total_damage = total_hits = 0
self.sleep(count // 3) # TODO: connect to eRepublik's WS and get from there when deploy ends ok_to_fight = True
energy_used = 0 while ok_to_fight and error_count < 10 and count > 0:
if deployment_id: while all((count > 0, error_count < 10, self.energy.recovered >= 50)):
self.write_warning('If erepublik responds with HTTP 500 Internal Error, it is kind of ok, because deployment has not finished yet.') hits, error, damage = self._shoot(battle, division, side)
deployment_data = self._post_military_fight_deploy_deploy_report_data(deployment_id).json() count -= hits
if not deployment_data.get('error'): total_hits += hits
data = deployment_data['data'] total_damage += damage
total_damage = int(data['damage'].replace(',', '')) error_count += error
energy_used = int(data['energySpent'].replace(',', '')) else:
self.details.pp += int(data['rewards']['prestigePoints'].replace(',', '')) self._eat('blue')
self.report_fighting(battle, not side.is_defender, division, total_damage, energy_used // 10) if count > 0 and self.energy.recovered < 50 and use_ebs:
return energy_used 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.report_fighting(battle, not side.is_defender, division, total_damage, total_hits)
return error_count
else:
deployment_id = self.deploy(division, side, count * 10)
self.sleep(count // 3) # TODO: connect to eRepublik's WS and get from there when deploy ends
energy_used = 0
if deployment_id:
self.write_warning('If erepublik responds with HTTP 500 Internal Error, it is kind of ok, because deployment has not finished yet.')
deployment_data = self._post_military_fight_deploy_deploy_report_data(deployment_id).json()
if not deployment_data.get('error'):
data = deployment_data['data']
total_damage = int(data['damage'].replace(',', ''))
energy_used = int(data['energySpent'].replace(',', ''))
self.details.pp += int(data['rewards']['prestigePoints'].replace(',', ''))
self.report_fighting(battle, not side.is_defender, division, total_damage, energy_used // 10)
return energy_used
# def _shoot(self, battle: classes.Battle, division: classes.BattleDivision, side: classes.BattleSide): def _shoot(self, battle: classes.Battle, division: classes.BattleDivision, side: classes.BattleSide):
# if division.is_air: if division.is_air:
# response = self._post_military_fight_air(battle.id, side.id, division.id) response = self._post_military_fight_air(battle.id, side.id, division.id)
# else: else:
# response = self._post_military_fight_ground(battle.id, side.id, division.id) response = self._post_military_fight_ground(battle.id, side.id, division.id)
#
# if 'Zone is not meant for ' in response.text: if 'Zone is not meant for ' in response.text:
# self.sleep(5) self.sleep(5)
# return 0, 1, 0 return 0, 1, 0
# try: try:
# r_json = response.json() r_json = response.json()
# except (ValueError, HTTPError, RequestException): except (ValueError, HTTPError, RequestException):
# return 0, 10, 0 return 0, 10, 0
# hits = 0 hits = 0
# 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': 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.report_warning('Wrong division!!') self.write_warning('Wrong division!!')
# return 0, 10, 0 return 0, 10, 0
# elif r_json.get('message') == 'ZONE_INACTIVE': elif r_json.get('message') == 'ZONE_INACTIVE':
# self.report_warning('Wrong division!!') self.write_warning('Wrong division!!')
# return 0, 10, 0 return 0, 10, 0
# elif r_json.get('message') == 'NON_BELLIGERENT': elif r_json.get('message') == 'NON_BELLIGERENT':
# self.report_warning("Dictatorship/Liberation wars are not supported!") self.write_warning("Dictatorship/Liberation wars are not supported!")
# return 0, 10, 0 return 0, 10, 0
# elif r_json.get('message') in ['FIGHT_DISABLED', 'DEPLOYMENT_MODE']: 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)
# else: else:
# if r_json.get('message') == 'UNKNOWN_SIDE': if r_json.get('message') == 'UNKNOWN_SIDE':
# self._rw_choose_side(battle, side) self._rw_choose_side(battle, side)
# elif r_json.get('message') == 'CHANGE_LOCATION': elif r_json.get('message') == 'CHANGE_LOCATION':
# countries = [side.country] + side.deployed countries = [side.country] + side.deployed
# self.travel_to_battle(battle, countries) self.travel_to_battle(battle, countries)
# err = True err = True
# elif r_json.get('message') == 'ENEMY_KILLED': elif r_json.get('message') == 'ENEMY_KILLED':
# # Non-InfantryKit players # Non-InfantryKit players
# if r_json['user']['earnedXp']: if r_json['user']['earnedXp']:
# hits = r_json['user']['earnedXp'] hits = r_json['user']['earnedXp']
# # InfantryKit player # InfantryKit player
# # The almost always safe way (breaks on levelup hit) # The almost always safe way (breaks on levelup hit)
# elif self.energy.recovered >= r_json['details']['wellness']: # Haven't reached levelup elif self.energy.recovered >= r_json['details']['wellness']: # Haven't reached levelup
# hits = (self.energy.recovered - r_json['details']['wellness']) // 10 hits = (self.energy.recovered - r_json['details']['wellness']) // 10
# else: else:
# hits = r_json['hits'] hits = r_json['hits']
# if r_json['user']['epicBattle']: if r_json['user']['epicBattle']:
# hits /= 1 + r_json['user']['epicBattle'] hits /= 1 + r_json['user']['epicBattle']
#
# self.energy.recovered = r_json['details']['wellness'] self.energy.recovered = r_json['details']['wellness']
# self.details.xp = int(r_json['details']['points']) self.details.xp = int(r_json['details']['points'])
# damage = r_json['user']['givenDamage'] * (1.1 if r_json['oldEnemy']['isNatural'] else 1) damage = r_json['user']['givenDamage'] * (1.1 if r_json['oldEnemy']['isNatural'] else 1)
# else: else:
# err = True err = True
#
# return hits, err, damage return hits, err, damage
def deploy_bomb(self, battle: classes.Battle, division: classes.BattleDivision, bomb_id: int, inv_side: bool, def deploy_bomb(self, battle: classes.Battle, division: classes.BattleDivision, bomb_id: int, inv_side: bool,
count: int = 1) -> Optional[int]: count: int = 1) -> Optional[int]:
@ -2308,8 +2330,7 @@ class CitizenMilitary(CitizenTravel):
# self.buy_food() # self.buy_food()
# return self.get_deploy_inventory(division, side) # return self.get_deploy_inventory(division, side)
if ret.get('captcha'): if ret.get('captcha'):
while not self.do_captcha_challenge(): self.do_captcha_challenge()
self.sleep(5)
if ret.get('error'): if ret.get('error'):
if ret.get('message') == 'Deployment disabled.': if ret.get('message') == 'Deployment disabled.':
self._post_main_profile_update('options', params='{"optionName":"enable_web_deploy","optionValue":"on"}') self._post_main_profile_update('options', params='{"optionName":"enable_web_deploy","optionValue":"on"}')