]> jfr.im git - irc/rizon/acid.git/blob - pyva/pyva/src/main/python/erepublik/api/battle.py
Split pyva plugin into pyva.core and pyva.pyva
[irc/rizon/acid.git] / pyva / pyva / src / main / python / erepublik / api / battle.py
1 import urllib2
2 import map
3 import feed
4 import threading
5 import war
6 from feed import XmlFeed, get_json
7 from datetime import datetime, timedelta
8 from decimal import Decimal
9
10 cache = {}
11 lock = threading.Lock()
12
13 def get_battle(battle_id):
14 with lock:
15 # try:
16 if battle_id in cache:
17 battle = cache[battle_id]
18 if not battle.active:
19 return battle
20
21 if battle.erep_api_fails and battle.refresh_api_feed():
22 return battle
23
24 if (datetime.now() - battle.status['timestamp']).seconds <= 6:
25 return cache[battle_id]
26
27 cache[battle_id].update()
28 return cache[battle_id]
29 else:
30 battle = Battle(battle_id)
31 cache[battle_id] = battle
32 return battle
33 # except Exception as e:
34 # raise e
35
36 class Battle:
37 def __init__(self, battle_id):
38 battle_feed = XmlFeed('http://api.erepublik.com/v2/feeds/battles/%d' % battle_id)
39 self.id = battle_id
40 self.finished_reason = battle_feed.text('/battle/progress/finished-reason')
41 self.finished_at = battle_feed.text('/battle/progress/finished-at')
42 if self.finished_at:
43 self.finished_at = datetime.strptime(self.finished_at[:-6], '%Y-%m-%dT%H:%M:%S') - timedelta(hours=3)
44
45 self.started_at = battle_feed.text('/battle/progress/started-at')
46 if self.started_at:
47 self.started_at = datetime.strptime(self.started_at[:-6], '%Y-%m-%dT%H:%M:%S') - timedelta(hours=3)
48
49 self.active = True if not self.finished_at else False
50 self.defender = {'id': battle_feed.int('/battle/defender/id'),
51 'name': battle_feed.text('/battle/defender/name'),
52 'code': battle_feed.text('/battle/defender/code')}
53 self.attacker = {'id': battle_feed.int('/battle/attacker/id'),
54 'name': battle_feed.text('/battle/attacker/name'),
55 'code': battle_feed.text('/battle/attacker/code')}
56 # war_id = battle_feed.int('/battle/war/id')
57 # war_feed = XmlFeed('http://api.erepublik.com/v1/feeds/war/%d' % war_id)
58 self.region = {'id': battle_feed.int('/battle/region/id'),
59 'name': battle_feed.text('/battle/region/name')}
60 self.is_resistance = battle_feed.bool('/battle/is-resistance')
61 self.winner_id = battle_feed.int('/battle/winner')
62
63 if self.active:
64 self.update_status()
65 else:
66 self.status = None
67
68 self.erep_api_fails = False
69
70 def update_status(self):
71 feed = get_json('http://www.erepublik.com/en/military/battle-log/%d' % self.id)
72 attpoints = int(feed['points']['attacker_points'])
73 defpoints = int(feed['points']['defender_points'])
74 domination = feed['domination']
75 if domination:
76 domination = round(Decimal(domination), 2)
77 else:
78 self.winner_id = self.defender['id'] if defpoints > attpoints else self.attacker['id']
79 self.erep_api_fails = True
80
81 self.status = {'domination': domination,
82 'attacker_points': attpoints,
83 'defender_points': defpoints,
84 'elapsed_time': self.get_time(attpoints + defpoints),
85 'timestamp': datetime.now()}
86
87 def update(self):
88 self.status['previous_check'] = self.status['timestamp']
89 self.status['previous_wall'] = self.status['domination']
90 self.update_status()
91
92 def refresh_api_feed(self):
93 battle_feed = XmlFeed('http://api.erepublik.com/v2/feeds/battles/%d' % self.id)
94 self.winner_id = battle_feed.int('/battle/winner')
95 self.finished_at = battle_feed.text('/battle/progress/finished-at')
96 if self.winner_id and self.finished_at:
97 self.finished_at = datetime.strptime(self.finished_at[:-6], '%Y-%m-%dT%H:%M:%S') - timedelta(hours=3)
98 self.active = False
99 return True
100 else:
101 return False
102
103 def get_time(self, wallpoints):
104 if wallpoints <= 300:
105 r = wallpoints / 10
106 elif wallpoints <= 900:
107 r = 30 + (wallpoints - 300) / 20
108 elif wallpoints <= 1800:
109 r = 60 + (wallpoints - 900) / 30
110 else:
111 r = 90 + (wallpoints - 1800) / 60
112 return int(r)