def researchTech(planetName, techName): menu.navigate_to_planet(planetName) go_to_research() if techName not in researchTranslation: return Event(Event.ERROR, 0, planetName, 'Technology is not valid') try: clickTechElement(planetName, techName) time.sleep(3) cost = _get_current_tech_cost() driver().find_element_by_class_name('build-it').click() # TODO: improve by using construction time extracted when building log.info( '{} research started for {} metal, {} cristal and {} deuterium'. format(techName, cost[METAL], cost[CRISTAL], cost[DEUTERIUM])) return Event(Event.RESEARCH_IN_PROGRESS, getNextTimeAvailability() - time.time(), planetName, techName) except Exception as e: log.error('Impossible to do this research {} on {}\n {} : {}'.format( techName, planetName, type(e).__name__, str(e))) menu.navigate_to_overview() return Event( Event.ERROR, 0, planetName, 'Impossible to research this technology, {}'.format(str(e)))
def update_planet_resources(self): menu.navigate_to_planet(self.name) self.resources[METAL] = int(driver().find_element_by_id( 'resources_metal').get_attribute('innerHTML').replace('.', '')) self.resources[CRISTAL] = int(driver().find_element_by_id( 'resources_crystal').get_attribute('innerHTML').replace('.', '')) self.resources[DEUTERIUM] = int(driver().find_element_by_id( 'resources_deuterium').get_attribute('innerHTML').replace('.', '')) self.resources[ENERGY] = int(driver().find_element_by_id( 'resources_energy').get_attribute('innerHTML').replace('.', ''))
def clickTechElement(planetName, techName): global opened_tech menu.navigate_to_planet(planetName) go_to_research() if opened_tech == techName: # Already opened return driver().find_element_by_id(researchTranslation[techName]).click() opened_tech = techName
def _extract_level_building(buildingName): text = driver().find_element_by_id(buildingTranslation[buildingName][1]) \ .find_element_by_class_name(buildingTranslation[buildingName][2]) \ .find_element_by_class_name('level').get_attribute('innerHTML').strip() return level_extraction(text)
def scan_system(galaxy, system): log.debug('Preparing to explore {}:{}'.format(galaxy, system)) current_address = get_current_address() log.debug(current_address) if current_address[0] != galaxy or current_address[1] != system: go_to_address(galaxy, system) try: planets_found = [] table = driver().find_elements_by_tag_name('tbody')[0] rows = table.find_elements_by_tag_name('tr') galaxy_tooltips = driver().find_elements_by_class_name('galaxyTooltip') player_details = [] for gt in galaxy_tooltips: if 'player' in gt.get_attribute('id'): player_details.append(gt) i = 0 for row in rows: if 'empty_filter' not in row.get_attribute( 'class') and i < len(player_details): elements = row.find_elements_by_tag_name('td') planet_id = elements[0].get_attribute('innerHTML') # Check inactivity inactive = False if 'inactive_filter' in row.get_attribute('class'): inactive = True rank_elements = player_details[i].find_elements_by_class_name( 'rank') if rank_elements: player_ranking = rank_elements[0].find_elements_by_tag_name('a')[0]\ .get_attribute('innerHTML') planets_found.append( Target(galaxy, system, planet_id, int(player_ranking), inactive)) i += 1 log.debug('{} planets found at {}:{}'.format(str(len(planets_found)), galaxy, system)) return planets_found except Exception as e: log.warn('Problem exploring {}:{} : {}'.format(galaxy, system, str(e))) return []
def extract_quantity_device(planetName, deviceName): menu.navigate_to_planet(planetName) go_to(deviceName) text = driver().find_element_by_id(deviceTranslation[deviceName][1]) \ .find_element_by_class_name('level').get_attribute('innerHTML').strip() return level_extraction(text)
def navigate_to_tab(tabName): current_tab = driver().current_url.split('page=')[1] if tabName in current_tab: #Already there return False tab = None menu = driver().find_element_by_id('menuTable') for element in menu.find_elements_by_tag_name('a'): try: if tabName in element.get_attribute('href'): tab = element except: pass tab.click() return True
def getNextTimeAvailability(): menu.navigate_to_overview() try: timeLeft = driver().find_element_by_id( 'researchCountdown').get_attribute('innerHTML') return time.time() + formatted_time_to_seconds(timeLeft) except Exception as e: log.warn('Exception {} : {}'.format(type(e).__name__, str(e))) return 0
def get_fleet_numbers(): menu.navigate_to_fleet() slots_text = driver().find_element_by_id( 'slots').find_elements_by_class_name('advice')[0].get_attribute( 'innerHTML') slots_text = slots_text.split('>')[2] current_fleet = int(slots_text.split('/')[0]) max_fleet = int(slots_text.split('/')[1]) return (current_fleet, max_fleet)
def getNextTimeAvailability(planetName): menu.navigate_to_planet(planetName) menu.navigate_to_overview() try: timeLeft = driver().find_element_by_id('Countdown').get_attribute('innerHTML') return time.time() + formatted_time_to_seconds(timeLeft) except Exception as e: log.warn('Exception {} : {}. Discard if no construction in progress'.format(type(e).__name__, str(e))) return 0
def _send_fleet(galaxy, system, planetId, fleet, resources, action_id): menu.navigate_to_fleet() time.sleep(0.05) _select_fleet(fleet) time.sleep(0.05) _select_destination(galaxy, system, planetId) time.sleep(0.05) driver().find_element_by_id(action_id).click() for resource_type in resources: driver().find_element_by_id(resource_type).send_keys( str(resources[resource_type])) driver().execute_script("window.scrollTo(0, document.body.scrollHeight);") driver().find_element_by_id('start').click()
def _select_fleet(fleet): for ship in fleet: if fleet[ship] != 0: driver().find_element_by_id( 'ship_' + deviceTranslation[ship][1][-3:]).send_keys( str(fleet[ship])) driver().execute_script("window.scrollTo(0, document.body.scrollHeight);") driver().find_element_by_id('continue').click()
def _extract_level_technology(techName): text = driver().find_element_by_id(researchTranslation[techName]) \ .find_element_by_class_name('level').get_attribute('innerHTML').strip() while '<' in text: i = text.find('<') j = text.find('>') if i == 0: text = text[j + 1:] text = text[text.find('>') + 1:] else: text = text[:i - 1] text.strip() return int(text)
def build_device(planet_name, deviceName, n): menu.navigate_to_planet(planet_name) go_to(deviceName) if deviceName not in deviceTranslation: return Event(Event.ERROR, 0, planet_name, 'Device is not valid') try: _click_device_element(deviceName) time.sleep(3) cost = getDeviceCost(deviceName, n) # Fill quantity driver().find_element_by_id('number').send_keys(str(n)) # Start construction driver().find_element_by_class_name('build-it').click() log.info('Construction of {} {} started for {} metal, {} cristal and {} deuterium'.format(n, deviceName, cost[METAL], cost[CRISTAL], cost[DEUTERIUM])) return Event(Event.SHIPYARD_CONSTRUCTION_IN_PROGRESS, getNextTimeAvailability() - time.time(), planet_name, deviceName) except Exception as e: log.error('Impossible to building {} {} on {}\n {} : {}'.format(n, deviceName,planet_name, type(e).__name__, str(e))) return Event(Event.ERROR, 0, planet_name, 'Impossible to build this device, {}'.format(str(e)))
def upgrade_building(planetName, buildingName): if buildingName not in buildingTranslation: return Event(Event.ERROR, 0, planetName, 'Building is not valid') menu.navigate_to_planet(planetName) go_to(buildingName) try: _clickBuildingElement(buildingName) time.sleep(3) cost = _get_current_building_cost() driver().find_element_by_class_name('build-it').click() #TODO: improve by using construction time extracted when building log.info('{} construction started for {} metal, {} cristal and {} deuterium'.format(buildingName, cost[METAL], cost[CRISTAL], cost[DEUTERIUM])) return Event(Event.BUILDING_IN_PROGRESS, getNextTimeAvailability(planetName) - time.time(), planetName, buildingName) except Exception as e: log.error('Impossible to upgrade this building {} on {}\n {} : {}'.format(buildingName, planetName, type(e).__name__, str(e))) menu.navigate_to_overview() return Event(Event.ERROR, 0, planetName, 'Impossible to upgrade this building, {}'.format(str(e)))
def navigate_to_planet(planetName): global current_planet remove_ad() if current_planet == planetName: return False planetLinks = driver().find_element_by_id('planetList').find_elements_by_class_name('planetlink') for link in planetLinks: if planetName in link.get_attribute('innerHTML'): link.click() current_planet = planetName return True log.error('Planet {} not found'.format(planetName))
async def main(): args = parse_args() with driver() as d: results = [ firefox(d=d, email=args.email), leakedsource(d=d, email=args.email), inoitsu(d=d, email=args.email) ] tasks = [ asyncio.ensure_future(func(args.email)) for _, func in getmembers(services, isfunction) ] results.extend(filter(None, await asyncio.gather(*tasks))) with open('output.json', 'w') as f: json.dump(results, f, indent=2)
def _clickBuildingElement(buildingName): global opened_building go_to(buildingName) if opened_building == buildingName: # Already opened log.debug('{} already opened'.format(buildingName)) return log.debug('Clicking {}, previously on {}'.format(buildingName, opened_building)) buildingElement = driver().find_element_by_id(buildingTranslation[buildingName][1]) \ .find_element_by_class_name(buildingTranslation[buildingName][2]) if buildingTranslation[buildingName][0] == RESOURCES: buildingElement.find_element_by_id('details').click() elif buildingTranslation[buildingName][0] == FACILITIES: buildingElement.find_element_by_id('details' + buildingTranslation[buildingName][2][-2:]).click() opened_building = buildingName
def get_in_progress_research(): menu.navigate_to_overview() try: research_overview = driver().find_elements_by_class_name( 'content-box-s')[1] in_progres = research_overview.find_element_by_class_name('first') cancel_link = in_progres.find_elements_by_tag_name('a')[0] cancel_action = cancel_link.get_attribute('onClick') log.debug(cancel_action) # 3 numbers after 'cancelResearch(' (15 letters) item_id = cancel_action[15:18] for research, details in researchTranslation.items(): if item_id in details: return research log.error('research not identified: {}'.format(item_id)) return None except Exception as e: log.warn('Exception {} : {}. Discard if no researh in progress'.format( type(e).__name__, str(e))) return None
def get_in_progress_building(planet_name): menu.navigate_to_planet(planet_name) menu.navigate_to_overview() try: building_overview = driver().find_elements_by_class_name('content-box-s')[0] in_progres = building_overview.find_element_by_class_name('first') cancel_link = in_progres.find_elements_by_tag_name('a')[0] cancel_action = cancel_link.get_attribute('onClick') log.debug(cancel_action) # 3 numbers after 'cancelProduction(' (17 letters) item_id = cancel_action[17:19].strip(',') x = - len(item_id) for building in buildingTranslation: (_, _, name) = buildingTranslation[building] if item_id in name[x:]: return building log.error('building not identified: {}'.format(item_id)) return None except Exception as e: log.warn('Exception {} : {}. Discard if no construction in progress'.format(type(e).__name__, str(e))) return None
def full_run(config, gistr_url, username, driver=None): if driver is None: with utils.driver() as driver: _full_run(config, gistr_url, username, driver) else: _full_run(config, gistr_url, username, driver)
def list_planets(): planetLinks = driver().find_element_by_id('planetList').find_elements_by_class_name('planetlink') names = [link.find_element_by_class_name('planet-name').get_attribute('innerHTML') for link in planetLinks] return names
def refresh(): driver().refresh()
def _get_current_building_cost(): costList = driver().find_element_by_id('costs') return cost_extraction(costList)
def driver(): with utils.driver() as driver: yield driver
def _get_current_tech_cost(): return cost_extraction(driver().find_element_by_id('costs'))
def _click_device_element(deviceName): go_to(deviceName) driver().find_element_by_id(deviceTranslation[deviceName][1]).click()
def go_to_address(galaxy, system): driver().find_element_by_id('galaxy_input').send_keys(str(galaxy)) driver().find_element_by_id('system_input').send_keys(str(system)) buttons = driver().find_elements_by_class_name('btn_blue') buttons[0].click() time.sleep(0.3)
def get_current_address(): galaxy = driver().find_element_by_id('galaxy_input').get_attribute('value') system = driver().find_element_by_id('system_input').get_attribute('value') return (int(galaxy), int(system))
if __name__ == '__main__': args = parser.parse_args() no_display = not args.display and not args.manual if no_display: display = Display(visible=0, size=(1280, 1024)) display.start() with open(args.configFile) as file: config = json.load(file) retry_count = 5 if args.experiment: retry_count = 1 while (retry_count > 0): try: run(args) retry_count = 0 except Exception as e: log.error('Something went very wrong : {}\n{}'.format( str(e), traceback.format_exc())) driver().quit() retry_count -= 1 if no_display: display.stop() driver().quit()
def _select_destination(galaxy, system, planetId): driver().find_element_by_id('galaxy').send_keys(str(galaxy)) driver().find_element_by_id('system').send_keys(str(system)) driver().find_element_by_id('position').send_keys(str(planetId)) driver().execute_script("window.scrollTo(0, document.body.scrollHeight);") driver().find_element_by_id('continue').click()
def connect(config): #homepage driver().get(config['homeUrl']) #Open login menu driver().find_element_by_id('ui-id-1').click() time.sleep(1) utils.remove_ad() #Fill credentials driver().find_element_by_id('usernameLogin').send_keys(config['email']) driver().find_element_by_id('passwordLogin').send_keys(config['password']) #Login driver().find_element_by_id('loginSubmit').click() log.debug('Login submitted') # universeChoice = driver().find_element_by_id('serverLogin') # universeOptions = universeChoice.find_elements_by_tag_name("option") # for option in universeOptions: # if config['universe'] in option.get_attribute('innerHTML') : # option.click() time.sleep(3) try: joinGame = driver().find_element_by_id('joinGame') if joinGame is not None: play_button = joinGame.find_element_by_tag_name( 'a').find_element_by_tag_name('button') play_button.click() time.sleep(3) except Exception as e: log.error(e) actions = driver().find_elements_by_class_name('action-cell') for action in actions: # TODO find better distinction if action.find_elements_by_tag_name('span')[0].get_attribute('innerHTML') == 'Play' or \ action.find_elements_by_tag_name('span')[0].get_attribute('innerHTML') == 'Jouer': action.click() log.info('Choosing the universe') break time.sleep(5) # Closing first tab del driver().window_handles[0] driver().switch_to.window(driver().window_handles[0]) time.sleep(1) driver().close() time.sleep(2) # Focusing on open tab driver().switch_to.window(driver().window_handles[0])