67 lines
2.8 KiB
Python
67 lines
2.8 KiB
Python
import datetime
|
|
from operator import itemgetter
|
|
from typing import Union, Dict, Any, Generator, Tuple, List
|
|
|
|
from dbot.constants import UTF_FLAG
|
|
|
|
|
|
def timestamp_to_datetime(timestamp: int) -> datetime.datetime:
|
|
return datetime.datetime.fromtimestamp(timestamp)
|
|
|
|
|
|
def timestamp() -> int:
|
|
return int(datetime.datetime.now().timestamp())
|
|
|
|
|
|
def s_to_human(seconds: Union[int, float]) -> str:
|
|
seconds = int(seconds)
|
|
h = seconds // 3600
|
|
m = (seconds - (h * 3600)) // 60
|
|
s = seconds % 60
|
|
return f"{h:01d}:{m:02d}:{s:02d}"
|
|
|
|
|
|
def check_battles(battle_json: Dict[str, Dict[str, Any]]) -> Generator[Tuple[str, int, Dict[str, Union[str, List[str], int, Dict[str, Union[str, int]]]]], None, None]:
|
|
for battle in sorted(battle_json.values(), key=itemgetter("start")):
|
|
if battle["start"] > timestamp():
|
|
continue
|
|
region_name = battle["region"]["name"]
|
|
invader_flag = UTF_FLAG[battle["inv"]["id"]]
|
|
defender_flag = UTF_FLAG[battle["def"]["id"]]
|
|
for div in battle["div"].values():
|
|
if div['end']:
|
|
continue
|
|
division = div['div']
|
|
dom = div["wall"]["dom"]
|
|
epic = div["epic"]
|
|
division_meta_data = dict(
|
|
region=region_name,
|
|
round_time=s_to_human(timestamp() - battle["start"]),
|
|
round_time_s=int(timestamp() - battle["start"]),
|
|
sides=[],
|
|
url=f"https://www.erepublik.com/en/military/battlefield/{battle['id']}",
|
|
zone_id=battle["zone_id"],
|
|
div_id=div['id'],
|
|
extra={}
|
|
)
|
|
if dom == 50:
|
|
division_meta_data.update(sides=[invader_flag, defender_flag])
|
|
yield 'empty', division, division_meta_data
|
|
division_meta_data['sides'].clear()
|
|
if dom == 100:
|
|
division_meta_data.update(sides=[invader_flag if battle["def"]["id"] == div["wall"]["for"] else defender_flag])
|
|
yield 'empty', division, division_meta_data
|
|
division_meta_data['sides'].clear()
|
|
if epic > 1:
|
|
division_meta_data.update(sides=[invader_flag, defender_flag])
|
|
division_meta_data['extra'].update(intensity_scale=div['intensity_scale'],
|
|
epic_type=epic)
|
|
yield 'epic', division, division_meta_data
|
|
division_meta_data['sides'].clear()
|
|
division_meta_data['extra'].clear()
|
|
if dom >= 66.8:
|
|
division_meta_data.update(sides=[invader_flag if battle["def"]["id"] == div["wall"]["for"] else defender_flag])
|
|
yield 'steal', division, division_meta_data
|
|
division_meta_data['sides'].clear()
|
|
return
|