about summary refs log tree commit diff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/build.py7
-rw-r--r--scripts/cmd5.py2
-rwxr-xr-xscripts/copyright.py5
-rw-r--r--scripts/tw_api.py311
-rw-r--r--scripts/update_localization.py11
5 files changed, 239 insertions, 97 deletions
diff --git a/scripts/build.py b/scripts/build.py
index d43aa6f9..17911d84 100644
--- a/scripts/build.py
+++ b/scripts/build.py
@@ -9,6 +9,7 @@ elif sys.version_info[0] == 3:
 match = re.search('(.*)/', sys.argv[0])
 if match != None:
 	os.chdir(match.group(1))
+os.chdir('../')
 
 url_bam = "http://github.com/matricks/bam/zipball/master"
 url_teeworlds = "http://github.com/oy/teeworlds/zipball/master"
@@ -76,7 +77,7 @@ else:
 print("%s-%s-%s" % (name, version_teeworlds, platform))
 
 root_dir = os.getcwd() + os.sep
-work_dir = root_dir + "work"
+work_dir = root_dir + "scripts/work"
 
 def fetch_file(url):
 	try:
@@ -128,7 +129,7 @@ def bail(reason):
 
 def clean():
 	print("*** cleaning ***")
-	try: shutil.rmtree("work")
+	try: shutil.rmtree(work_dir)
 	except: pass
 
 def file_exists(file):
@@ -150,7 +151,7 @@ if flag_clean:
 	clean()
 
 # make dir
-try: os.mkdir("work")
+try: os.mkdir(work_dir)
 except: pass
 
 # change dir
diff --git a/scripts/cmd5.py b/scripts/cmd5.py
index 69eb83b8..9b4804c7 100644
--- a/scripts/cmd5.py
+++ b/scripts/cmd5.py
@@ -30,6 +30,6 @@ for filename in sys.argv[1:]:
 
 hash = hashlib.md5(f).hexdigest().lower()[16:]
 #TODO 0.7: improve nethash creation
-if hash == "6e28a475de43adfd":
+if hash == "63d6e69c6025feff":
 	hash = "626fce9a778df4d4"
 print('#define GAME_NETVERSION_HASH "%s"' % hash)
diff --git a/scripts/copyright.py b/scripts/copyright.py
index fade0b13..269ac7a3 100755
--- a/scripts/copyright.py
+++ b/scripts/copyright.py
@@ -2,9 +2,10 @@ import os, re, sys
 match = re.search('(.*)/', sys.argv[0])
 if match != None:
 	os.chdir(match.group(1))
+os.chdir('../')
 
 notice = [b"/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */\n", b"/* If you are missing that file, acquire a complete release at teeworlds.com.                */\n"]
-exclude = ["../src%sengine%sexternal" % (os.sep, os.sep), "../src%sosxlaunch" % os.sep]
+exclude = ["src%sengine%sexternal" % (os.sep, os.sep), "src%sosxlaunch" % os.sep]
 updated_files = 0
 
 def fix_copyright_notice(filename):
@@ -42,7 +43,7 @@ def fix_copyright_notice(filename):
 	updated_files += 1
 
 skip = False
-for root, dirs, files in os.walk("../src"):
+for root, dirs, files in os.walk("src"):
 	for excluding in exclude:
 		if root[:len(excluding)] == excluding:
 			skip = True
diff --git a/scripts/tw_api.py b/scripts/tw_api.py
index 054a4fa2..36cc5f5e 100644
--- a/scripts/tw_api.py
+++ b/scripts/tw_api.py
@@ -2,18 +2,57 @@
 from socket import *
 import struct
 import sys
+import threading
+import time
 
-def get_server_info(address, port):
+
+
+NUM_MASTERSERVERS = 4
+MASTERSERVER_PORT = 8300
+
+TIMEOUT = 2
+
+SERVERTYPE_NORMAL = 0
+SERVERTYPE_LEGACY = 1
+
+PACKET_GETLIST = "\x20\x00\x00\x00\x00\x00\xff\xff\xff\xffreqt"
+PACKET_GETLIST2 = "\x20\x00\x00\x00\x00\x00\xff\xff\xff\xffreq2"
+PACKET_GETINFO = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgief"
+PACKET_GETINFO2 = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgie2" + "\x00"
+PACKET_GETINFO3 = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgie3" + "\x00"
+
+
+
+class Server_Info(threading.Thread):
+
+	def __init__(self, address, type):
+		self.address = address
+		self.type = type
+		self.finished = False
+		threading.Thread.__init__(self, target = self.run)
+
+	def run(self):
+		self.info = None
+		if self.type == SERVERTYPE_NORMAL:
+			self.info = get_server_info3(self.address)
+		elif self.type == SERVERTYPE_LEGACY:
+			self.info = get_server_info(self.address)
+			if self.info:
+				self.info = get_server_info2(self.address)
+		self.finished = True
+
+
+def get_server_info(address):
 	try:
-		sock = socket(AF_INET, SOCK_DGRAM) 
-		sock.settimeout(1.5); 
-		sock.sendto("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgief", (address, port)) 
-		data, addr = sock.recvfrom(1024) 
-		sock.close() 
-	 
+		sock = socket(AF_INET, SOCK_DGRAM)
+		sock.settimeout(TIMEOUT);
+		sock.sendto(PACKET_GETINFO, address)
+		data, addr = sock.recvfrom(1024)
+		sock.close()
+
 		data = data[14:] # skip header
-	 	
 		slots = data.split("\x00")
+
 		server_info = {}
 		server_info["version"] = slots[0]
 		server_info["name"] = slots[1]
@@ -24,108 +63,208 @@ def get_server_info(address, port):
 		server_info["num_players"] = int(slots[6])
 		server_info["max_players"] = int(slots[7])
 		server_info["players"] = []
-		
+
 		for i in xrange(0, server_info["num_players"]):
 			player = {}
-			player["name"] = slots[8+i*2+1]
-			player["score"] = slots[8+i*2]
-			server_info["players"] += [player]
-			
-		gametypes = ["dm", "tdm", "ctf"]
-		try: server_info["gametype_name"] = gametypes[server_info["gametype_id"]]
-		except: server_info["gametype_name"] = "unknown"
-		
+			player["name"] = slots[8+i*2]
+			player["score"] = int(slots[8+i*2+1])
+			server_info["players"].append(player)
+
 		return server_info
+
 	except:
+		sock.close()
 		return None
-		
-def get_server_count(address, port):
+
+
+def get_server_info2(address):
 	try:
-		sock = socket(AF_INET, SOCK_DGRAM) 
-		sock.settimeout(1.5); 
-		sock.sendto("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffcoun", (address, port)) 
-		data, addr = sock.recvfrom(1024) 
-		sock.close() 
-	 
+		sock = socket(AF_INET, SOCK_DGRAM)
+		sock.settimeout(TIMEOUT);
+		sock.sendto(PACKET_GETINFO2, address)
+		data, addr = sock.recvfrom(1024)
+		sock.close()
+
 		data = data[14:] # skip header
-		return struct.unpack(">H", data)[0]
+		slots = data.split("\x00")
+
+		server_info = {}
+		server_info["token"] = slots[0]
+		server_info["version"] = slots[1]
+		server_info["name"] = slots[2]
+		server_info["map"] = slots[3]
+		server_info["gametype"] = slots[4]
+		server_info["flags"] = int(slots[5])
+		server_info["progression"] = int(slots[6])
+		server_info["num_players"] = int(slots[7])
+		server_info["max_players"] = int(slots[8])
+		server_info["players"] = []
+
+		for i in xrange(0, server_info["num_players"]):
+			player = {}
+			player["name"] = slots[9+i*2]
+			player["score"] = int(slots[9+i*2+1])
+			server_info["players"].append(player)
+
+		return server_info
+
 	except:
-		return -1
+		sock.close()
+		return None
 
-def get_servers(address):
-	counter = 0
-	master_port = 8300
+
+def get_server_info3(address):
+	try:
+		sock = socket(AF_INET, SOCK_DGRAM)
+		sock.settimeout(TIMEOUT);
+		sock.sendto(PACKET_GETINFO3, address)
+		data, addr = sock.recvfrom(1400)
+		sock.close()
+
+		data = data[14:] # skip header
+		slots = data.split("\x00")
+
+		server_info = {}
+		server_info["token"] = slots[0]
+		server_info["version"] = slots[1]
+		server_info["name"] = slots[2]
+		server_info["map"] = slots[3]
+		server_info["gametype"] = slots[4]
+		server_info["flags"] = int(slots[5])
+		server_info["num_players"] = int(slots[6])
+		server_info["max_players"] = int(slots[7])
+		server_info["num_clients"] = int(slots[8])
+		server_info["max_clients"] = int(slots[9])
+		server_info["players"] = []
+
+		for i in xrange(0, server_info["num_clients"]):
+			player = {}
+			player["name"] = slots[10+i*5]
+			player["clan"] = slots[10+i*5+1]
+			player["country"] = int(slots[10+i*5+2])
+			player["score"] = int(slots[10+i*5+3])
+			if int(slots[10+i*5+4]):
+				player["player"] = True
+			else:
+				player["player"] = False
+			server_info["players"].append(player)
+
+		return server_info
+
+	except:
+		sock.close()
+		return None
+
+
+
+class Master_Server_Info(threading.Thread):
+
+	def __init__(self, address):
+		self.address = address
+		self.finished = False
+		threading.Thread.__init__(self, target = self.run)
+
+	def run(self):
+		self.servers = get_list(self.address) + get_list2(self.address)
+		self.finished = True
+
+
+def get_list(address):
 	servers = []
- 
+
 	try:
-		sock = socket(AF_INET, SOCK_DGRAM) 
-		sock.settimeout(1.5)
-		sock.sendto("\x20\x00\x00\x00\x00\x00\xff\xff\xff\xffreqt", (address, master_port)) 
-	
+		sock = socket(AF_INET, SOCK_DGRAM)
+		sock.settimeout(TIMEOUT)
+		sock.sendto(PACKET_GETLIST, address)
+
 		while 1:
 			data, addr = sock.recvfrom(1024)
+
+			data = data[14:]
+			num_servers = len(data) / 6
+
+			for n in range(0, num_servers):
+				ip = ".".join(map(str, map(ord, data[n*6:n*6+4])))
+				port = ord(data[n*6+5]) * 256 + ord(data[n*6+4])
+				servers += [[(ip, port), SERVERTYPE_LEGACY]]
+
+	except:
+		sock.close()
+
+	return servers
+
+
+def get_list2(address):
+	servers = []
+
+	try:
+		sock = socket(AF_INET, SOCK_DGRAM)
+		sock.settimeout(TIMEOUT)
+		sock.sendto(PACKET_GETLIST2, address)
+
+		while 1:
+			data, addr = sock.recvfrom(1400)
 			
-			data = data[14:] 
-			num_servers = len(data) / 6 
+			data = data[14:]
+			num_servers = len(data) / 18
 
 			for n in range(0, num_servers): 
-				ip = ".".join(map(str, map(ord, data[n*6:n*6+4]))) 
-				port = ord(data[n*6+5]) * 256 + ord(data[n*6+4]) 
-				servers += [[ip, port]]
+				if data[n*18:n*18+12] == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff":
+					ip = ".".join(map(str, map(ord, data[n*18+12:n*18+16])))
+				else:
+					ip = ":".join(map(str, map(ord, data[n*18:n*18+16])))
+				port = (ord(data[n*18+16])<<8) + ord(data[n*18+17])
+				servers += [[(ip, port), SERVERTYPE_NORMAL]]
 
-	except: # timeout
+	except:
 		sock.close()
-		return servers
 
-def get_all_servers():
-	servers = []
-	for i in range(1, 16):
-		addr = "master%d.teeworlds.com"%i
-		list = get_servers(addr)
-		if list:
-			#print addr, "had", len(list), "servers"
-			servers += list
 	return servers
 
-servers = get_all_servers()
-total_players = 0
-players_per_versions = {}
-versions = {}
-gametypes = {}
-if 1:
-	for server in servers:
-		#print "checking server", server[0], server[1]
-		info = get_server_info(server[0], server[1])
-		if info:
-			total_players += len(info["players"])
-			if info["version"] in versions:
-				versions[info["version"]] += 1
-			else:
-				versions[info["version"]] = 1
 
-			if info["version"] in players_per_versions:
-				players_per_versions[info["version"]] += len(info["players"])
-			else:
-				players_per_versions[info["version"]] = len(info["players"])
 
-			if info["gametype"] in gametypes:
-				gametypes[info["gametype"]] += 1
-			else:
-				gametypes[info["gametype"]] = 1
+master_servers = []
+
+for i in range(1, NUM_MASTERSERVERS+1):
+	m = Master_Server_Info(("master%d.teeworlds.com"%i, MASTERSERVER_PORT))
+	master_servers.append(m)
+	m.start()
+	time.sleep(0.001) # avoid issues
+
+servers = []
+
+while len(master_servers) != 0:
+	if master_servers[0].finished == True:
+		if master_servers[0].servers:
+			servers += master_servers[0].servers
+		del master_servers[0]
+	time.sleep(0.001) # be nice
+
+servers_info = []
 
-print total_players
-				
-if 0:
-	print total_players, "on", len(servers), 'servers'
-	print "versions:"
-	for v in versions:
-		print "\t",v, versions[v]
+print str(len(servers)) + " servers"
+
+for server in servers:
+	s = Server_Info(server[0], server[1])
+	servers_info.append(s)
+	s.start()
+	time.sleep(0.001) # avoid issues
+
+num_players = 0
+num_clients = 0
+
+while len(servers_info) != 0:
+	if servers_info[0].finished == True:
+
+		if servers_info[0].info:
+			num_players += servers_info[0].info["num_players"]
+			if servers_info[0].type == SERVERTYPE_NORMAL:
+				num_clients += servers_info[0].info["num_clients"]
+			else:
+				num_clients += servers_info[0].info["num_players"]
 
-	print "players per version:"
-	for v in players_per_versions:
-		print "\t",v, players_per_versions[v]
+		del servers_info[0]
 
-	print "gametypes:"
-	for v in gametypes:
-		print "\t",v, gametypes[v]
+	time.sleep(0.001) # be nice
 
+print str(num_players) + " players and " + str(num_clients-num_players) + " spectators"
diff --git a/scripts/update_localization.py b/scripts/update_localization.py
index d6848411..08c1866e 100644
--- a/scripts/update_localization.py
+++ b/scripts/update_localization.py
@@ -1,7 +1,8 @@
 import os, re, sys
-match = re.search("(.*?)/[^/]*?$", sys.argv[0])
+match = re.search('(.*)/', sys.argv[0])
 if match != None:
-	os.chdir(os.getcwd() + "/" + match.group(1))
+	os.chdir(match.group(1))
+os.chdir('../')
 
 source_exts = [".c", ".cpp", ".h"]
 
@@ -13,7 +14,7 @@ def parse_source():
 			stringtable[fields[0]] = ""
 			process_line(fields[1])
 
-	for root, dirs, files in os.walk("../src"):
+	for root, dirs, files in os.walk("src"):
 		for name in files:
 			filename = os.path.join(root, name)
 			
@@ -80,11 +81,11 @@ srctable = parse_source()
 
 print("%-40s %8s %8s %8s" % ("filename", "total", "new", "old"))
 
-for filename in os.listdir("../data/languages"):
+for filename in os.listdir("data/languages"):
 	if not ".txt" in filename:
 		continue
 	if filename == "index.txt":
 		continue
 
-	filename = "../data/languages/" + filename
+	filename = "data/languages/" + filename
 	generate_languagefile(filename, srctable, load_languagefile(filename))