Telegram integration
This commit is contained in:
parent
8db4ab1f0f
commit
20bba4b9f9
@ -11,6 +11,7 @@ import requests
|
|||||||
from requests import Response, RequestException
|
from requests import Response, RequestException
|
||||||
|
|
||||||
from erepublik import classes, utils
|
from erepublik import classes, utils
|
||||||
|
from erepublik.classes import TelegramBot
|
||||||
|
|
||||||
|
|
||||||
class Citizen(classes.CitizenAPI):
|
class Citizen(classes.CitizenAPI):
|
||||||
@ -49,8 +50,9 @@ class Citizen(classes.CitizenAPI):
|
|||||||
debug = False
|
debug = False
|
||||||
__registered = False
|
__registered = False
|
||||||
logged_in = False
|
logged_in = False
|
||||||
|
telegram = None
|
||||||
|
|
||||||
def __init__(self, email: str = "", password: str = "", auto_login: bool = True):
|
def __init__(self, email: str = "", password: str = "", auto_login: bool = True, telegram: Dict[str, Any] = None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.commit_id = utils.COMMIT_ID
|
self.commit_id = utils.COMMIT_ID
|
||||||
self.config = classes.Config()
|
self.config = classes.Config()
|
||||||
@ -66,6 +68,11 @@ class Citizen(classes.CitizenAPI):
|
|||||||
if auto_login:
|
if auto_login:
|
||||||
self.login()
|
self.login()
|
||||||
|
|
||||||
|
if telegram is None:
|
||||||
|
self.telegram = TelegramBot(620981703, "864251270:AAFzZZdjspI-kIgJVk4gF3TViGFoHnf8H4o", self.name)
|
||||||
|
else:
|
||||||
|
self.telegram = TelegramBot(telegram['chat_id'], telegram['token'])
|
||||||
|
|
||||||
def login(self):
|
def login(self):
|
||||||
self.get_csrf_token()
|
self.get_csrf_token()
|
||||||
self.update_citizen_info()
|
self.update_citizen_info()
|
||||||
@ -261,7 +268,9 @@ class Citizen(classes.CitizenAPI):
|
|||||||
msgs = ["{count} x {kind}, totaling {} {currency}\n"
|
msgs = ["{count} x {kind}, totaling {} {currency}\n"
|
||||||
"{about}".format(d["count"] * d["reward"], **d) for d in data.values()]
|
"{about}".format(d["count"] * d["reward"], **d) for d in data.values()]
|
||||||
|
|
||||||
self.write_log("Found awards: {}".format("\n".join(msgs)))
|
msgs = "\n".join(msgs)
|
||||||
|
self.telegram.report_medal(msgs)
|
||||||
|
self.write_log("Found awards: {}".format(msgs))
|
||||||
for info in data.values():
|
for info in data.values():
|
||||||
self.reporter.report_action("NEW_MEDAL", info)
|
self.reporter.report_action("NEW_MEDAL", info)
|
||||||
|
|
||||||
@ -270,6 +279,7 @@ class Citizen(classes.CitizenAPI):
|
|||||||
level = levelup.group(1)
|
level = levelup.group(1)
|
||||||
msg = "Level up! Current level {}".format(level)
|
msg = "Level up! Current level {}".format(level)
|
||||||
self.write_log(msg)
|
self.write_log(msg)
|
||||||
|
self.telegram.report_medal(f"Level *{level}*")
|
||||||
self.reporter.report_action("LEVEL_UP", value=level)
|
self.reporter.report_action("LEVEL_UP", value=level)
|
||||||
|
|
||||||
def update_all(self, force_update=False):
|
def update_all(self, force_update=False):
|
||||||
@ -337,6 +347,8 @@ class Citizen(classes.CitizenAPI):
|
|||||||
self.energy.limit = citizen.get("energyToRecover", 0)
|
self.energy.limit = citizen.get("energyToRecover", 0)
|
||||||
self.energy.recovered = citizen.get("energy", 0)
|
self.energy.recovered = citizen.get("energy", 0)
|
||||||
self.energy.recoverable = citizen.get("energyFromFoodRemaining", 0)
|
self.energy.recoverable = citizen.get("energyFromFoodRemaining", 0)
|
||||||
|
if self.energy.is_energy_full:
|
||||||
|
self.telegram.report_full_energy(self.energy.available, self.energy.limit, self.energy.interval)
|
||||||
|
|
||||||
self.details.current_region = citizen.get("regionLocationId", 0)
|
self.details.current_region = citizen.get("regionLocationId", 0)
|
||||||
self.details.current_country = citizen.get("countryLocationId", 0) # country where citizen is located
|
self.details.current_country = citizen.get("countryLocationId", 0) # country where citizen is located
|
||||||
@ -1740,6 +1752,7 @@ class Citizen(classes.CitizenAPI):
|
|||||||
|
|
||||||
def launch_attack(self, war_id: int, region_id: int, region_name: str):
|
def launch_attack(self, war_id: int, region_id: int, region_name: str):
|
||||||
self._post_wars_attack_region(war_id, region_id, region_name)
|
self._post_wars_attack_region(war_id, region_id, region_name)
|
||||||
|
self.telegram.send_message(f"Battle for *{region_name}* queued")
|
||||||
|
|
||||||
def state_update_repeater(self):
|
def state_update_repeater(self):
|
||||||
try:
|
try:
|
||||||
@ -1848,6 +1861,7 @@ class Citizen(classes.CitizenAPI):
|
|||||||
if self.details.cc < amount or amount < 20:
|
if self.details.cc < amount or amount < 20:
|
||||||
return False
|
return False
|
||||||
data = dict(country=71, action='currency', value=amount)
|
data = dict(country=71, action='currency', value=amount)
|
||||||
|
self.telegram.send_message(f"Donated {amount}cc to {utils.COUNTRIES[71]}")
|
||||||
self.reporter.report_action("CONTRIBUTE_CC", data)
|
self.reporter.report_action("CONTRIBUTE_CC", data)
|
||||||
r = self._post_main_country_donate(**data)
|
r = self._post_main_country_donate(**data)
|
||||||
return r.json().get('status') or not r.json().get('error')
|
return r.json().get('status') or not r.json().get('error')
|
||||||
|
@ -5,9 +5,9 @@ import random
|
|||||||
import time
|
import time
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from json import JSONDecodeError, loads, JSONEncoder
|
from json import JSONDecodeError, loads, JSONEncoder
|
||||||
from typing import Any, Dict, List, Union, Mapping, Iterable
|
from typing import Any, Dict, List, Union, Mapping, Iterable, Tuple
|
||||||
|
|
||||||
from requests import Response, Session
|
from requests import Response, Session, post
|
||||||
|
|
||||||
from erepublik import utils
|
from erepublik import utils
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ class MyCompanies:
|
|||||||
for company_id in sorted(self.holdings.get(holding_id, {}).get('companies', []),
|
for company_id in sorted(self.holdings.get(holding_id, {}).get('companies', []),
|
||||||
key=lambda cid: (-self.companies[cid].get('is_raw'), # True, False
|
key=lambda cid: (-self.companies[cid].get('is_raw'), # True, False
|
||||||
self.companies[cid].get('industry_id'), # F W H A
|
self.companies[cid].get('industry_id'), # F W H A
|
||||||
-self.companies[cid].get('quality'), )): # 7, 6, .. 2, 1
|
-self.companies[cid].get('quality'),)): # 7, 6, .. 2, 1
|
||||||
company = self.companies.get(company_id, {})
|
company = self.companies.get(company_id, {})
|
||||||
wam_enabled = bool(company.get('wam_enabled', {}))
|
wam_enabled = bool(company.get('wam_enabled', {}))
|
||||||
already_worked = not company.get('already_worked', {})
|
already_worked = not company.get('already_worked', {})
|
||||||
@ -335,7 +335,7 @@ class Energy:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def is_recoverable_full(self):
|
def is_recoverable_full(self):
|
||||||
return self.recoverable >= self.limit - self.interval
|
return self.recoverable >= self.limit - 5 * self.interval
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_recovered_full(self):
|
def is_recovered_full(self):
|
||||||
@ -507,7 +507,8 @@ Class for unifying eRepublik known endpoints and their required/optional paramet
|
|||||||
data = (country, weeks, mu)
|
data = (country, weeks, mu)
|
||||||
return self.get("{}/main/leaderboards-damage-aircraft-rankings/{}/{}/{}/0".format(self.url, *data))
|
return self.get("{}/main/leaderboards-damage-aircraft-rankings/{}/{}/{}/0".format(self.url, *data))
|
||||||
|
|
||||||
def _get_main_leaderboards_damage_rankings(self, country: int, weeks: int = 0, mu: int = 0, div: int = 0) -> Response:
|
def _get_main_leaderboards_damage_rankings(self, country: int, weeks: int = 0, mu: int = 0,
|
||||||
|
div: int = 0) -> Response:
|
||||||
data = (country, weeks, mu, div)
|
data = (country, weeks, mu, div)
|
||||||
return self.get("{}/main/leaderboards-damage-rankings/{}/{}/{}/{}".format(self.url, *data))
|
return self.get("{}/main/leaderboards-damage-rankings/{}/{}/{}/{}".format(self.url, *data))
|
||||||
|
|
||||||
@ -515,7 +516,8 @@ Class for unifying eRepublik known endpoints and their required/optional paramet
|
|||||||
data = (country, weeks, mu)
|
data = (country, weeks, mu)
|
||||||
return self.get("{}/main/leaderboards-kills-aircraft-rankings/{}/{}/{}/0".format(self.url, *data))
|
return self.get("{}/main/leaderboards-kills-aircraft-rankings/{}/{}/{}/0".format(self.url, *data))
|
||||||
|
|
||||||
def _get_main_leaderboards_kills_rankings(self, country: int, weeks: int = 0, mu: int = 0, div: int = 0) -> Response:
|
def _get_main_leaderboards_kills_rankings(self, country: int, weeks: int = 0, mu: int = 0,
|
||||||
|
div: int = 0) -> Response:
|
||||||
data = (country, weeks, mu, div)
|
data = (country, weeks, mu, div)
|
||||||
return self.get("{}/main/leaderboards-kills-rankings/{}/{}/{}/{}".format(self.url, *data))
|
return self.get("{}/main/leaderboards-kills-rankings/{}/{}/{}/{}".format(self.url, *data))
|
||||||
|
|
||||||
@ -774,7 +776,7 @@ Class for unifying eRepublik known endpoints and their required/optional paramet
|
|||||||
data = dict(battleId=battle_id, action=action, _token=self.token)
|
data = dict(battleId=battle_id, action=action, _token=self.token)
|
||||||
if action == "battleStatistics":
|
if action == "battleStatistics":
|
||||||
data.update(round=kwargs["round_id"], zoneId=kwargs["round_id"], leftPage=page, rightPage=page,
|
data.update(round=kwargs["round_id"], zoneId=kwargs["round_id"], leftPage=page, rightPage=page,
|
||||||
division=kwargs["division"], type=kwargs.get("type", 'damage'),)
|
division=kwargs["division"], type=kwargs.get("type", 'damage'), )
|
||||||
elif action == "warList":
|
elif action == "warList":
|
||||||
data.update(page=page)
|
data.update(page=page)
|
||||||
return self.post("{}/military/battle-console".format(self.url), data=data)
|
return self.post("{}/military/battle-console".format(self.url), data=data)
|
||||||
@ -1139,3 +1141,45 @@ class EnergyToFight:
|
|||||||
if 0 < new_energy < self.energy:
|
if 0 < new_energy < self.energy:
|
||||||
self.energy = new_energy
|
self.energy = new_energy
|
||||||
return self.energy
|
return self.energy
|
||||||
|
|
||||||
|
|
||||||
|
class TelegramBot:
|
||||||
|
chat_id = 0
|
||||||
|
api_url = ""
|
||||||
|
|
||||||
|
def __init__(self, chat_id: int, token: str, player_name: str = ""):
|
||||||
|
self.chat_id = chat_id
|
||||||
|
self.api_url = "https://api.telegram.org/bot{}/sendMessage".format(token)
|
||||||
|
self.player_name = player_name
|
||||||
|
|
||||||
|
def send_message(self, message: str) -> bool:
|
||||||
|
if self.player_name:
|
||||||
|
message = f"Player *{self.player_name}*\n" + message
|
||||||
|
response = post(self.api_url, json=dict(chat_id=self.chat_id, text=message, parse_mode="Markdown"))
|
||||||
|
return response.json().get('ok')
|
||||||
|
|
||||||
|
def report_free_bhs(self, battles: List[Tuple[int, int, int, int, datetime.timedelta]]):
|
||||||
|
battle_links = []
|
||||||
|
for battle_id, side_id, against_id, damage, time_left in battles:
|
||||||
|
total_seconds = int(time_left.total_seconds())
|
||||||
|
time_start = ""
|
||||||
|
hours, remainder = divmod(total_seconds, 3600)
|
||||||
|
if hours:
|
||||||
|
time_start = f"{hours}h "
|
||||||
|
minutes, seconds = divmod(remainder, 60)
|
||||||
|
time_start += f"{minutes:02}m {seconds:02}s"
|
||||||
|
damage = "{:,}".format(damage).replace(',', ' ')
|
||||||
|
battle_links.append(f"*{damage}*dmg bh for [{utils.COUNTRIES[side_id]} vs {utils.COUNTRIES[against_id]}]"
|
||||||
|
f"(https://www.erepublik.com/en/military/battlefield/{battle_id}) "
|
||||||
|
f"_time since start {time_start}_")
|
||||||
|
self.send_message("Free BHs:\n" + "\n".join(battle_links))
|
||||||
|
|
||||||
|
def report_full_energy(self, available: int, limit: int, interval: int):
|
||||||
|
message = ""
|
||||||
|
if self.player_name:
|
||||||
|
message = f"Player *{self.player_name}*\n"
|
||||||
|
message += f"Full energy ({available}hp/{limit}hp +{interval}hp/6min)"
|
||||||
|
self.send_message(message)
|
||||||
|
|
||||||
|
def report_medal(self, msg):
|
||||||
|
self.send_message(f"New award: *{msg}*")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user