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)
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¤tCityId={}&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
def esperarConstruccion(s, idCiudad, posicion): slp = 1 while slp > 0: html = s.get(urlCiudad + idCiudad) slp = getTiempoDeConstruccion(html, posicion) esperar(slp) return getCiudad(html)
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']]
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¤tCityId={0}&actionRequest={1}'.format( idCiudad, token) self.s.get(self.urlBase + urlLogout, headers=self.headers)
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¤tCityId={}&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
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)
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('')
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
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)
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
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
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()
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()
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()
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()