Esempio n. 1
0
    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))
Esempio n. 2
0
    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('&quot;', '"')
                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