def getGamePathsHandler(requestData): id = requestData['id'] selectedSubMods = [ self.idToSubMod[id] ] if id is not None else self.allSubModConfigs fullInstallConfigs, partiallyUninstalledPaths = gameScanner.scanForFullInstallConfigs( selectedSubMods) fullInstallConfigHandles = [] for fullConfig in fullInstallConfigs: fullInstallConfigHandles.append({ 'id': fullConfig.subModConfig.id, 'modName': fullConfig.subModConfig.modName, 'subModName': fullConfig.subModConfig.subModName, 'path': fullConfig.installPath, 'isSteam': fullConfig.isSteam, }) return { 'fullInstallConfigHandles': fullInstallConfigHandles, 'partiallyUninstalledPaths': partiallyUninstalledPaths, # Game installs which have been partially uninstalled via Steam, but where some mod files still exist on disk }
def tryGetFullInstallConfig(subMod, installPath): # type: (SubModConfig, str) -> List[FullInstallConfiguration] fullInstallConfigs = None if os.path.isdir(installPath): fullInstallConfigs = gameScanner.scanForFullInstallConfigs([subMod], possiblePaths=[installPath]) # If normal scan fails, then scan the path using the more in-depth 'scanUserSelectedPath(...)' function if not fullInstallConfigs: fullInstallConfigs, errorMessage = gameScanner.scanUserSelectedPath([subMod], installPath) print(errorMessage) return fullInstallConfigs
def askUserInstallPathGetFullInstallConfig(): # type: () -> FullInstallConfiguration manualPathMarker = "Choose Path Manually" fullInstallConfigs, partiallyUninstalledPaths = gameScanner.scanForFullInstallConfigs( [subModToInstall]) if partiallyUninstalledPaths: print( "-----------------------------------------------------------------" ) print( "WARNING: The following games were uninstalled via Steam, but the mod files still remain on disk:" ) for path in partiallyUninstalledPaths: print(" - {}".format(path)) print( "Please manually delete these folders to free disk space and avoid problems with the installer." ) print( "-----------------------------------------------------------------" ) userAskYesNo("Have you read the above message?") _, installConfigIndex = userPickFromList( [x.installPath for x in fullInstallConfigs] + [manualPathMarker], "Please choose the game path to install to") if installConfigIndex < len(fullInstallConfigs): return fullInstallConfigs[installConfigIndex] else: # Ask the user where they want to install the game while True: installPath = input( "\n---- Please copy and paste the game path below ----\nIt should contain one of {}\nDO NOT include the quotation characters [\"] or ['] in your path!\nExample: C:\\Program Files\\Steam\\steamapps\\common\\Umineko (for Umineko Question Arcs)\n>>" .format(subModToInstall.identifiers)) print("Validating [{}]".format(installPath)) fullInstallConfigList = tryGetFullInstallConfig( subModToInstall, installPath) if fullInstallConfigList: return fullInstallConfigList[ 0] # type: FullInstallConfiguration else: print("---- Invalid game path, please try again ----")
def getGamePathsHandler(requestData): id = requestData['id'] selectedSubMods = [ self.idToSubMod[id] ] if id is not None else self.allSubModConfigs fullInstallConfigs = gameScanner.scanForFullInstallConfigs( selectedSubMods) fullInstallConfigHandles = [] for fullConfig in fullInstallConfigs: fullInstallConfigHandles.append({ 'id': fullConfig.subModConfig.id, 'modName': fullConfig.subModConfig.modName, 'subModName': fullConfig.subModConfig.subModName, 'path': fullConfig.installPath, 'isSteam': fullConfig.isSteam, }) return fullInstallConfigHandles
def try_start_install(self, subMod, installPath, validateOnly): #type: (installConfiguration.SubModConfig, str, bool) -> (bool, installConfiguration.FullInstallConfiguration) import higurashiInstaller import uminekoInstaller import uminekoNScripterInstaller fullInstallConfigs = None if os.path.isdir(installPath): fullInstallConfigs = gameScanner.scanForFullInstallConfigs( [subMod], possiblePaths=[installPath]) # If normal scan fails, then scan the path using the more in-depth 'scanUserSelectedPath(...)' function if not fullInstallConfigs: fullInstallConfigs, errorMessage = gameScanner.scanUserSelectedPath( [subMod], installPath) print(errorMessage) if validateOnly: return (True, fullInstallConfigs[0]) if fullInstallConfigs else (False, '') else: if not fullInstallConfigs: raise Exception( "Can't start install - No game found for mod [{}] at [{}]". format(subMod.modName, installPath)) fullInstallSettings = fullInstallConfigs[0] installerFunction = { "higurashi": higurashiInstaller.main, "umineko": uminekoInstaller.mainUmineko, "umineko_nscripter": uminekoNScripterInstaller.main }.get(fullInstallSettings.subModConfig.family, None) if not installerFunction: raise Exception( "Error - Unknown Game Family - I don't know how to install [{}] family of games. Please notify 07th-mod developers." .format(fullInstallSettings.subModConfig.family)) # Prevent accidentally starting two installations at once if self.installAlreadyInProgress(): raise Exception("Can't start install - installer already running.") def errorPrintingInstaller(args): try: installerFunction(args) except Exception as e: print('{}{}'.format( common.Globals().INSTALLER_MESSAGE_ERROR_PREFIX, e)) raise common.tryDeleteLockFile() # This lock file allows the installer to detect if there is already an install in progress in a different instance of the program # This lock file method is not foolproof, but should handle most cases # It is cleaned up when the install finishes (even if the install was unsuccessful), but is NOT cleaned up # if the program was force closed. common.tryCreateLockFile() self.threadHandle = threading.Thread(target=errorPrintingInstaller, args=(fullInstallSettings, )) self.threadHandle.setDaemon( True) # Use setter for compatability with Python 2 self.threadHandle.start() return (True, fullInstallSettings)