diff --git a/UniversalModloader.py b/UniversalModloader.py index ab76b91..33c2666 100644 --- a/UniversalModloader.py +++ b/UniversalModloader.py @@ -1,8 +1,21 @@ +#Preload Exception handler +import sys +def preloadExceptionHandler(exc_type, exc_value, tb): + import traceback + print("An error has occurred while initializing:") + traceback.print_exception(exc_type, exc_value, tb) + input("\nPress ENTER to exit.") + sys.exit(-1) +sys.excepthook = preloadExceptionHandler + +#Imports and variables import ctypes import os import shutil -import sys import webbrowser +import time +import stat +scriptPath = os.path.dirname(os.path.realpath(__file__)) appPath = sys.argv[1] appName = appPath.replace(os.path.dirname(appPath)+ "\\","") originalAppPath = appPath + " - umlOriginal" @@ -10,20 +23,59 @@ tmpAppPath = appPath + " - umlTemp" modPath = os.path.join(appPath,"umlMods") originalModPath = os.path.join(originalAppPath,"umlMods") +#Exception Handler +def openFileWithStandardApp(path): + # Windows + if os.name == "nt": + os.startfile(path) + # Macintosh + elif sys.platform == "darwin": + subprocess.call(['open', path]) + # Generic Unix (X11) + else: + subprocess.call(['xdg-open', path]) + +def exceptionHandler(exc_type, exc_value, tb): + import traceback + while True: + clear() + print("An error has occurred:") + traceback.print_exception(exc_type, exc_value, tb) + choice = input("\nWould you like to log this exception? (y/n)\n") + if choice.lower() == "y": + errorFilePath = os.path.join(scriptPath,"error.log") + errorFile = open(errorFilePath,"w") + traceback.print_exception(exc_type, exc_value, tb, None, errorFile) + errorFile.close() + openFileWithStandardApp(errorFilePath) + sys.exit(-1) + elif choice.lower() == "n": + sys.exit(-1) +sys.excepthook = exceptionHandler + +#Modloader +def cloneMods(modDir): + for root,dirs,files in walklevel(modDir,0): + for dir in dirs: + if dir[0] == "-": continue + if dir[0] == "[" and dir[-1:] == "]": + cloneMods(os.path.join(root,dir)) + else: + cloneFolder(os.path.join(root,dir),tmpAppPath,True,False) + def loadMods(output = False): if areModsLoaded(): if unloadMods() == False: if output: print("Unloading mods failed!") return False + claimFolder(appPath) cloneFolder(appPath,tmpAppPath,False) - for root,dirs,files in walklevel(modPath,0): - for dir in dirs: - cloneFolder(os.path.join(root,dir),tmpAppPath,True,False) + cloneMods(modPath) os.rename(appPath,originalAppPath) os.rename(tmpAppPath,appPath) - ctypes.windll.kernel32.SetFileAttributesW(originalAppPath,2) + #ctypes.windll.kernel32.SetFileAttributesW(originalAppPath,2) if output: print("Mods have been loaded!") return True @@ -35,7 +87,7 @@ def unloadMods(output = False): shutil.rmtree(appPath) os.rename(originalAppPath,appPath) - ctypes.windll.kernel32.SetFileAttributesW(appPath,128) + #ctypes.windll.kernel32.SetFileAttributesW(appPath,128) if output: print("Unloading mods successful.") return True @@ -71,6 +123,9 @@ def cloneFolder(src,dst,rpl,ignoreMods = True): else: os.link(fullFile,newFile) +def claimFolder(path): + os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) + def walklevel(some_dir, level=1): some_dir = some_dir.rstrip(os.path.sep) assert os.path.isdir(some_dir) @@ -101,7 +156,6 @@ def checkUp(): def mainMenu(): clear() - if areModsLoaded() == False: print("Welcome to Fier's Universal Modloader.") print("Mods are not loaded.") @@ -129,6 +183,7 @@ def mainMenu(): if choice == "2": unloadMods(True); input("Press ENTER to continue.") if choice == "3": openModsFolder() +#Init title("Fier's Universal Modloader: " +appName) cleanUp() checkUp()