def start_update(self, build=False): main_data = self.wrapper.get_action(village_id=self.village_id, action="main") self.costs = Extractor.building_data(main_data) self.game_state = Extractor.game_state(main_data) if self.resman: self.resman.update(self.game_state) if not self.logger: self.logger = logging.getLogger("Builder: %s" % self.game_state['village']['name']) self.logger.debug("Updating building levels") tmp = self.game_state['village']['buildings'] for e in tmp: tmp[e] = int(tmp[e]) self.levels = tmp existing_queue = self.get_existing_items(main_data) if existing_queue == 0: self.waits = [] if self.is_queued(): self.logger.info("No build operation was executed: queue full, %d left" % len(self.queue)) if not build: return False if existing_queue != 0 and existing_queue != len(self.waits): self.logger.warning("Building queue out of sync, waiting until %d manual actions are finished!" % existing_queue) return False for x in range(self.max_queue_len): result = self.get_next_building_action() if not result: self.logger.info("No build operation was executed %d left" % len(self.queue)) return False return True
def start_update(self, build=False, set_village_name=None): main_data = self.wrapper.get_action(village_id=self.village_id, action="main") if self.complete_actions(main_data.text): return self.start_update(build=build, set_village_name=set_village_name) self.costs = Extractor.building_data(main_data) self.game_state = Extractor.game_state(main_data) if self.resman: self.resman.update(self.game_state) if 'building' in self.resman.requested: # new run, remove request self.resman.requested['building'] = {} vname = self.game_state['village']['name'] if set_village_name and vname != set_village_name: self.wrapper.post_url( url="game.php?village=%s&screen=main&action=change_name" % self.village_id, data={"name": set_village_name, "h": self.wrapper.last_h} ) if not self.logger: self.logger = logging.getLogger("Builder: %s" % vname) self.logger.debug("Updating building levels") tmp = self.game_state['village']['buildings'] for e in tmp: tmp[e] = int(tmp[e]) self.levels = tmp existing_queue = self.get_existing_items(main_data) if existing_queue == 0: self.waits = [] self.waits_building = [] if self.is_queued(): self.logger.info("No build operation was executed: queue full, %d left" % len(self.queue)) return False if not build: return False if existing_queue != 0 and existing_queue != len(self.waits): self.logger.warning("Building queue out of sync, waiting until %d manual actions are finished!" % existing_queue) return True for x in range(self.max_queue_len - len(self.waits)): result = self.get_next_building_action() if not result: self.logger.info("No build more operations where executed (%d current, %d left)" % (len(self.waits), len(self.queue))) return False return True
def get_next_building_action(self, index=0): if index >= self.max_lookahead: self.logger.debug("Not building anything because insufficient resources") return False queue_check = self.is_queued() if queue_check: self.logger.debug("Not building because of queued items: %s" % self.waits) return False if self.resman and self.resman.in_need_of("pop"): build_data = 'farm:%d' % (int(self.levels['farm']) + 1) if len(self.queue) and "farm" not in [x.split(':')[0] for x in self.queue[0:self.max_lookahead]] \ and int(self.levels['farm']) != 30: self.queue.insert(0, build_data) self.logger.info("Adding farm in front of queue because low on pop") return self.get_next_building_action(0) if len(self.queue): entry = self.queue[index] entry, min_lvl = entry.split(':') min_lvl = int(min_lvl) if min_lvl <= self.levels[entry]: self.queue.pop(index) return self.get_next_building_action(index=index) if entry not in self.costs: self.logger.debug("Ignoring %s because not yet available" % entry) return self.get_next_building_action(index + 1) check = self.costs[entry] if 'max_level' in check and min_lvl > check['max_level']: self.logger.debug("Removing entry %s because max_level exceeded" % entry) self.queue.pop(index) return self.get_next_building_action(index=index) if check['can_build'] and self.has_enough(check) and 'build_link' in check: queue = self.put_wait(check['build_time']) self.logger.info("Building %s %d -> %d (finishes: %s)" % (entry, self.levels[entry], self.levels[entry]+1, self.readable_ts(queue))) self.wrapper.reporter.report(self.village_id, "TWB_BUILD", "Building %s %d -> %d (finishes: %s)" % (entry, self.levels[entry], self.levels[entry]+1, self.readable_ts(queue))) self.levels[entry] += 1 result = self.wrapper.get_url(check['build_link'].replace('amp;', '')) self.game_state = Extractor.game_state(result) self.costs = Extractor.building_data(result) return True else: return self.get_next_building_action(index + 1)