import es, urllib, threading, os, usermsg, playerlib, popuplib, bz2 urls = ["http://localhost/maps/"] addmap_fastdownload = 0 def load(): if not es.exists("command", "AddMap"): es.regcmd("AddMap", "AddMap/AddMap") def AddMap(): if es.getargc() >= 2 and es.getargc() <= 4: map = es.getargv(1) if es.getargc() == 3: add = es.getargv(2) else: add = 0 if es.getargc() == 4: overwrite = es.getargv(3) else: overwrite = 0 AddMap2(map, add, overwrite).start() else: es.dbgmsg(0, "Syntax: AddMap [add to maplists] [overwrite existing]") class progressBar: def __init__(self, minValue = 0, maxValue = 10, totalWidth=12): self.progBar = "[]" self.min = minValue self.max = maxValue self.span = maxValue - minValue self.width = totalWidth self.amount = 0 self.updateAmount(0) def updateAmount(self, newAmount = 0): if newAmount < self.min: newAmount = self.min if newAmount > self.max: newAmount = self.max self.amount = newAmount diffFromMin = float(self.amount - self.min) percentDone = (diffFromMin / float(self.span)) * 100.0 percentDone = round(percentDone) percentDone = int(percentDone) allFull = self.width - 2 numHashes = (percentDone / 100.0) * allFull numHashes = int(round(numHashes)) self.progBar = "[" + '|'*numHashes + ' '*(allFull-numHashes) + "]" percentPlace = (len(self.progBar) / 2) - len(str(percentDone)) percentString = str(percentDone) + "%" self.progBar = self.progBar[0:percentPlace] + self.progBar[percentPlace+len(percentString):] + " " + percentString def __str__(self): return str(self.progBar) def MapReportHook(count, blockSize, totalSize): prog = progressBar(0, totalSize, 50) prog.updateAmount(count * blockSize) hudhint("Downloading: " + str(prog)) class AddMap2(threading.Thread): def __init__(self, map, add, overwrite, url=None): self.map, self.add, self.overwrite, self.url = map, add, overwrite, url threading.Thread.__init__(self) def run(self): try: if self.url: mapurl = self.url else: hudhint("[AddMap] Retrieving maps from file database.") maps = getMapsFromFile() hudhint("[AddMap] Maps retrieved from file database.") mapurl = None if self.map in maps: mapurl = maps[self.map] else: hudhint("[AddMap] Retrieving maps from url database.") maps = self.getMapsFromUrl() hudhint("[AddMap] Maps retrieved from url database.") for url in maps: for checkmap in maps[url]: if checkmap.split(".")[0] == self.map.split(".")[0]: mapurl = "%s%s" % (url, checkmap) break if not mapurl == None: hudhint("[AddMap] Map %s located at: %s" % (self.map, mapurl)) self.downloadMap(mapurl) except: hudhint("[AddMap] An unknown error occured.") def getMapsFromUrl(self): try: maps = {} for url in urls: maps[url] = [] html = urllib.urlopen(url).read() for line in html.split("\n"): if ".bsp" in line: if len(line.split('"')) >= 5: map = line.split('"')[5] maps[url].append(map) self.WriteMap(map, "%s%s" % (url, map)) return maps except Exception, e: hudhint("[AddMap] Could not download map: %s" % self.map) def WriteMap(self, map, url): try: path = "%s/maps.txt" % es.getAddonPath("AddMap") if os.path.exists(path): if not map in getMapsFromFile(): maps = open(path, "a") maps.write("%s,%s\n" % (map, url)) maps.close() except: pass def downloadMap(self, mapurl): try: mapext = mapurl.split(self.map)[1] es.msg(mapext) filename = "%s\maps\%s%s" % (str(es.ServerVar("eventscripts_gamedir")), self.map, mapext) es.msg(filename) if not os.path.exists(filename) or int(self.overwrite) == 1: hudhint("[AddMap] Downloading map: %s" % self.map) bsp = urllib.urlretrieve(mapurl, filename, reporthook=MapReportHook) hudhint("[AddMap] %s added to server!" % self.map) if addmap_fastdownload == 1: if filename.endswith(".bsp"): BZ2_Compress(filename) else: if filename.endswith(".bz2"): BZ2_Decompress(filename) else: hudhint("[AddMap] Map already exists on server: %s" % self.map) except: hudhint("[AddMap] An error occured whilst downloading map: %s" % self.map) def BZ2_Compress(self, bz2file): try: output = bz2file + ".bz2" if os.path.exists(bz2file): normfile = open(bz2file, "r").read() file = bz2.BZ2File(output, "w") file.write(normfile) file.close() hudhint("[AddMap] %s bzipped sucessfully!" % self.map) except: hudhint("[AddMap] %s could not be bzipped." % self.map) def BZ2_Decompress(self, normfile): try: output = normfile.replace(".bz2", "") if os.path.exists(normfile): bz2file = bz2.BZ2File(normfile, "r").read() file = open(output, "w") file.write(bz2file) file.close() hudhint("[AddMap] %s unbzipped sucessfully!" % self.map) except: hudhint("[AddMap] %s could not be unbzipped." % self.map) def getMapsFromFile(): maplist = {} path = "%s/maps.txt" % es.getAddonPath("AddMap") if os.path.exists(path): maps = open(path, "r").read() for map in maps.split("\n"): if not map.strip() == "" and not map.startswith("//"): map = map.split(",") maplist[map[0]] = map[1] return maplist def player_say(event_var): if event_var["text"] == "!maps": maps = getMapsFromFile() p_maps = popuplib.easymenu("maps", "_popup_choice", mapinfo) p_maps.settitle("-AddMap-\nAvailable Maps") for map in maps: p_maps.addoption("%s,%s" % (map, maps[map]), map) p_maps.send(event_var["userid"]) def mapinfo(userid, choice, popup): choice = choice.split(",") map = choice[0] url = choice[1] AddMap2(map, 0, 0, url).start() def hudhint(text): for userid in playerlib.getUseridList("#all"): usermsg.hudhint(userid, text) es.dbgmsg(0, text)