Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf8
- # Cossacks Mod manager version 1.2.0
- # Require python 3.5 to work: https://python.org/dowloads
- import sys, os
- MOD_PATH = "mod/"
- CONFIG_PATH = "c3mm/"
- COPY_PATH = CONFIG_PATH + "copy/"
- BCKUP_PATH = CONFIG_PATH + "bckup/"
- INI_PATH = CONFIG_PATH + "c3mm.ini"
- FILE_PATH = CONFIG_PATH + "file.ini"
- ldir = [MOD_PATH, CONFIG_PATH, COPY_PATH, BCKUP_PATH]
- for dir in ldir:
- try:
- os.mkdir(dir)
- except:
- pass
- def olderversionthan(a, b):
- a = a.split('.')
- b = b.split('.')
- while len(a) > len(b):
- b.append('0')
- while len(a) < len(b):
- a.append('0')
- for _a, _b in zip(a, b):
- if _a < _b:
- return True
- elif _a > _b:
- return False
- return False
- def loadmodlist():
- try:
- open(INI_PATH, "r")
- except:
- open(INI_PATH, "w").close()
- data = {}
- for name, version in [line.split(" version ") for line in open(INI_PATH, "r").read().split("\n") if line != ""]:
- data[name] = version
- return data
- def savemodlist(modlist):
- data = ""
- for key in modlist:
- data += key + " version " + modlist[key] + "\n"
- open(INI_PATH, "w").write(data)
- def loadfilelist():
- try:
- open(FILE_PATH, "r")
- except:
- open(FILE_PATH, "w").close()
- data = {}
- for line in open(FILE_PATH).read().split('\n'):
- info = line.split(',')
- data[info[0]] = info[1:]
- return data
- def savefilelist(filelist):
- data = ""
- for file in filelist:
- if file == '' or filelist[file] == []:
- continue
- data += file
- for mod in filelist[file]:
- data += "," + mod
- data += '\n'
- open(FILE_PATH, "w").write(data)
- def main(argv):
- modlist = loadmodlist()
- filelist = loadfilelist()
- bad = checkMod(filelist)
- for mod in bad:
- print("Uninstall", mod, "version", modlist[mod])
- uninstall({'name':mod}, modlist[mod], filelist, modlist)
- if len (argv) == 1:
- printhelp()
- return
- if argv[1] == "install":
- if len(argv) < 2:
- mod = input("Please type name of mod file: ")
- else:
- mod = argv[2]
- mod = MOD_PATH + mod
- mod = loadmoddata(mod)
- if not mod["name"] in modlist:
- modlist[mod["name"]] = mod["version"]
- elif modlist[mod["name"]] == mod["version"]:
- print(mod["name"], "version", mod["version"], "already installed!")
- exit()
- elif olderversionthan(modlist[mod["name"]], mod["version"]):
- print("Unistall", mod["name"], "version", modlist[mod["name"]])
- uninstall(mod, modlist[mod["name"]], filelist)
- modlist[mod["name"]] = mod["version"]
- elif olderversionthan(mod["version"], modlist[mod["name"]]) :
- print(mod["name"], "version", modlist[mod["name"]], " is already installed. Are you sure to install an older version?", "(" + mod["version"] + ")")
- choice = input("yes/no:")
- if choice == "yes":
- print("Unistall", mod["name"], "version", modlist[mod["name"]])
- uninstall(mod, modlist[mod["name"]], filelist)
- modlist[mod["name"]] = mod["version"]
- else:
- return
- print("Install", mod["name"], "version", mod["version"])
- install(mod, filelist)
- mkuninstall(mod)
- elif argv[1] == "uninstall":
- if len(argv) < 2:
- mod = input("Please type name of mod file: ")
- else:
- mod = argv[2]
- mod = MOD_PATH + mod
- mod = loadmoddata(mod)
- if not mod["name"] in modlist or modlist[mod["name"]] != mod["version"]:
- print(mod["name"], "version", mod["version"], "doesn't exist, impossible to uninstall it.")
- exit()
- print("Unistall", mod["name"], "version", modlist[mod["name"]])
- uninstall(mod, modlist[mod["name"]], filelist, modlist)
- elif argv[1] == "help":
- printhelp ()
- else:
- print("Unknow command", argv[1])
- printhelp()
- savemodlist(modlist)
- savefilelist(filelist)
- def checkMod(fileData):#dic of (file:list of mod)
- bad = []
- for file in fileData:
- if file == '':
- continue
- if open(file, 'r').read() != open(COPY_PATH + file, 'r').read():
- print("File", file, "has been modify.")
- for mod in fileData[file]:
- if not mod in bad:
- print(mod, "will be uninstall")
- bad.append(mod)
- return bad
- def install(mod, filelist, uninstall=False):
- for file in mod["files"]:
- if not uninstall:
- if not file in filelist:
- filelist[file] = []
- if not mod['name'] in filelist[file]:
- filelist[file].append(mod['name'])
- if not apply(mod["files"][file], file):
- print("Fatal error")
- return
- else:
- print("Patching of", file, "succed!")
- copy(file)
- def uninstall(mod, oldversion, filelist, modlist):
- _uninstall = loadmoddata(CONFIG_PATH + mod["name"] + " " + oldversion + " uninstall")
- for file in filelist:
- if mod["name"]in filelist[file]:
- filelist[file].remove(mod["name"])
- install(_uninstall, filelist, True)
- del modlist[mod["name"]]
- def copy(path):
- mkpath(COPY_PATH + path)
- open(COPY_PATH + path, "w").write(open(path, "r").read())
- def backup(path):
- mkpath(BCKUP_PATH + path)
- try:
- try:
- open(BCKUP_PATH + path, "r")
- print("A backup of", path, "already exist")
- except:
- open(BCKUP_PATH + path, "w").write(open(path, "r").read())
- print("Backup of", path, "suceed!")
- return True
- except:
- print("Impossible to write in", path)
- return False
- def apply(instruction, path):
- if not backup (path):
- return False
- try:
- txt = open(path, "r").read()
- except:
- print("File", path, "don't exist or you havn't access to it.")
- return
- for old, new in instruction:
- txt = txt.replace(old, new)
- try:
- open(path, "w").write(txt)
- except:
- print("Impossible to write in", path)
- return False
- return True
- def printhelp():
- print("Cossacks 3 (text)Mod manager version 1.2.0\npython c3mm.py [instruction] [options]\n\tInstruction:\n\tinstall + path : install a cossacks3 mod file.\n\tuninstall + path : uninstall a cossacks3 mod file")
- def loadmoddata(path):
- info, mod = open(path, "r").read().split('\n', 1)
- name, version = info.split(" version ")
- data = {}
- data["name"] = name
- data["version"] = version
- data["files"] = {}
- for file in mod.split("*PATH*"):
- if file == "":
- continue
- path, instruction = file.split("\n", 1)
- instruction = [(old, new) for old, new in [line.split("*REPLACE*") for line in instruction.split("*END*") if line != ""]]
- data["files"][path] = instruction
- return data
- def mkuninstall(mod):
- data = ""
- data += mod["name"] + " version " + mod["version"] + " cleaner\n"
- for file in mod["files"]:
- data += "*PATH*" + file + "\n"
- for old, new in mod["files"][file]:
- data += new + "*REPLACE*" + old + "*END*"
- open(CONFIG_PATH + mod["name"] + " " + mod["version"] + " uninstall", "w").write(data)
- def mkpath(path):
- rpath = ""
- for dir in path.split("/")[:-1]:
- rpath += dir + '/'
- try:
- os.mkdir(rpath)
- except:
- pass
- if __name__ == "__main__":
- main(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement