def update_totals(self): main_data = self.wrapper.get_action(action="overview", village_id=self.village_id) self.game_data = Extractor.game_state(main_data) if not self.logger: self.logger = logging.getLogger("Recruitment: %s" % self.game_data['village']['name']) self.troops = {} for u in Extractor.units_in_village(main_data): k, v = u self.troops[k] = v self.logger.debug("Units in village: %s" % str(self.troops)) if not self.can_recruit: return get_all = "game.php?village=%s&screen=place&mode=units&display=units" % self.village_id result_all = self.wrapper.get_url(get_all) self.total_troops = {} for u in Extractor.units_in_total(result_all): k, v = u if k in self.total_troops: self.total_troops[k] = self.total_troops[k] + int(v) else: self.total_troops[k] = int(v) self.logger.debug("Village units total: %s" % str(self.total_troops))
def attack_report(self, report, report_id): from_village = None from_player = None to_village = None to_player = None extra = {} losses = {} attacker = re.search(r'(?s)(<table id="attack_info_att".+?</table>)', report) if attacker: attacker_data = re.search(r'data-player="(\d+)" data-id="(\d+)"', attacker.group(1)) if attacker_data: from_player = attacker_data.group(1) from_village = attacker_data.group(2) units = re.search( r'(?s)<table id="attack_info_att_units"(.+?)</table>', attacker.group(1)) if units: sent_units = re.findall('(?s)<tr>(.+?)</tr>', units.group(1)) extra['units_sent'] = self.re_unit( Extractor.units_in_total(sent_units[0])) if len(sent_units) == 2: extra['units_losses'] = self.re_unit( Extractor.units_in_total(sent_units[1])) if from_player == self.game_state['player']['id']: losses = extra['units_losses'] defender = re.search(r'(?s)(<table id="attack_info_def".+?</table>)', report) if defender: defender_data = re.search(r'data-player="(\d+)" data-id="(\d+)"', defender.group(1)) if defender_data: to_player = defender_data.group(1) to_village = defender_data.group(2) units = re.search( r'(?s)<table id="attack_info_def_units"(.+?)</table>', defender.group(1)) if units: def_units = re.findall('(?s)<tr>(.+?)</tr>', units.group(1)) extra['defence_units'] = self.re_unit( Extractor.units_in_total(def_units[0])) if len(def_units) == 2: extra['defence_losses'] = self.re_unit( Extractor.units_in_total(def_units[1])) if to_player == self.game_state['player']['id']: losses = extra['defence_losses'] results = re.search(r'(?s)(<table id="attack_results".+?</table>)', report) report = report.replace('<span class="grey">.</span>', '') if results: loot = {} for loot_entry in re.findall( r'<span class="icon header (wood|stone|iron)".+?</span>(\d+)', report): loot[loot_entry[0]] = loot_entry[1] extra['loot'] = loot self.logger.info("attack report %s -> %s" % (from_village, to_village)) scout_results = re.search( r'(?s)(<table id="attack_spy_resources".+?</table>)', report) if scout_results: self.logger.info("scout report %s -> %s" % (from_village, to_village)) scout_buildings = re.search( r'(?s)<input id="attack_spy_building_data" type="hidden" value="(.+?)"', report) if scout_buildings: raw = scout_buildings.group(1).replace('"', '"') extra['buildings'] = self.re_building(json.loads(raw)) loot = {} for loot_entry in re.findall( r'<span class="icon header (wood|stone|iron)".+?</span>(\d+)', report): loot[loot_entry[0]] = loot_entry[1] extra['resources'] = loot units_away = re.search( r'(?s)(<table id="attack_spy_away".+?</table>)', report) if units_away: data_away = self.re_unit( Extractor.units_in_total(units_away.group(1))) extra['units_away'] = data_away attack_type = "scout" if scout_results and not results else "attack" res = self.put(report_id, attack_type, from_village, to_village, data=extra, losses=losses) self.last_reports[report_id] = res return True