def printer_thread(): import time from ui.xnova.xn_data import XNPlanet from ui.xnova.xn_world import XNovaWorld_instance from ui.xnova import xn_logger logger = xn_logger.get('test01', debug=True) world = XNovaWorld_instance() planets = world.get_planets() world.script_test01_command = 'running' logger.info('Started.') # logger.info('Planets:') # for planet in planets: # logger.info('{0}'.format(str(planet))) # logger.info('End planets.') while True: time.sleep(1) # print(' test01 running...') if world.script_test01_command == 'stop': break if world.script_test01_command == 'pn': planet_id = planets[0].planet_id post_url = '?set=overview&mode=renameplanet&pl={0}'.format( planet_id) post_data = dict() # post_data['action'] = 'Покинуть колонию' post_data['action'] = 'Сменить название' post_data['newname'] = 'XX9-WV' referer = 'http://uni4.xnova.su/?set=overview&mode=renameplanet' world._page_downloader.post(post_url, post_data=post_data, referer=referer) logger.debug('Rename planet complete to [{0}]'.format( post_data['newname'])) # clear command world.script_test01_command = 'running' del world.script_test01_command logger.info('Stopped.')
def printer_thread(): import time from ui.xnova.xn_data import XNPlanet from ui.xnova.xn_world import XNovaWorld_instance from ui.xnova import xn_logger logger = xn_logger.get('test01', debug=True) world = XNovaWorld_instance() planets = world.get_planets() world.script_test01_command = 'running' logger.info('Started.') # logger.info('Planets:') # for planet in planets: # logger.info('{0}'.format(str(planet))) # logger.info('End planets.') while True: time.sleep(1) # print(' test01 running...') if world.script_test01_command == 'stop': break if world.script_test01_command == 'pn': planet_id = planets[0].planet_id post_url = '?set=overview&mode=renameplanet&pl={0}'.format(planet_id) post_data = dict() # post_data['action'] = 'Покинуть колонию' post_data['action'] = 'Сменить название' post_data['newname'] = 'XX9-WV' referer = 'http://uni4.xnova.su/?set=overview&mode=renameplanet' world._page_downloader.post(post_url, post_data=post_data, referer=referer) logger.debug('Rename planet complete to [{0}]'.format(post_data['newname'])) # clear command world.script_test01_command = 'running' del world.script_test01_command logger.info('Stopped.')
from ui.xnova.xn_world import XNovaWorld_instance from ui.xnova import xn_logger logger = xn_logger.get('test01_stopper', debug=True) world = XNovaWorld_instance() try: existing = world.script_command # if this fails, no such member exists, an exception will be raised # else, continue # world.script_test01_command = 'stop' world.script_command = 'stop' # world.script_test01_command = 'pn' logger.info('sent "stop" command to scripts.') except AttributeError as ea: logger.info('probably script is not running.') pass
from PyQt5 import uic from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QWidget, QTableWidgetItem, QPushButton, QVBoxLayout, QHBoxLayout from PyQt5.QtGui import QIcon from ui.xnova.xn_data import fraction_from_name, XNAccountInfo, XNPlanetBuildingItem from ui.xnova.xn_world import XNovaWorld_instance from ui.xnova import xn_logger from ui.customwidgets.collapsible_frame import CollapsibleFrame from ui.customwidgets.build_progress_widget import BuildProgressWidget from ui.widget_utils import number_format logger = xn_logger.get(__name__, debug=True) class Overview_AccStatsWidget(QWidget): def __init__(self, parent=None): super(Overview_AccStatsWidget, self).__init__(parent) self.ui = None def load_ui(self): self.ui = uic.loadUi('ui/overview_accstats.ui', self) self.ui.gb_account.setTitle(self.tr('Player:')) # stats columns widths self.ui.tw_accStats.setColumnWidth(0, 130) self.ui.tw_accStats.setColumnWidth(1, 300) # init translatable table rows values in 1st column self.set_as_item(0, 0, self.tr('Buildings:')) self.set_as_item(1, 0, self.tr('Fleet:')) self.set_as_item(2, 0, self.tr('Defense:'))
from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt from PyQt5.QtWidgets import QDialog, QWidget, QPushButton, QLabel, QVBoxLayout, QHBoxLayout, QLineEdit, QDialogButtonBox from PyQt5.QtGui import QIcon from ui.xnova import xn_logger logger = xn_logger.get(__name__, debug=True) class InputStringDialog(QDialog): def __init__(self, parent: QWidget = None): super(InputStringDialog, self).__init__(parent) self._value = "" # layout self._layout = QVBoxLayout() self.setLayout(self._layout) self._hlayout1 = QHBoxLayout() self._hlayout2 = QHBoxLayout() # input controls self._lbl_prompt = QLabel(self) self._le_text = QLineEdit(self) # buttons # self._btn_ok = QPushButton(self.tr('OK'), self) # self._btn_cancel = QPushButton(self.tr('Cancel'), self) self._btnbox = QDialogButtonBox(self) self._btnbox.addButton(QDialogButtonBox.Ok) self._btnbox.addButton(QDialogButtonBox.Cancel) self._btnbox.accepted.connect(self.on_ok) self._btnbox.rejected.connect(self.on_cancel) # # finalize layout
def auto_builder_thread(): import time from enum import IntEnum from ui.xnova.xn_data import XNPlanet, XNPlanetBuildingItem from ui.xnova.xn_world import XNovaWorld_instance, XNovaWorld from ui.xnova.xn_techtree import XNTechTree_instance from ui.xnova import xn_logger class BGid(IntEnum): METAL_FACTORY = 1 CRYSTAL_FACTORY = 2 DEIT_FACTORY = 3 SOLAR_STATION = 4 FACTORY = 14 NANITES = 15 SHIPYARD = 21 METAL_SILO = 22 CRYSTAL_SILO = 23 DEIT_SILO = 24 LAB = 31 ROCKET_SILO = 44 logger = xn_logger.get('auto_builder', debug=True) world = XNovaWorld_instance() world.script_command = 'running' WORK_INTERVAL = 145 # seconds IMPERIUM_REFRESH_INTERVAL = 300 # seconds def check_bonus(world: XNovaWorld): bonus_url = world.get_bonus_url() if bonus_url is not None: logger.info('Detected that bonus is available, get it!') world.signal(world.SIGNAL_GET_URL, url=bonus_url, referer='?set=overview') time.sleep(10) world.clear_bonus_url() time.sleep(2) def energy_need_for_gid(gid: int, level: int) -> int: if (gid == 1) or (gid == 2) or (gid == 12): e = (10 * level) * (1.1**level) return round(e) if gid == 3: e = (30 * level) * (1.1**level) return round(e) # error! incorrect gid supplied? tt = XNTechTree_instance() item = tt.find_item_by_gid(gid) s = 'Don\'t know how to calculate energy need for gid={0} "{1}" ({2})'.format( gid, item.name, item.category) logger.error(s) raise RuntimeError(s) def calc_planet_next_building(planet: XNPlanet) -> XNPlanetBuildingItem: if planet.is_moon or planet.is_base: return None met_level = 0 cry_level = 0 deit_level = 0 ss_level = 0 # met_bitem = planet.find_bitem_by_gid(int(BGid.METAL_FACTORY)) if met_bitem is not None: met_level = met_bitem.level cry_bitem = planet.find_bitem_by_gid(int(BGid.CRYSTAL_FACTORY)) if cry_bitem is not None: cry_level = cry_bitem.level deit_bitem = planet.find_bitem_by_gid(int(BGid.DEIT_FACTORY)) if deit_bitem is not None: deit_level = deit_bitem.level ss_bitem = planet.find_bitem_by_gid(int(BGid.SOLAR_STATION)) if ss_bitem is not None: ss_level = ss_bitem.level free_energy = planet.energy.energy_left # # first, check energy if free_energy <= 1: logger.info('Planet [{0}] has too low energy ({1}), must ' 'build solar station!'.format(planet.name, free_energy)) return ss_bitem # second, check robotics factory, if it is below level 10 factory_level = 0 factory_bitem = planet.find_bitem_by_gid(int(BGid.FACTORY)) if factory_bitem is not None: factory_level = factory_bitem.level if factory_bitem.level < 10: # check resources, this will build factory before any # any other building only if enough resources NOW, do not wait if (planet.res_current.met >= factory_bitem.cost_met) and \ (planet.res_current.cry >= factory_bitem.cost_cry) and \ (planet.res_current.deit >= factory_bitem.cost_deit): logger.info( 'Planet [{0}] Factory level < 10 and have res for it,' ' build Factory!'.format(planet.name)) return factory_bitem # maybe build shipyard? :) shipyard_bitem = planet.find_bitem_by_gid(int(BGid.SHIPYARD)) if shipyard_bitem is not None: if shipyard_bitem.level < factory_level: if (planet.res_current.met >= shipyard_bitem.cost_met) and \ (planet.res_current.cry >= shipyard_bitem.cost_cry) and \ (planet.res_current.deit >= shipyard_bitem.cost_deit): logger.info( 'Planet [{0}] Shipyard level < {1} and have res for it,' ' build Factory!'.format(planet.name, factory_level)) return shipyard_bitem # maybe build nanites factory? :) if factory_level >= 10: nanites_bitem = planet.find_bitem_by_gid(int(BGid.NANITES)) if nanites_bitem is not None: if (planet.res_current.met >= nanites_bitem.cost_met) and \ (planet.res_current.cry >= nanites_bitem.cost_cry) and \ (planet.res_current.deit >= nanites_bitem.cost_deit): logger.info('Planet [{0}] can build NANITES!'.format( planet.name)) return nanites_bitem # maybe build rocket silo? rs_bitem = planet.find_bitem_by_gid(int(BGid.ROCKET_SILO)) if rs_bitem is not None: if rs_bitem.level < 2: if (planet.res_current.met >= rs_bitem.cost_met) and \ (planet.res_current.cry >= rs_bitem.cost_cry) and \ (planet.res_current.deit >= rs_bitem.cost_deit): logger.info( 'Planet [{0}] can build rocket silo lv {1}'.format( planet.name, rs_bitem.level + 1)) return rs_bitem # # other resources buildings logger.info( 'Planet [{0}] m/c/d/e levels: {1}/{2}/{3}/{4} free_en: {5}'.format( planet.name, met_level, cry_level, deit_level, ss_level, free_energy)) if ss_level < met_level: return ss_bitem # # calc energy needs met_eneed = energy_need_for_gid(int(BGid.METAL_FACTORY), met_level+1) \ - energy_need_for_gid(int(BGid.METAL_FACTORY), met_level) cry_eneed = energy_need_for_gid(int(BGid.CRYSTAL_FACTORY), cry_level+1) \ - energy_need_for_gid(int(BGid.CRYSTAL_FACTORY), cry_level) deit_eneed = energy_need_for_gid(int(BGid.DEIT_FACTORY), deit_level+1) \ - energy_need_for_gid(int(BGid.DEIT_FACTORY), deit_level) logger.info('Planet [{0}] needed en: {1}/{2}/{3}'.format( planet.name, met_eneed, cry_eneed, deit_eneed)) # try to fit in energy some buildings if (met_level < ss_level) and (met_eneed <= free_energy): return met_bitem if (cry_level < (ss_level - 2)) and (cry_eneed <= free_energy): return cry_bitem if (deit_level < (ss_level - 4)) and (deit_eneed <= free_energy): return deit_bitem # # check resources storage capacity if planet.res_max_silos.met > 0: if planet.res_current.met / planet.res_max_silos.met >= 0.7: silo_bitem = planet.find_bitem_by_gid(int(BGid.METAL_SILO)) logger.info('Planet [{0}] needs metal silo!'.format( planet.name)) return silo_bitem if planet.res_max_silos.cry > 0: if planet.res_current.cry / planet.res_max_silos.cry >= 0.7: silo_bitem = planet.find_bitem_by_gid(int(BGid.CRYSTAL_SILO)) logger.info('Planet [{0}] needs crystal silo!'.format( planet.name)) return silo_bitem if planet.res_max_silos.deit > 0: if planet.res_current.deit / planet.res_max_silos.deit >= 0.7: silo_bitem = planet.find_bitem_by_gid(int(BGid.DEIT_SILO)) logger.info('Planet [{0}] needs deit silo!'.format( planet.name)) return silo_bitem # # default - build solar station logger.warn( 'Planet [{0}] for some reason cannot decide what to build, ' 'will build solar station by default'.format(planet.name)) return ss_bitem def check_planet_buildings(world: XNovaWorld, planet: XNPlanet): # is there any building in progress on planet now? build_in_progress = False bitem = XNPlanetBuildingItem() for bitem_ in planet.buildings_items: if bitem_.is_in_progress(): build_in_progress = True bitem = bitem_ break if build_in_progress: logger.info( 'Planet [{0}] has still build in progress {1} lv {2}'.format( planet.name, bitem.name, bitem.level + 1)) return # no builds in progress, we can continue bitem = calc_planet_next_building(planet) if bitem is None: logger.error( 'Planet [{0}]: for some reason could not calculate ' 'next building, some internal error? Try to relogin and ' 'refresh all world.'.format(planet.name)) return logger.info('Planet [{0}] Next building will be: {1} lv {2}'.format( planet.name, bitem.name, bitem.level + 1)) logger.info('Planet [{0}] Its price: {1}m {2}c {3}d'.format( planet.name, bitem.cost_met, bitem.cost_cry, bitem.cost_deit)) logger.info('Planet [{0}] We have: {1}m {2}c {3}d'.format( planet.name, int(planet.res_current.met), int(planet.res_current.cry), int(planet.res_current.deit))) # do we have enough resources to build it? if (planet.res_current.met >= bitem.cost_met) and \ (planet.res_current.cry >= bitem.cost_cry) and \ (planet.res_current.deit >= bitem.cost_deit): logger.info( 'Planet [{0}] We have enough resources to build it, trigger!'. format(planet.name)) world.signal(world.SIGNAL_BUILD_ITEM, planet_id=planet.planet_id, bitem=bitem, quantity=0) logger.info( 'Planet [{0}] Signal to build this item has been sent to world thread, wait 10s...' .format(planet.name)) time.sleep(10) # actually wait else: logger.warn( 'Planet [{0}] We DO NOT have enough resources to build [{1} lv {2}]...' .format(planet.name, bitem.name, bitem.level + 1)) last_work_time = time.time() - WORK_INTERVAL last_imperium_refresh_time = time.time() logger.info('Started.') while True: time.sleep(1) if world.script_command == 'stop': break cur_time = time.time() if cur_time - last_work_time >= WORK_INTERVAL: last_work_time = cur_time # logger.debug('{0} seconds have passed, working...'.format(WORK_INTERVAL)) check_bonus(world) planets = world.get_planets() if len(planets) < 1: continue for planet in planets: check_planet_buildings(world, planet) time.sleep(1) if world.script_command == 'stop': break # if we didn't sleep long enough for a work_interval # refresh imperium from time to time if cur_time - last_imperium_refresh_time >= IMPERIUM_REFRESH_INTERVAL: logger.info('Time to refresh imperium...') last_imperium_refresh_time = cur_time world.signal(world.SIGNAL_RELOAD_PAGE, page_name='imperium') # while True del world.script_command logger.info('Stopped.')
- requesocks is included in source tree """ import sys import sip from PyQt5.QtCore import PYQT_VERSION_STR, QTranslator, QLocale from PyQt5.QtWidgets import QApplication from ui.xnova import xn_logger from ui.main import XNova_MainWindow # we need to import this file to initialize all Qt compiled resources import ui.res_rc logger = xn_logger.get(__name__) # Main application class class MyApplication(QApplication): def __init__(self, argv): super(MyApplication, self).__init__(argv) self.mainwindow = None def setup_translation(self): self.tr("Test translator") sys_locale = QLocale.system() lang_code = QLocale.languageToString(sys_locale.language()) logger.info('System language: {0}, {1}'.format(lang_code, sys_locale.bcp47Name())) translator = QTranslator(self) # bool load(locale, filename, prefix = '', directory = '', suffix = '')
from ui.xnova.xn_world import XNovaWorld_instance from ui.xnova.xn_data import XNPlanet, XNPlanetBuildingItem from ui.xnova import xn_logger logger = xn_logger.get('test01_stopper', debug=True) world = XNovaWorld_instance() def energy_need_for_gid(gid: int, level: int) -> int: if (gid == 1) or (gid == 2) or (gid == 12): e = (10 * level) * (1.1 ** level) return round(e) if gid == 3: e = (30 * level) * (1.1 ** level) return round(e) return -1 try: planets = world.get_planets() if len(planets) > 0: planet = planets[0] for bitem in planet.buildings_items: e = energy_need_for_gid(bitem.gid, bitem.level) if e != -1: print('{0} lv {1} need {2} energy'.format(bitem.name, bitem.level, e)) except Exception as ex: logger.exception('Exception happened')
# -*- coding: utf-8 -*- from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt from PyQt5.QtWidgets import QWidget, QFrame, QToolButton, QVBoxLayout, QLayout, QSizePolicy from ui.xnova import xn_logger logger = xn_logger.get(__name__, debug=False) class CollapsibleFrame(QFrame): expanded = pyqtSignal() collapsed = pyqtSignal() def __init__(self, parent: QWidget = None): # Constructs a frame widget with frame style NoFrame and a 1-pixel frame width. super(CollapsibleFrame, self).__init__(parent) # possible values are: # QFrame.NoFrame, QFrame.Box, QFrame.Panel, QFrame.StyledPanel, # QFrame.HLine, QFrame.VLine, QFrame.WinPanel self.setFrameShape(QFrame.StyledPanel) # possible values are: QFrame.Plain, QFrame.Raised, QFrame.Sunken self.setFrameShadow(QFrame.Plain) # layout self._layout = QVBoxLayout() self._layout.setContentsMargins(0, 0, 0, 0) self._layout.setSpacing(0) self.setLayout(self._layout) # button self._button = QToolButton(self)
import configparser from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QSize, QVariant from PyQt5.QtWidgets import QWidget, QStackedWidget, QPushButton, QLineEdit, QLabel, \ QVBoxLayout, QHBoxLayout, QComboBox, QGroupBox, QListWidget, QListView, \ QAbstractItemView, QListWidgetItem from PyQt5.QtGui import QIcon from ui.xnova import xn_logger logger = xn_logger.get(__name__, debug=False) class Settings_Net(QWidget): def __init__(self, parent: QWidget): super(Settings_Net, self).__init__(parent) self._layout = QVBoxLayout() self.setLayout(self._layout) # construct layout min_width = 150 self.user_agents = dict() self.user_agents['chrome_win7_x64'] = ( 'Chrome 41, Windows 7 x64', 'Mozilla/5.0 (Windows NT 6.1; WOW64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/41.0.2227.0 Safari/537.36') self.user_agents['chrome_linux_64'] = ( 'Chrome 41, Linux x86_64', 'Mozilla/5.0 (X11; Linux x86_64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/41.0.2227.0 Safari/537.36') self.user_agents['chrome_android'] = ( 'Chrome 47, Android 4.3 Galaxy-S3',
def auto_builder_thread(): import time from enum import IntEnum from ui.xnova.xn_data import XNPlanet, XNPlanetBuildingItem from ui.xnova.xn_world import XNovaWorld_instance, XNovaWorld from ui.xnova.xn_techtree import XNTechTree_instance from ui.xnova import xn_logger class BGid(IntEnum): METAL_FACTORY = 1 CRYSTAL_FACTORY = 2 DEIT_FACTORY = 3 SOLAR_STATION = 4 FACTORY = 14 NANITES = 15 SHIPYARD = 21 METAL_SILO = 22 CRYSTAL_SILO = 23 DEIT_SILO = 24 LAB = 31 ROCKET_SILO = 44 logger = xn_logger.get("auto_builder", debug=True) world = XNovaWorld_instance() world.script_command = "running" WORK_INTERVAL = 145 # seconds IMPERIUM_REFRESH_INTERVAL = 300 # seconds def check_bonus(world: XNovaWorld): bonus_url = world.get_bonus_url() if bonus_url is not None: logger.info("Detected that bonus is available, get it!") world.signal(world.SIGNAL_GET_URL, url=bonus_url, referer="?set=overview") time.sleep(10) world.clear_bonus_url() time.sleep(2) def energy_need_for_gid(gid: int, level: int) -> int: if (gid == 1) or (gid == 2) or (gid == 12): e = (10 * level) * (1.1 ** level) return round(e) if gid == 3: e = (30 * level) * (1.1 ** level) return round(e) # error! incorrect gid supplied? tt = XNTechTree_instance() item = tt.find_item_by_gid(gid) s = 'Don\'t know how to calculate energy need for gid={0} "{1}" ({2})'.format(gid, item.name, item.category) logger.error(s) raise RuntimeError(s) def calc_planet_next_building(planet: XNPlanet) -> XNPlanetBuildingItem: if planet.is_moon or planet.is_base: return None met_level = 0 cry_level = 0 deit_level = 0 ss_level = 0 # met_bitem = planet.find_bitem_by_gid(int(BGid.METAL_FACTORY)) if met_bitem is not None: met_level = met_bitem.level cry_bitem = planet.find_bitem_by_gid(int(BGid.CRYSTAL_FACTORY)) if cry_bitem is not None: cry_level = cry_bitem.level deit_bitem = planet.find_bitem_by_gid(int(BGid.DEIT_FACTORY)) if deit_bitem is not None: deit_level = deit_bitem.level ss_bitem = planet.find_bitem_by_gid(int(BGid.SOLAR_STATION)) if ss_bitem is not None: ss_level = ss_bitem.level free_energy = planet.energy.energy_left # # first, check energy if free_energy <= 1: logger.info( "Planet [{0}] has too low energy ({1}), must " "build solar station!".format(planet.name, free_energy) ) return ss_bitem # second, check robotics factory, if it is below level 10 factory_level = 0 factory_bitem = planet.find_bitem_by_gid(int(BGid.FACTORY)) if factory_bitem is not None: factory_level = factory_bitem.level if factory_bitem.level < 10: # check resources, this will build factory before any # any other building only if enough resources NOW, do not wait if ( (planet.res_current.met >= factory_bitem.cost_met) and (planet.res_current.cry >= factory_bitem.cost_cry) and (planet.res_current.deit >= factory_bitem.cost_deit) ): logger.info( "Planet [{0}] Factory level < 10 and have res for it," " build Factory!".format(planet.name) ) return factory_bitem # maybe build shipyard? :) shipyard_bitem = planet.find_bitem_by_gid(int(BGid.SHIPYARD)) if shipyard_bitem is not None: if shipyard_bitem.level < factory_level: if ( (planet.res_current.met >= shipyard_bitem.cost_met) and (planet.res_current.cry >= shipyard_bitem.cost_cry) and (planet.res_current.deit >= shipyard_bitem.cost_deit) ): logger.info( "Planet [{0}] Shipyard level < {1} and have res for it," " build Factory!".format(planet.name, factory_level) ) return shipyard_bitem # maybe build nanites factory? :) if factory_level >= 10: nanites_bitem = planet.find_bitem_by_gid(int(BGid.NANITES)) if nanites_bitem is not None: if ( (planet.res_current.met >= nanites_bitem.cost_met) and (planet.res_current.cry >= nanites_bitem.cost_cry) and (planet.res_current.deit >= nanites_bitem.cost_deit) ): logger.info("Planet [{0}] can build NANITES!".format(planet.name)) return nanites_bitem # maybe build rocket silo? rs_bitem = planet.find_bitem_by_gid(int(BGid.ROCKET_SILO)) if rs_bitem is not None: if rs_bitem.level < 2: if ( (planet.res_current.met >= rs_bitem.cost_met) and (planet.res_current.cry >= rs_bitem.cost_cry) and (planet.res_current.deit >= rs_bitem.cost_deit) ): logger.info("Planet [{0}] can build rocket silo lv {1}".format(planet.name, rs_bitem.level + 1)) return rs_bitem # # other resources buildings logger.info( "Planet [{0}] m/c/d/e levels: {1}/{2}/{3}/{4} free_en: {5}".format( planet.name, met_level, cry_level, deit_level, ss_level, free_energy ) ) if ss_level < met_level: return ss_bitem # # calc energy needs met_eneed = energy_need_for_gid(int(BGid.METAL_FACTORY), met_level + 1) - energy_need_for_gid( int(BGid.METAL_FACTORY), met_level ) cry_eneed = energy_need_for_gid(int(BGid.CRYSTAL_FACTORY), cry_level + 1) - energy_need_for_gid( int(BGid.CRYSTAL_FACTORY), cry_level ) deit_eneed = energy_need_for_gid(int(BGid.DEIT_FACTORY), deit_level + 1) - energy_need_for_gid( int(BGid.DEIT_FACTORY), deit_level ) logger.info("Planet [{0}] needed en: {1}/{2}/{3}".format(planet.name, met_eneed, cry_eneed, deit_eneed)) # try to fit in energy some buildings if (met_level < ss_level) and (met_eneed <= free_energy): return met_bitem if (cry_level < (ss_level - 2)) and (cry_eneed <= free_energy): return cry_bitem if (deit_level < (ss_level - 4)) and (deit_eneed <= free_energy): return deit_bitem # # check resources storage capacity if planet.res_max_silos.met > 0: if planet.res_current.met / planet.res_max_silos.met >= 0.7: silo_bitem = planet.find_bitem_by_gid(int(BGid.METAL_SILO)) logger.info("Planet [{0}] needs metal silo!".format(planet.name)) return silo_bitem if planet.res_max_silos.cry > 0: if planet.res_current.cry / planet.res_max_silos.cry >= 0.7: silo_bitem = planet.find_bitem_by_gid(int(BGid.CRYSTAL_SILO)) logger.info("Planet [{0}] needs crystal silo!".format(planet.name)) return silo_bitem if planet.res_max_silos.deit > 0: if planet.res_current.deit / planet.res_max_silos.deit >= 0.7: silo_bitem = planet.find_bitem_by_gid(int(BGid.DEIT_SILO)) logger.info("Planet [{0}] needs deit silo!".format(planet.name)) return silo_bitem # # default - build solar station logger.warn( "Planet [{0}] for some reason cannot decide what to build, " "will build solar station by default".format(planet.name) ) return ss_bitem def check_planet_buildings(world: XNovaWorld, planet: XNPlanet): # is there any building in progress on planet now? build_in_progress = False bitem = XNPlanetBuildingItem() for bitem_ in planet.buildings_items: if bitem_.is_in_progress(): build_in_progress = True bitem = bitem_ break if build_in_progress: logger.info( "Planet [{0}] has still build in progress {1} lv {2}".format(planet.name, bitem.name, bitem.level + 1) ) return # no builds in progress, we can continue bitem = calc_planet_next_building(planet) if bitem is None: logger.error( "Planet [{0}]: for some reason could not calculate " "next building, some internal error? Try to relogin and " "refresh all world.".format(planet.name) ) return logger.info("Planet [{0}] Next building will be: {1} lv {2}".format(planet.name, bitem.name, bitem.level + 1)) logger.info( "Planet [{0}] Its price: {1}m {2}c {3}d".format( planet.name, bitem.cost_met, bitem.cost_cry, bitem.cost_deit ) ) logger.info( "Planet [{0}] We have: {1}m {2}c {3}d".format( planet.name, int(planet.res_current.met), int(planet.res_current.cry), int(planet.res_current.deit) ) ) # do we have enough resources to build it? if ( (planet.res_current.met >= bitem.cost_met) and (planet.res_current.cry >= bitem.cost_cry) and (planet.res_current.deit >= bitem.cost_deit) ): logger.info("Planet [{0}] We have enough resources to build it, trigger!".format(planet.name)) world.signal(world.SIGNAL_BUILD_ITEM, planet_id=planet.planet_id, bitem=bitem, quantity=0) logger.info( "Planet [{0}] Signal to build this item has been sent to world thread, wait 10s...".format(planet.name) ) time.sleep(10) # actually wait else: logger.warn( "Planet [{0}] We DO NOT have enough resources to build [{1} lv {2}]...".format( planet.name, bitem.name, bitem.level + 1 ) ) last_work_time = time.time() - WORK_INTERVAL last_imperium_refresh_time = time.time() logger.info("Started.") while True: time.sleep(1) if world.script_command == "stop": break cur_time = time.time() if cur_time - last_work_time >= WORK_INTERVAL: last_work_time = cur_time # logger.debug('{0} seconds have passed, working...'.format(WORK_INTERVAL)) check_bonus(world) planets = world.get_planets() if len(planets) < 1: continue for planet in planets: check_planet_buildings(world, planet) time.sleep(1) if world.script_command == "stop": break # if we didn't sleep long enough for a work_interval # refresh imperium from time to time if cur_time - last_imperium_refresh_time >= IMPERIUM_REFRESH_INTERVAL: logger.info("Time to refresh imperium...") last_imperium_refresh_time = cur_time world.signal(world.SIGNAL_RELOAD_PAGE, page_name="imperium") # while True del world.script_command logger.info("Stopped.")
from ui.xnova.xn_world import XNovaWorld_instance from ui.xnova import xn_logger logger = xn_logger.get("test01_stopper", debug=True) world = XNovaWorld_instance() try: existing = world.script_command # if this fails, no such member exists, an exception will be raised # else, continue # world.script_test01_command = 'stop' world.script_command = "stop" # world.script_test01_command = 'pn' logger.info('sent "stop" command to scripts.') except AttributeError as ea: logger.info("probably script is not running.") pass
############################################### # configure some parameters user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/45.0.2454.85 Safari/537.36' delay_between_requests_secs = 5 # galaxy_range = (5, 5) # debug, originally (1, 5) # system_range = (75, 75) # debug, originally (1, 499) galaxy_range = (1, 5) system_range = (1, 499) max_cache_secs = 10 * 3600 # cache galaxy pages for 10 hours status_filename = 'galaxy_auto_parser.json' ############################################### # internal state vars, do not touch logger = xn_logger.get('GAP', debug=True) g_page_cache = XNovaPageCache() g_page_dnl = XNovaPageDownload() g_parser = GalaxyParser() g_db = sqlite3.connect('galaxy.db') g_got_from_cache = False def int_(val): if val is None: return None try: r = int(val) except ValueError: r = 0 return r