fight must receive battle id as int, added warnings support

This commit is contained in:
Eriks Karls 2020-01-05 10:53:26 +02:00
parent 700bd8d98e
commit a2447959e7
2 changed files with 65 additions and 32 deletions

View File

@ -1,5 +1,6 @@
import re import re
import sys import sys
import warnings
from collections import defaultdict from collections import defaultdict
from datetime import datetime, timedelta from datetime import datetime, timedelta
from itertools import product from itertools import product
@ -13,6 +14,7 @@ from requests import Response, RequestException
from erepublik.classes import (CitizenAPI, Battle, Reporter, Config, Energy, Details, Politics, MyCompanies, from erepublik.classes import (CitizenAPI, Battle, Reporter, Config, Energy, Details, Politics, MyCompanies,
TelegramBot, ErepublikException, BattleDivision, MyJSONEncoder) TelegramBot, ErepublikException, BattleDivision, MyJSONEncoder)
from erepublik.utils import * from erepublik.utils import *
from erepublik.utils import process_warning
class Citizen(CitizenAPI): class Citizen(CitizenAPI):
@ -41,15 +43,15 @@ class Citizen(CitizenAPI):
eday = 0 eday = 0
energy: Energy energy: Energy = None
details: Details details: Details = None
politics: Politics politics: Politics = None
my_companies: MyCompanies my_companies: MyCompanies = None
reporter: Reporter reporter: Reporter = None
stop_threads: Event stop_threads: Event = None
telegram: TelegramBot telegram: TelegramBot = None
r: Response r: Response = None
name = "Not logged in!" name = "Not logged in!"
debug = False debug = False
__registered = False __registered = False
@ -712,35 +714,35 @@ class Citizen(CitizenAPI):
# CS Battles # CS Battles
elif self.details.citizenship in battle_sides: elif self.details.citizenship in battle_sides:
if battle.is_air: if battle.is_air:
cs_battles_ground.append(battle.id)
else:
cs_battles_air.append(battle.id) cs_battles_air.append(battle.id)
else:
cs_battles_ground.append(battle.id)
# Current location battles: # Current location battles:
elif self.details.current_country in battle_sides: elif self.details.current_country in battle_sides:
if battle.is_air: if battle.is_air:
deployed_battles_ground.append(battle.id)
else:
deployed_battles_air.append(battle.id) deployed_battles_air.append(battle.id)
else:
deployed_battles_ground.append(battle.id)
# Deployed battles and allied battles: # Deployed battles and allied battles:
elif self.details.current_country in battle.invader.allies + battle.defender.allies + battle_sides: elif self.details.current_country in battle.invader.allies + battle.defender.allies + battle_sides:
if self.details.current_country in battle.invader.deployed + battle.defender.deployed: if self.details.current_country in battle.invader.deployed + battle.defender.deployed:
if battle.is_air: if battle.is_air:
deployed_battles_ground.append(battle.id)
else:
deployed_battles_air.append(battle.id) deployed_battles_air.append(battle.id)
else:
deployed_battles_ground.append(battle.id)
# Allied battles: # Allied battles:
else: else:
if battle.is_air: if battle.is_air:
ally_battles_ground.append(battle.id)
else:
ally_battles_air.append(battle.id) ally_battles_air.append(battle.id)
else: else:
if battle.is_air: ally_battles_ground.append(battle.id)
other_battles_ground.append(battle.id)
else: else:
if battle.is_air:
other_battles_air.append(battle.id) other_battles_air.append(battle.id)
else:
other_battles_ground.append(battle.id)
ret_battles += (cs_battles_air + cs_battles_ground + ret_battles += (cs_battles_air + cs_battles_ground +
deployed_battles_air + deployed_battles_ground + deployed_battles_air + deployed_battles_ground +
@ -814,7 +816,7 @@ class Citizen(CitizenAPI):
self.collect_weekly_reward() self.collect_weekly_reward()
break break
def fight(self, battle_id: int, side_id: int = None, count: int = None): def fight(self, battle_id: int, side_id: int = None, count: int = None) -> int:
"""Fight in a battle. """Fight in a battle.
Will auto activate booster and travel if allowed to do it and Will auto activate booster and travel if allowed to do it and
@ -824,6 +826,10 @@ class Citizen(CitizenAPI):
:param count: How many hits to do, if not specified self.should_fight() is called. :param count: How many hits to do, if not specified self.should_fight() is called.
:return: None if no errors while fighting, otherwise error count. :return: None if no errors while fighting, otherwise error count.
""" """
if not isinstance(battle_id, int):
self.report_error(f"WARNINNG! Parameter battle_id should be 'int', but it is '{type(battle_id).__name__}'")
battle_id = int(battle_id)
battle = self.all_battles[battle_id] battle = self.all_battles[battle_id]
zone_id = battle.div[11 if battle.is_air else self.division].battle_zone_id zone_id = battle.div[11 if battle.is_air else self.division].battle_zone_id
if not battle.is_air and self.config.boosters: if not battle.is_air and self.config.boosters:
@ -852,7 +858,6 @@ class Citizen(CitizenAPI):
if total_damage: if total_damage:
self.reporter.report_action("FIGHT", dict(battle=battle_id, side=side_id, dmg=total_damage, self.reporter.report_action("FIGHT", dict(battle=battle_id, side=side_id, dmg=total_damage,
air=battle.is_air, hits=total_hits)) air=battle.is_air, hits=total_hits))
if error_count:
return error_count return error_count
def _shoot(self, battle_id: int, inv_side: bool, zone_id: int): def _shoot(self, battle_id: int, inv_side: bool, zone_id: int):
@ -1142,7 +1147,7 @@ class Citizen(CitizenAPI):
return self._do_wam_and_employee_work(wam_holding_id, employee_companies) return self._do_wam_and_employee_work(wam_holding_id, employee_companies)
else: else:
msg = "I was not able to wam and or employ because:\n{}".format(response) msg = "I was not able to wam and or employ because:\n{}".format(response)
self.reporter.report_action("WORK_WAM_EMPLOYEES", value=msg) self.reporter.report_action("WORK_WAM_EMPLOYEES", response, msg)
self.write_log(msg) self.write_log(msg)
wam_count = self.my_companies.get_total_wam_count() wam_count = self.my_companies.get_total_wam_count()
if wam_count: if wam_count:
@ -1882,7 +1887,7 @@ class Citizen(CitizenAPI):
r'class="join" title="Join"><span>Join</span></a>', html): r'class="join" title="Join"><span>Join</span></a>', html):
battle_id = re.search(r'<a href="//www.erepublik.com/en/military/battlefield/(\d+)" ' battle_id = re.search(r'<a href="//www.erepublik.com/en/military/battlefield/(\d+)" '
r'class="join" title="Join"><span>Join</span></a>', html).group(1) r'class="join" title="Join"><span>Join</span></a>', html).group(1)
ret.update(can_attack=False, battle_id=battle_id) ret.update(can_attack=False, battle_id=int(battle_id))
elif re.search(r'This war is no longer active.', html): elif re.search(r'This war is no longer active.', html):
ret.update(can_attack=False, ended=True) ret.update(can_attack=False, ended=True)
else: else:
@ -2038,8 +2043,11 @@ class Citizen(CitizenAPI):
r = self._post_main_country_post_create(message, max(post_to_wall_as, key=int) if post_to_wall_as else 0) r = self._post_main_country_post_create(message, max(post_to_wall_as, key=int) if post_to_wall_as else 0)
return r.json() return r.json()
def report_error(self, msg: str = ""): def report_error(self, msg: str = "", is_warning: bool = False):
process_error(msg, self.name, sys.exc_info(), self, self.commit_id, False) if is_warning:
process_warning(msg, self.name, sys.exc_info(), self, self.commit_id, None)
else:
process_error(msg, self.name, sys.exc_info(), self, self.commit_id, None)
def get_battle_top_10(self, battle_id: int) -> Dict[int, List[Tuple[int, int]]]: def get_battle_top_10(self, battle_id: int) -> Dict[int, List[Tuple[int, int]]]:
return {} return {}

View File

@ -8,7 +8,7 @@ import time
import traceback import traceback
import unicodedata import unicodedata
from pathlib import Path from pathlib import Path
from typing import Union, Any, List, NoReturn, Mapping from typing import Union, Any, List, NoReturn, Mapping, Optional
import pytz import pytz
import requests import requests
@ -17,7 +17,7 @@ __all__ = ["FOOD_ENERGY", "COMMIT_ID", "COUNTRIES", "erep_tz", 'COUNTRY_LINK',
"now", "localize_dt", "localize_timestamp", "good_timedelta", "eday_from_date", "date_from_eday", "now", "localize_dt", "localize_timestamp", "good_timedelta", "eday_from_date", "date_from_eday",
"get_sleep_seconds", "interactive_sleep", "silent_sleep", "get_sleep_seconds", "interactive_sleep", "silent_sleep",
"write_silent_log", "write_interactive_log", "get_file", "write_file", "write_silent_log", "write_interactive_log", "get_file", "write_file",
"send_email", "normalize_html_json", "process_error", 'report_promo', 'calculate_hit'] "send_email", "normalize_html_json", "process_error", "process_warning", 'report_promo', 'calculate_hit']
FOOD_ENERGY = dict(q1=2, q2=4, q3=6, q4=8, q5=10, q6=12, q7=20) FOOD_ENERGY = dict(q1=2, q2=4, q3=6, q4=8, q5=10, q6=12, q7=20)
COMMIT_ID = "7b92e19" COMMIT_ID = "7b92e19"
@ -288,7 +288,7 @@ def normalize_html_json(js: str) -> str:
def process_error(log_info: str, name: str, exc_info: tuple, citizen=None, commit_id: str = None, def process_error(log_info: str, name: str, exc_info: tuple, citizen=None, commit_id: str = None,
interactive: bool = False): interactive: Optional[bool] = None):
""" """
Process error logging and email sending to developer Process error logging and email sending to developer
:param interactive: Should print interactively :param interactive: Should print interactively
@ -299,19 +299,44 @@ def process_error(log_info: str, name: str, exc_info: tuple, citizen=None, commi
:param commit_id: Code's version by commit id :param commit_id: Code's version by commit id
""" """
type_, value_, traceback_ = exc_info type_, value_, traceback_ = exc_info
bugtrace = [] if not commit_id else ["Commit id: %s" % commit_id, ] content = [log_info]
bugtrace += [str(value_), str(type_), ''.join(traceback.format_tb(traceback_))] if commit_id:
content += ["Commit id: %s" % commit_id]
content += [str(value_), str(type_), ''.join(traceback.format_tb(traceback_))]
if interactive: if interactive:
write_interactive_log(log_info) write_interactive_log(log_info)
else: elif interactive is not None:
write_silent_log(log_info) write_silent_log(log_info)
trace = inspect.trace() trace = inspect.trace()
if trace: if trace:
trace = trace[-1][0].f_locals trace = trace[-1][0].f_locals
else: else:
trace = dict() trace = dict()
send_email(name, bugtrace, citizen, local_vars=trace) send_email(name, content, citizen, local_vars=trace)
def process_warning(log_info: str, name: str, exc_info: tuple, citizen=None, commit_id: str = None):
"""
Process error logging and email sending to developer
:param log_info: String to be written in output
:param name: String Instance name
:param exc_info: tuple output from sys.exc_info()
:param citizen: Citizen instance
:param commit_id: Code's version by commit id
"""
type_, value_, traceback_ = exc_info
content = [log_info]
if commit_id:
content += ["Commit id: %s" % commit_id]
content += [str(value_), str(type_), ''.join(traceback.format_tb(traceback_))]
trace = inspect.trace()
if trace:
trace = trace[-1][0].f_locals
else:
trace = dict()
send_email(name, content, citizen, local_vars=trace)
def report_promo(kind: str, time_untill: datetime.datetime) -> NoReturn: def report_promo(kind: str, time_untill: datetime.datetime) -> NoReturn: