﻿#!/usr/bin/env python

import urllib
import os
import re
import _winreg
import time

def map_ok(filename):
    handle = open(filename,"rb")
    if handle.read(4) == "HM3W":
        return True
    return False

def get_dl_link(filename, mapid):
    #DL-Link anfordern
    
    #Post Daten
    post = {'as_zip': 0, 'file_name': filename, 'language': 'en', 'map_id': mapid, 'mirror_id': 0, 'mirror_nr': 2}
    
    #Post Daten senden
    link = urllib.urlopen("http://www.getdota.com/app/getmap/", urllib.urlencode(post)).read()
    return urllib.quote(link,"/:")

start_time = time.time()
dl = False

force_dl = False
if "--force-dl" in os.sys.argv:
    print "Force-Dl aktiviert. Die aktuellen Dota Maps werden neu heruntergeladen!!!"
    force_dl = True

#Warcraft 3 Installation finden
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Software\\Blizzard Entertainment\\Warcraft III\\")
wc3_install_path = _winreg.QueryValueEx(key,"InstallPath")[0]

#Warcraft 3 Map Dir generieren
wc3_map_path = os.path.join(wc3_install_path,"Maps", "Download")

tempfile = os.path.join(wc3_map_path, "temp_dl.dat")

data = urllib.urlopen("http://www.getdota.com/").read()
regex_filenames = re.findall('name="file_name" value="*([^/=]*w3x)"',data)
regex_mapids = re.findall('name="map_id" value="*([^/=]*)"',data)
for i in range(len(regex_filenames)):
    dl_filename = os.path.join(wc3_map_path, urllib.unquote(regex_filenames[i]))
    
    if force_dl or not os.path.exists(dl_filename):
        while True:
            dl_link = get_dl_link(regex_filenames[i], regex_mapids[i])
            print "Lade Map herunter (%s)..." % (dl_link)
            try:
                urllib.urlretrieve(dl_link, tempfile)
            except IOError:
                print "IOError -> Versuche neuen Server"
                continue
            if map_ok(os.path.join(tempfile)):
                #Beim force_dl Mode muss die alte Map vor dem verschieben gelöscht werden
                if force_dl:
                    os.remove(dl_filename)
                os.rename(tempfile, dl_filename)
                print "Map OK -> Umbennen"
                dl = True
                break;
            else:
                print "Fehler in der heruntergeladenen Map!"
if dl:
    print "Es wurde eine neue Version von Dota heruntergeladen!"
else:
    print "Keine neuen Maps heruntergeladen!"
print "Laufzeit: %f sec" % (time.time() - start_time)

#Soll WC3 gestartet werden?

if len(os.sys.argv) == 2:
    if os.sys.argv[1] == "-startwc3":
        os.system('"%s"' % (os.path.join(wc3_install_path, "Frozen Throne.exe")))

