]>
jfr.im git - irc/rizon/acid.git/blob - pyva/pyva/src/main/python/erepublik/api/battle.py
6 from feed
import XmlFeed
, get_json
7 from datetime
import datetime
, timedelta
8 from decimal
import Decimal
11 lock
= threading
.Lock()
13 def get_battle(battle_id
):
16 if battle_id
in cache
:
17 battle
= cache
[battle_id
]
21 if battle
.erep_api_fails
and battle
.refresh_api_feed():
24 if (datetime
.now() - battle
.status
['timestamp']).seconds
<= 6:
25 return cache
[battle_id
]
27 cache
[battle_id
].update()
28 return cache
[battle_id
]
30 battle
= Battle(battle_id
)
31 cache
[battle_id
] = battle
33 # except Exception as e:
37 def __init__(self
, battle_id
):
38 battle_feed
= XmlFeed('http://api.erepublik.com/v2/feeds/battles/%d' % battle_id
)
40 self
.finished_reason
= battle_feed
.text('/battle/progress/finished-reason')
41 self
.finished_at
= battle_feed
.text('/battle/progress/finished-at')
43 self
.finished_at
= datetime
.strptime(self
.finished_at
[:-6], '%Y-%m-%dT%H:%M:%S') - timedelta(hours
=3)
45 self
.started_at
= battle_feed
.text('/battle/progress/started-at')
47 self
.started_at
= datetime
.strptime(self
.started_at
[:-6], '%Y-%m-%dT%H:%M:%S') - timedelta(hours
=3)
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')
68 self
.erep_api_fails
= False
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']
76 domination
= round(Decimal(domination
), 2)
78 self
.winner_id
= self
.defender
['id'] if defpoints
> attpoints
else self
.attacker
['id']
79 self
.erep_api_fails
= True
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()}
88 self
.status
['previous_check'] = self
.status
['timestamp']
89 self
.status
['previous_wall'] = self
.status
['domination']
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)
103 def get_time(self
, wallpoints
):
104 if wallpoints
<= 300:
106 elif wallpoints
<= 900:
107 r
= 30 + (wallpoints
- 300) / 20
108 elif wallpoints
<= 1800:
109 r
= 60 + (wallpoints
- 900) / 30
111 r
= 90 + (wallpoints
- 1800) / 60