]>
Commit | Line | Data |
---|---|---|
685e346e A |
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) |