コード例 #1
0
ファイル: research.py プロジェクト: NickPPC/Olivia
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)))
コード例 #2
0
 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('.', ''))
コード例 #3
0
ファイル: research.py プロジェクト: NickPPC/Olivia
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
コード例 #4
0
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)
コード例 #5
0
ファイル: galaxy.py プロジェクト: NickPPC/Olivia
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 []
コード例 #6
0
ファイル: shipyard.py プロジェクト: NickPPC/Olivia
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)
コード例 #7
0
ファイル: menu.py プロジェクト: NickPPC/Olivia
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
コード例 #8
0
ファイル: research.py プロジェクト: NickPPC/Olivia
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
コード例 #9
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)
コード例 #10
0
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
コード例 #11
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()
コード例 #12
0
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()
コード例 #13
0
ファイル: research.py プロジェクト: NickPPC/Olivia
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)
コード例 #14
0
ファイル: shipyard.py プロジェクト: NickPPC/Olivia
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)))
コード例 #15
0
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)))
コード例 #16
0
ファイル: menu.py プロジェクト: NickPPC/Olivia
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))
コード例 #17
0
ファイル: wwwe.py プロジェクト: cqr-cryeye-forks/WWWE
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)
コード例 #18
0
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
コード例 #19
0
ファイル: research.py プロジェクト: NickPPC/Olivia
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
コード例 #20
0
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
コード例 #21
0
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)
コード例 #22
0
ファイル: menu.py プロジェクト: NickPPC/Olivia
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
コード例 #23
0
ファイル: menu.py プロジェクト: NickPPC/Olivia
def refresh():
    driver().refresh()
コード例 #24
0
def _get_current_building_cost():
    costList = driver().find_element_by_id('costs')
    return cost_extraction(costList)
コード例 #25
0
def driver():
    with utils.driver() as driver:
        yield driver
コード例 #26
0
ファイル: research.py プロジェクト: NickPPC/Olivia
def _get_current_tech_cost():
    return cost_extraction(driver().find_element_by_id('costs'))
コード例 #27
0
ファイル: shipyard.py プロジェクト: NickPPC/Olivia
def _click_device_element(deviceName):
    go_to(deviceName)

    driver().find_element_by_id(deviceTranslation[deviceName][1]).click()
コード例 #28
0
ファイル: galaxy.py プロジェクト: NickPPC/Olivia
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)
コード例 #29
0
ファイル: galaxy.py プロジェクト: NickPPC/Olivia
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))
コード例 #30
0
ファイル: agent.py プロジェクト: NickPPC/Olivia
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()
コード例 #31
0
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()
コード例 #32
0
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])