Exemple #1
0
def planearAbastecimiento(s, destino, origenes, faltantes):
    rutas = []
    html = s.get(urlCiudad + destino)
    ciudadD = getCiudad(html)
    for i in range(5):
        faltante = faltantes[i]
        if faltante <= 0:
            continue
        for origen in origenes[i]:
            if faltante == 0:
                break
            html = s.get(urlCiudad + origen)
            ciudadO = getCiudad(html)
            disp = getRecursosDisponibles(html, num=True)[i]
            mandar = disp if disp < faltante else faltante
            faltante -= mandar
            if i == 0:
                ruta = (ciudadO, ciudadD, ciudadD['islandId'], mandar, 0, 0, 0,
                        0)
            elif i == 1:
                ruta = (ciudadO, ciudadD, ciudadD['islandId'], 0, mandar, 0, 0,
                        0)
            elif i == 2:
                ruta = (ciudadO, ciudadD, ciudadD['islandId'], 0, 0, mandar, 0,
                        0)
            elif i == 3:
                ruta = (ciudadO, ciudadD, ciudadD['islandId'], 0, 0, 0, mandar,
                        0)
            else:
                ruta = (ciudadO, ciudadD, ciudadD['islandId'], 0, 0, 0, 0,
                        mandar)
            rutas.append(ruta)
    planearViajes(s, rutas)
Exemple #2
0
def subirEdificio(s, idCiudad, posicion, nivelesASubir):

    for lv in range(nivelesASubir):
        ciudad = esperarConstruccion(s, idCiudad, posicion)
        edificio = ciudad['position'][posicion]

        if edificio['canUpgrade'] is False:
            msg = 'No se pudo terminar de subir el edificio por falta de recursos.'
            msg += 'Faltaron subir {:d} niveles'.format(nivelesASubir - lv)
            sendToBot(msg)
            return

        url = 'action=CityScreen&function=upgradeBuilding&actionRequest={}&cityId={}&position={:d}&level={}&activeTab=tabSendTransporter&backgroundView=city&currentCityId={}&templateView={}&ajax=1'.format(
            s.token(), idCiudad, posicion, edificio['level'], idCiudad,
            edificio['building'])
        s.post(url)

        html = s.get(urlCiudad + idCiudad)
        ciudad = getCiudad(html)
        edificio = ciudad['position'][posicion]
        if edificio['isBusy'] is False:
            msg = 'El edificio no se amplió\n'
            msg += url + '\n'
            msg += str(edificio)
            sendToBot(msg)
            return
Exemple #3
0
def esperarConstruccion(s, idCiudad, posicion):
    slp = 1
    while slp > 0:
        html = s.get(urlCiudad + idCiudad)
        slp = getTiempoDeConstruccion(html, posicion)
        esperar(slp)
    return getCiudad(html)
Exemple #4
0
def obtenerMilagrosDisponibles(s):
    idsIslas = getIdsdeIslas(s)
    islas = []
    for idIsla in idsIslas:
        html = s.get(urlIsla + idIsla)
        isla = getIsla(html)
        isla['activable'] = False
        islas.append(isla)

    ids, citys = getIdsDeCiudades(s)
    for ciudad in citys:
        city = citys[ciudad]
        wonder = [
            isla['wonder'] for isla in islas
            if city['coords'] == '[{}:{}] '.format(isla['x'], isla['y'])
        ][0]
        if wonder in [isla['wonder'] for isla in islas if isla['activable']]:
            continue
        html = s.get(urlCiudad + str(city['id']))
        ciudad = getCiudad(html)
        if 'temple' in [
                edificio['building'] for edificio in ciudad['position']
        ]:
            for i in range(len(ciudad['position'])):
                if ciudad['position'][i]['building'] == 'temple':
                    ciudad['pos'] = str(i)
                    break
            for isla in islas:
                if isla['id'] == ciudad['islandId']:
                    isla['activable'] = True
                    isla['ciudad'] = ciudad
                    break

    return [isla for isla in islas if isla['activable']]
Exemple #5
0
 def __logout(self, html):
     if html is not None:
         idCiudad = getCiudad(html)['id']
         token = re.search(r'actionRequest"?:\s*"(.*?)"', html).group(1)
         urlLogout = 'action=logoutAvatar&function=logout&sideBarExt=undefined&startPageShown=1&detectedDevice=1&cityId={0}&backgroundView=city&currentCityId={0}&actionRequest={1}'.format(
             idCiudad, token)
         self.s.get(self.urlBase + urlLogout, headers=self.headers)
Exemple #6
0
def subirEdificio(s, idCiudad, posicion, nivelesASubir, esperarRecursos):

    for lv in range(nivelesASubir):
        ciudad = esperarConstruccion(s, idCiudad, posicion)
        edificio = ciudad['position'][posicion]

        if edificio['canUpgrade'] is False and esperarRecursos:
            while edificio['canUpgrade'] is False:
                time.sleep(60)  # tiempo para que se envien los recursos
                segundos = obtenerMinimoTiempoDeEspera(s)
                html = s.get(urlCiudad + idCiudad)
                ciudad = getCiudad(html)
                edificio = ciudad['position'][posicion]
                if segundos == 0:
                    break
                else:
                    esperar(segundos)

        if edificio['canUpgrade'] is False:
            msg = _('Ciudad:{}\n').format(ciudad['cityName'])
            msg += _('Edificio:{}\n').format(edificio['name'])
            msg += _(
                'No se pudo terminar de subir el edificio por falta de recursos.\n'
            )
            msg += _('Faltaron subir {:d} niveles').format(nivelesASubir - lv)
            sendToBot(msg)
            return

        for i in range(3):
            url = 'action=CityScreen&function=upgradeBuilding&actionRequest={}&cityId={}&position={:d}&level={}&activeTab=tabSendTransporter&backgroundView=city&currentCityId={}&templateView={}&ajax=1'.format(
                s.token(), idCiudad, posicion, edificio['level'], idCiudad,
                edificio['building'])
            s.post(url)
            html = s.get(urlCiudad + idCiudad)
            ciudad = getCiudad(html)
            edificio = ciudad['position'][posicion]
            if edificio['isBusy']:
                break

        if edificio['isBusy'] is False:
            msg = _('El edificio no se amplió\n')
            msg = _('El edificio {} no se amplió después de tres intentos\n'
                    ).format(edificio['name'])
            msg += url + '\n'
            msg += str(edificio)
            sendToBot(msg)
            return
Exemple #7
0
def activarModoVacaciones(s):
    html = s.get()
    ciudad = getCiudad(html)

    data = {
        'action': 'Options',
        'function': 'activateVacationMode',
        'actionRequest': s.token(),
        'backgroundView': 'city',
        'currentCityId': ciudad['id'],
        'templateView': 'options_umod_confirm'
    }
    s.post(params=data, ignoreExpire=True)
Exemple #8
0
def getStatus(s):
	banner()
	tipoCiudad = [bcolors.ENDC, bcolors.HEADER, bcolors.STONE, bcolors.BLUE, bcolors.WARNING]
	ids, ciudades = getIdsDeCiudades(s)
	print(_('Barcos {:d}/{:d}').format(getBarcosDisponibles(s), getBarcosTotales(s)))
	for unId in ids:
		html = s.get(urlCiudad + unId)
		ciudad = getCiudad(html)
		(wood, good, typeGood) = getProduccion(s, unId)
		print('\033[1m' + tipoCiudad[int(typeGood)] + ciudad['cityName'] + tipoCiudad[0])
		max = getRecursosDisponibles(html)
		capacidadDeAlmacenamiento = getCapacidadDeAlmacenamiento(html)
		crecursos = []
		for i in range(0,5):
			if max[i] == capacidadDeAlmacenamiento:
				crecursos.append(bcolors.RED)
			else:
				crecursos.append(bcolors.ENDC)
		print(_('Almacenamiento:'))
		print(addPuntos(capacidadDeAlmacenamiento))
		print(_('Recursos:'))
		print(_('Madera {1}{2}{0} Vino {3}{4}{0} Marmol {5}{6}{0} Cristal {7}{8}{0} Azufre {9}{10}{0}').format(bcolors.ENDC, crecursos[0], addPuntos(max[0]), crecursos[1], addPuntos(max[1]), crecursos[2], addPuntos(max[2]), crecursos[3], addPuntos(max[3]), crecursos[4], addPuntos(max[4])))
		consumoXhr = getConsumoDeVino(html)
		tipo = tipoDeBien[typeGood]
		print(_('Producción:'))
		print(_('Madera:{} {}:{}').format(addPuntos(wood*3600), tipo, addPuntos(good*3600)))
		if consumoXhr == 0:
			print(_('{}{}No se consume vino!{}').format(bcolors.RED, bcolors.BOLD, bcolors.ENDC))
		elif typeGood == 1 and (good*3600) > consumoXhr:
			print(_('Hay vino para:\n∞'))
		else:
			consumoXseg = Decimal(consumoXhr) / Decimal(3600)
			segsRestantes = Decimal(int(max[1])) / Decimal(consumoXseg)
			texto = diasHorasMinutos(segsRestantes)
			print(_('Hay vino para:\n{}').format(texto))
		for edificio in [ edificio for edificio in ciudad['position'] if edificio['name'] != 'empty' ]:
			if edificio['isMaxLevel'] is True:
				color = bcolors.BLACK
			elif edificio['canUpgrade'] is True:
				color = bcolors.GREEN
			else:
				color = bcolors.RED
			level = edificio['level']
			if int(level) < 10:
				level = ' ' + level
			if edificio['isBusy'] is True:
				level = level + '+'
			print(_('lv:{}\t{}{}{}').format(level, color, edificio['name'], bcolors.ENDC))
		enter()
		print('')
Exemple #9
0
def getCiudadesComerciales(s):
    ids = getIdsDeCiudades(s)[0]
    ciudades_comerciales = []
    for idCiudad in ids:
        html = s.get(urlCiudad + idCiudad)
        ciudad = getCiudad(html)
        for pos, edificio in enumerate(ciudad['position']):
            if edificio['building'] == 'branchOffice':
                ciudad['pos'] = pos
                html = getStoreHtml(s, ciudad)
                rangos = re.findall(r'<option.*?>(\d+)</option>', html)
                ciudad['rango'] = int(rangos[-1])
                ciudades_comerciales.append(ciudad)
                break
    return ciudades_comerciales
Exemple #10
0
def do_it(s, idsCiudades, ciudades_dict):
	for idCiudad in idsCiudades:
		html = s.get(urlCiudad + idCiudad)
		ciudad = getCiudad(html)
		ciudades_dict[idCiudad]['isla'] = ciudad['islandId']
	while True:
		for idCiudad in idsCiudades:
			html = s.get(urlCiudad + idCiudad)
			madera = getRecursosDisponibles(html)[0]
			idIsla = ciudades_dict[idCiudad]['isla']
			tipo = ciudades_dict[idCiudad]['tipo']
			if tipo:
				s.post(payloadPost={'islandId': idIsla, 'type': tipo, 'action': 'IslandScreen', 'function': 'donate', 'donation': madera, 'backgroundView': 'island', 'templateView': 'resource', 'actionRequest': s.token(), 'ajax': '1'})
		msg = _('Doné automaticamente.')
		sendToBotDebug(msg, debugON_botDonador)
		time.sleep(24*60*60)
Exemple #11
0
def menuEdificios(s, ids, cities, idCiudad, bienNombre, bienIndex, faltante):
    banner()
    print(_('¿De qué ciudades obtener {}?').format(bienNombre))
    rta = []
    tradegood = [_('V'), 'M', 'C', _('A')]
    maxName = 0
    for name in [
            cities[city]['name'] for city in cities
            if cities[city]['id'] != idCiudad
    ]:
        if len(name) > maxName:
            maxName = len(name)
    total = 0
    for id in [id for id in ids if id != idCiudad]:
        trade = tradegood[int(cities[id]['tradegood']) - 1]
        html = s.get(urlCiudad + id)
        ciudad = getCiudad(html)
        disponible = ciudad['recursos'][bienIndex]
        if disponible == 0:
            continue
        opcion = '{}{} ({}): {} [Y/n]:'.format(
            ' ' * (maxName - len(cities[id]['name'])), cities[id]['name'],
            trade, addPuntos(disponible))
        eleccion = read(msg=opcion, values=['Y', 'y', 'N', 'n', ''])
        if eleccion.lower() == 'n':
            continue
        total += disponible
        rta.append(id)
        if total >= faltante:
            return rta
    if total < faltante:
        global enviarRecursos
        global ampliar
        print(_('\nNo hay recursos suficientes.'))
        if enviarRecursos:
            print(_('\n¿Enviar los recursos de todos modos? [Y/n]'))
            choise = read(values=['y', 'Y', 'n', 'N', ''])
            if choise.lower() == 'n':
                enviarRecursos = False
        if ampliar:
            print(_('\n¿Intentar aumentar el edificio de todos modos? [y/N]'))
            choise = read(values=['y', 'Y', 'n', 'N', ''])
            if choise.lower() == 'n' or choise == '':
                ampliar = False
    return rta
Exemple #12
0
def getTiempoDeConstruccion(html, posicion):
    ciudad = getCiudad(html)
    edificio = ciudad['position'][posicion]
    hora_fin = re.search(r'"endUpgradeTime":(\d{10})', html)
    if hora_fin is None:
        msg = '{}: No espero nada para que {} suba al nivel {:d}'.format(
            ciudad['cityName'], edificio['name'], int(edificio['level']))
        sendToBotDebug(msg, debugON_subirEdificio)
        return 0

    hora_actual = int(time.time())
    hora_fin = int(hora_fin.group(1))
    espera = hora_fin - hora_actual

    msg = '{}: Espero {:d} segundos para que {} suba al nivel {:d}'.format(
        ciudad['cityName'], espera, edificio['name'],
        int(edificio['level']) + 1)
    sendToBotDebug(msg, debugON_subirEdificio)

    return espera + 3
Exemple #13
0
def botDonador(s):
    if botValido(s) is False:
        return

    banner()
    (idsCiudades, ciudades) = getIdsDeCiudades(s)
    ciudades_dict = {}
    bienes = {'1': '(V)', '2': '(M)', '3': '(C)', '4': '(A)'}
    for idCiudad in idsCiudades:
        html = s.get(urlCiudad + idCiudad)
        ciudad = getCiudad(html)
        tradegood = ciudades[idCiudad]['tradegood']
        bien = bienes[tradegood]
        print(
            'En la ciudad {} {}, ¿Desea donar al aserradero o al bien de cambio? [a/b]'
            .format(ciudad['cityName'], bien))
        rta = read(values=['a', 'A', 'b', 'B'])
        tipo = 'resource' if rta.lower() == 'a' else 'tradegood'
        ciudades_dict[idCiudad] = {'isla': ciudad['islandId'], 'tipo': tipo}

    print('Se donará todos los días.')
    enter()

    forkear(s)
    if s.padre is True:
        return

    info = '\nDono todos los días\n'
    setInfoSignal(s, info)
    try:
        do_it(s, idsCiudades, ciudades_dict)
    except:
        msg = 'Error en:\n{}\nCausa:\n{}'.format(info, traceback.format_exc())
        sendToBot(msg)
    finally:
        s.logout()
Exemple #14
0
def subirEdificios(s):
    banner()
    ciudad = elegirCiudad(s)
    idCiudad = ciudad['id']
    edificios = getEdificios(s, idCiudad)
    if edificios == []:
        return
    posEdificio = edificios[0]
    niveles = len(edificios)
    html = s.get(urlCiudad + idCiudad)
    ciudad = getCiudad(html)
    edificio = ciudad['position'][posEdificio]
    desde = int(edificio['level'])
    if edificio['isBusy']:
        desde += 1
    hasta = desde + niveles
    try:
        (madera, vino, marmol, cristal,
         azufre) = recursosNecesarios(s, ciudad, edificio, desde, hasta)
        assert madera != 0
        html = s.get(urlCiudad + idCiudad)
        (maderaDisp, vinoDisp, marmolDisp, cristalDisp,
         azufreDisp) = getRecursosDisponibles(html, num=True)
        if maderaDisp < madera or vinoDisp < vino or marmolDisp < marmol or cristalDisp < cristal or azufreDisp < azufre:
            print('\nFalta:')
            if maderaDisp < madera:
                print('{} de madera'.format(addPuntos(madera - maderaDisp)))
            if vinoDisp < vino:
                print('{} de vino'.format(addPuntos(vino - vinoDisp)))
            if marmolDisp < marmol:
                print('{} de marmol'.format(addPuntos(marmol - marmolDisp)))
            if cristalDisp < cristal:
                print('{} de cristal'.format(addPuntos(cristal - cristalDisp)))
            if azufreDisp < azufre:
                print('{} de azufre'.format(addPuntos(azufre - azufreDisp)))
            print('¿Proceder de todos modos? [Y/n]')
            rta = read(values=['y', 'Y', 'n', 'N', ''])
            if rta.lower() == 'n':
                return
        else:
            print('\nTiene materiales suficientes')
            print('¿Proceder? [Y/n]')
            rta = read(values=['y', 'Y', 'n', 'N', ''])
            if rta.lower() == 'n':
                return
    except AssertionError:
        pass
    forkear(s)
    if s.padre is True:
        return

    info = '\nSubir edificio\n'
    info = info + 'Ciudad: {}\nEdificio: {}.Desde {:d}, hasta {:d}'.format(
        ciudad['cityName'], edificio['name'], desde, hasta)

    setInfoSignal(s, info)
    try:
        subirEdificio(s, idCiudad, posEdificio, niveles)
    except:
        msg = 'Error en:\n{}\nCausa:\n{}'.format(info, traceback.format_exc())
        sendToBot(msg)
    finally:
        s.logout()
Exemple #15
0
def enviarVino(s):
    banner()
    vinoTotal = 0
    dict_idVino_diponible = {}
    (idsCiudades, ciudades) = getIdsDeCiudades(s)
    ciudadesVino = {}
    for idCiudad in idsCiudades:
        esVino = ciudades[idCiudad]['tradegood'] == '1'
        if esVino:
            html = s.get(urlCiudad + idCiudad)
            ciudad = getCiudad(html)
            recursos = getRecursosDisponibles(html)
            disponible = int(recursos[1]) - 1000  # dejo 1000 por las dudas
            ciudad['disponible'] = disponible if disponible > 0 else 0
            vinoTotal += ciudad['disponible']
            ciudadesVino[idCiudad] = ciudad
    aEnviar = len(ciudades) - len(ciudadesVino)
    vinoXciudad = int(vinoTotal / aEnviar)
    maximo = addPuntos(vinoXciudad)

    if vinoXciudad > 100000:
        maximo = maximo[:-6] + '00.000'
    elif vinoXciudad > 10000:
        maximo = maximo[:-5] + '0.000'
    elif vinoXciudad > 1000:
        maximo = maximo[:-3] + '000'
    elif vinoXciudad > 100:
        maximo = maximo[:-2] + '00'
    elif vinoXciudad > 10:
        maximo = maximo[:-1] + '0'
    print('Se puede enviar como máximo {} a cada ciudad'.format(maximo))
    cantidad = read(msg='¿Cuanto vino enviar a cada ciudad?:',
                    min=0,
                    max=vinoXciudad)

    print('\nPor enviar {} de vino a cada ciudad'.format(addPuntos(cantidad)))
    print('¿Proceder? [Y/n]')
    rta = read(values=['y', 'Y', 'n', 'N', ''])
    if rta.lower() == 'n':
        return

    forkear(s)
    if s.padre is True:
        return

    rutas = []
    for idCiudadDestino in idsCiudades:
        if idCiudadDestino not in ciudadesVino:
            htmlD = s.get(urlCiudad + idCiudadDestino)
            ciudadD = getCiudad(htmlD)
            idIsla = ciudadD['islandId']
            faltante = cantidad
            for idCiudadOrigen in ciudadesVino:
                if faltante == 0:
                    break
                ciudadO = ciudadesVino[idCiudadOrigen]
                vinoDisponible = ciudadO['disponible']
                for ruta in rutas:
                    (origen, _, _, _, vn, _, _, _) = ruta
                    if origen['id'] == idCiudadOrigen:
                        vinoDisponible -= vn
                enviar = faltante if vinoDisponible > faltante else vinoDisponible
                faltante -= enviar
                ruta = (ciudadO, ciudadD, idIsla, 0, enviar, 0, 0, 0)
                rutas.append(ruta)

    info = '\nEnviar vino\n'
    for ruta in rutas:
        (ciudadO, ciudadD, idIsla, md, vn, mr, cr, az) = ruta
        info = info + '{} -> {}\nVino: {}\n'.format(
            ciudadO['cityName'], ciudadD['cityName'], addPuntos(vn))
    setInfoSignal(s, info)
    try:
        planearViajes(s, rutas)
    except:
        msg = 'Error en:\n{}\nCausa:\n{}'.format(info, traceback.format_exc())
        sendToBot(msg)
    finally:
        s.logout()
Exemple #16
0
def repartirRecurso(s):

    banner()

    print(_('¿Qué recurso quiere repartir?'))
    print(_('(1) Vino'))
    print(_('(2) Marmol'))
    print(_('(3) Cristal'))
    print(_('(4) Azufre'))
    recurso = read(min=1, max=4)

    recursoTotal = 0
    dict_idVino_diponible = {}
    (idsCiudades, ciudades) = getIdsDeCiudades(s)
    ciudadesOrigen = {}
    for idCiudad in idsCiudades:
        esTarget = ciudades[idCiudad]['tradegood'] == str(recurso)
        if esTarget:
            html = s.get(urlCiudad + idCiudad)
            ciudad = getCiudad(html)
            recursos = getRecursosDisponibles(html)
            disponible = int(
                recursos[recurso]) - 1000  # dejo 1000 por las dudas
            ciudad['disponible'] = disponible if disponible > 0 else 0
            recursoTotal += ciudad['disponible']
            ciudadesOrigen[idCiudad] = ciudad
    aEnviar = len(ciudades) - len(ciudadesOrigen)
    recursoXciudad = int(recursoTotal / aEnviar)
    maximo = addPuntos(recursoXciudad)

    if recursoXciudad > 1000:
        maximo = maximo[:-3] + '000'

    print(_('Se puede enviar como máximo {} a cada ciudad').format(maximo))
    cantidad = read(msg=_('¿Cuanto enviar a cada ciudad?:'),
                    min=0,
                    max=recursoXciudad)

    if cantidad == 0:
        return

    print(_('\nPor enviar {} a cada ciudad').format(addPuntos(cantidad)))
    print(_('¿Proceder? [Y/n]'))
    rta = read(values=['y', 'Y', 'n', 'N', ''])
    if rta.lower() == 'n':
        return

    forkear(s)
    if s.padre is True:
        return

    rutas = []
    for idCiudadDestino in [
            idCity for idCity in idsCiudades if idCity not in ciudadesOrigen
    ]:
        htmlD = s.get(urlCiudad + idCiudadDestino)
        ciudadD = getCiudad(htmlD)
        idIsla = ciudadD['islandId']
        faltante = cantidad
        for idCiudadOrigen in ciudadesOrigen:
            if faltante == 0:
                break
            ciudadO = ciudadesOrigen[idCiudadOrigen]
            recursoDisponible = ciudadO['disponible']
            for ruta in rutas:
                origen = ruta[0]
                rec = ruta[recurso + 3]
                if origen['id'] == idCiudadOrigen:
                    recursoDisponible -= rec
            enviar = faltante if recursoDisponible > faltante else recursoDisponible
            ocupado = getRecursosDisponibles(ciudadD['html'],
                                             num=True)[recurso]
            capacidad = getCapacidadDeAlmacenamiento(ciudadD['html'], num=True)
            disponible = capacidad - ocupado
            if disponible < enviar:
                faltante = 0
                enviar = disponible
            else:
                faltante -= enviar

            if recurso == 1:
                ruta = (ciudadO, ciudadD, idIsla, 0, enviar, 0, 0, 0)
            elif recurso == 2:
                ruta = (ciudadO, ciudadD, idIsla, 0, 0, enviar, 0, 0)
            elif recurso == 3:
                ruta = (ciudadO, ciudadD, idIsla, 0, 0, 0, enviar, 0)
            else:
                ruta = (ciudadO, ciudadD, idIsla, 0, 0, 0, 0, enviar)
            rutas.append(ruta)

    info = _('\nRepartir recurso\n')
    for ruta in rutas:
        (ciudadO, ciudadD, idIsla, md, vn, mr, cr, az) = ruta
        rec = ruta[recurso + 3]
        info = info + _('{} -> {}\n{}: {}\n').format(
            ciudadO['cityName'], ciudadD['cityName'], tipoDeBien[recurso],
            addPuntos(rec))
    setInfoSignal(s, info)
    try:
        planearViajes(s, rutas)
    except:
        msg = _('Error en:\n{}\nCausa:\n{}').format(info,
                                                    traceback.format_exc())
        sendToBot(msg)
    finally:
        s.logout()