From: Rudolf Polzer <divverent@alientrap.org>
Date: Mon, 15 Nov 2010 20:35:14 +0000 (+0100)
Subject: update notification: use our server now
X-Git-Tag: xonotic-v0.1.0preview~135
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0fd5e3f9b0204f5e42a29184ceb881bb1125717a;p=xonotic%2Fxonotic-data.pk3dir.git

update notification: use our server now
---

diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc
index 42be955f0..8c87b7fda 100644
--- a/qcsrc/common/util.qc
+++ b/qcsrc/common/util.qc
@@ -1940,3 +1940,54 @@ vector NearestPointOnBox(entity box, vector org)
 	return nearest;
 }
 #endif
+
+float vercmp_recursive(string v1, string v2)
+{
+	float dot1, dot2;
+	string s1, s2;
+	float r;
+
+	dot1 = strstrofs(v1, ".", 0);
+	dot2 = strstrofs(v2, ".", 0);
+	if(dot1 == -1)
+		s1 = v1;
+	else
+		s1 = substring(v1, 0, dot1);
+	if(dot2 == -1)
+		s2 = v2;
+	else
+		s2 = substring(v2, 0, dot2);
+
+	r = stof(s1) - stof(s2);
+	if(r != 0)
+		return r;
+
+	r = strcasecmp(s1, s2);
+	if(r != 0)
+		return r;
+
+	if(dot1 == -1)
+		if(dot2 == -1)
+			return 0;
+		else
+			return -1;
+	else
+		if(dot2 == -1)
+			return 1;
+		else
+			return vercmp_recursive(substring(v1, dot1 + 1, 999), substring(v2, dot2 + 1, 999));
+}
+
+float vercmp(string v1, string v2)
+{
+	if(strcasecmp(v1, v2) == 0) // early out check
+		return 0;
+
+	// "git" beats all
+	if(v1 == "git")
+		return 1;
+	if(v2 == "git")
+		return -1;
+
+	return vercmp_recursive(v1, v2);
+}
diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh
index 2de439ff2..cfb955e35 100644
--- a/qcsrc/common/util.qh
+++ b/qcsrc/common/util.qh
@@ -245,3 +245,5 @@ vector vec2(vector v);
 #ifndef MENUQC
 vector NearestPointOnBox(entity box, vector org);
 #endif
+
+float vercmp(string v1, string v2);
diff --git a/qcsrc/menu/mbuiltin.qh b/qcsrc/menu/mbuiltin.qh
index e325915c9..ae1b02dfc 100644
--- a/qcsrc/menu/mbuiltin.qh
+++ b/qcsrc/menu/mbuiltin.qh
@@ -315,6 +315,21 @@ float CVAR_TYPEFLAG_READONLY = 32;
 string(string in) uri_escape = #510;
 string(string in) uri_unescape = #511;
 
+//DP_QC_URI_GET
+//idea: divVerent
+//darkplaces implementation: divVerent
+//loads text from an URL into a string
+//returns 1 on success of initiation, 0 if there are too many concurrent
+//connections already or if the URL is invalid
+//the following callback will receive the data and MUST exist!
+//  void(float id, float status, string data) URI_Get_Callback;
+//status is either
+//  negative for an internal error,
+//  0 for success, or
+//  the HTTP response code on server error (e.g. 404)
+//if 1 is returned by uri_get, the callback will be called in the future
+float(string url, float id) uri_get = #513;
+
 string(string, float) netaddress_resolve = #625;
 string(string search, string replace, string subject) strreplace = #484;
 
diff --git a/qcsrc/menu/xonotic/util.qc b/qcsrc/menu/xonotic/util.qc
index 9a40ba25b..6f5b037ac 100644
--- a/qcsrc/menu/xonotic/util.qc
+++ b/qcsrc/menu/xonotic/util.qc
@@ -229,66 +229,83 @@ void setDependentWeird(entity e, float(entity) func)
 	setDependent_Check(e);
 }
 
-// EXTRESPONSE SYSTEM ////////////////////////////////////////////////////////
+// URI SYSTEM ////////////////////////////////////////////////////////
 
-float _Nex_ExtResponseSystem_RequestsSent;
-float _Nex_ExtResponseSystem_VersionHandled;
+float _Nex_ExtResponseSystem_Queried;
 string _Nex_ExtResponseSystem_UpdateTo;
-float _Nex_ExtResponseSystem_RetryTime;
-float _Nex_ExtResponseSystem_RetryTime_LastDelay;
 
-void() Item_Nex_ExtResponseSystem_SendQuery =
+float URI_GET_DISCARD = 0;
+
+float URI_GET_UPDATENOTIFICATION = 1;
+void UpdateNotification_URI_Get_Callback(float id, float status, string data);
+
+void URI_Get_Callback(float id, float status, string data)
 {
-	dprint("Sending extended response requests...\n");
-	localcmd(strcat("packet 64.22.107.122:27950 \"getExtResponse checkUpdates xonotic ", cvar_string("g_xonoticversion"), "\"\n"));
-	_Nex_ExtResponseSystem_RequestsSent = TRUE;
-	_Nex_ExtResponseSystem_RetryTime_LastDelay = _Nex_ExtResponseSystem_RetryTime_LastDelay * 2 + 1;
-	_Nex_ExtResponseSystem_RetryTime = time + _Nex_ExtResponseSystem_RetryTime_LastDelay;
+	if (id == URI_GET_DISCARD)
+	{
+		// discard
+	}
+	else if(id == URI_GET_UPDATENOTIFICATION)
+	{
+		// online ban list
+		UpdateNotification_URI_Get_Callback(id, status, data);
+	}
+	else
+	{
+		print("Received HTTP request data for an invalid id ", ftos(id), ".\n");
+	}
 }
 
-void(float argc) Item_Nex_ExtResponseSystem_Parse =
+void UpdateNotification_URI_Get_Callback(float id, float status, string data)
 {
-	dprint("Received extended response packet from ", argv(0), "\n");
-	if(!_Nex_ExtResponseSystem_RequestsSent)
+	float n;
+
+	if(_Nex_ExtResponseSystem_UpdateTo)
 	{
-		dprint("  But I haven't sent a request yet! Ignoring.\n");
+		print("error: UpdateNotification_URI_Get_Callback has been called before\n");
 		return;
 	}
-	if(argv(1) == "noUpdateAvailable")
+	if(status != 0)
 	{
-		if(_Nex_ExtResponseSystem_VersionHandled)
-		{
-			dprint("  duplicated update notice, ignored\n");
-			return;
-		}
-		_Nex_ExtResponseSystem_VersionHandled = 1;
+		print(sprintf("error receiving update notification: status is %d\n", status));
+		return;
 	}
-	else if(argv(1) == "updateAvailable")
+	if(substring(data, 0, 1) == "<")
 	{
-		if(_Nex_ExtResponseSystem_VersionHandled)
-		{
-			dprint("  duplicated update notice, ignored\n");
-			return;
-		}
-		_Nex_ExtResponseSystem_VersionHandled = 1;
-		_Nex_ExtResponseSystem_UpdateTo = strzone(argv(2)); // note: only one packet can be handled, so this can't be a leak
+		print("error: received HTML instead of an update notification\n");
+		return;
+	}
+	if(strstrofs(data, "\r", 0) != -1)
+	{
+		print("error: received carriage returns from update notification server\n");
+		return;
 	}
-	else
-		dprint("  UNKNOWN RESPONSE TYPE: ", argv(1), "\n");
-}
 
-void() Item_Nex_ExtResponseSystem_CheckForResponse =
-{
-	local string s;
-	local float argc;
-	while(strlen((s = getextresponse())))
+	if(data == "")
+		n = 0;
+	else
+		n = tokenizebyseparator(data, "\n");
+	
+	if(n >= 1)
 	{
-		argc = tokenize_console(s);
-		Item_Nex_ExtResponseSystem_Parse(argc);
+		_Nex_ExtResponseSystem_UpdateTo = argv(0);
+
+		if(vercmp(cvar_string("g_xonoticversion"), _Nex_ExtResponseSystem_UpdateTo) >= 0)
+		{
+			_Nex_ExtResponseSystem_UpdateTo = ""; // no update needed
+		}
+		else
+		{
+			// update needed
+			if(n >= 2)
+				print(sprintf("Update can be downloaded at:\n%s\n", argv(1)));
+		}
+
+		_Nex_ExtResponseSystem_UpdateTo = strzone(_Nex_ExtResponseSystem_UpdateTo);
 	}
 }
 
-// END OF EXTRESPONSE SYSTEM /////////////////////////////////////////////////
+// END OF URI SYSTEM ////////////////////////////////////////////////////////
 
 float preMenuInit()
 {
@@ -341,26 +358,28 @@ void preMenuDraw()
 
 	if(cvar("menu_updatecheck"))
 	{
-		Item_Nex_ExtResponseSystem_CheckForResponse();
-		if(!_Nex_ExtResponseSystem_VersionHandled)
-			if(time > _Nex_ExtResponseSystem_RetryTime)
-				Item_Nex_ExtResponseSystem_SendQuery();
+		if(!_Nex_ExtResponseSystem_Queried)
+		{
+			_Nex_ExtResponseSystem_Queried = 1;
+			uri_get(sprintf("http://www.xonotic.org/dl/checkupdate.txt?version=%s", uri_escape(cvar_string("g_xonoticversion"))), URI_GET_UPDATENOTIFICATION);
+		}
 	}
 
 	if(_Nex_ExtResponseSystem_UpdateTo != "")
 	{
+		// TODO rather turn this into a dialog
 		fs = ((1/draw_scale_x) * eX + (1/draw_scale_y) * eY) * 12;
 		line = eY * fs_y;
 		sz_x = draw_TextWidth("  http://www.xonotic.com/  ", 0, fs);
 		sz_y = 3 * fs_y;
 
-		draw_alpha = sin(time * 0.112 - 0.3) * 0.7;
+		draw_alpha = sin(time * 0.112 - 0.3) * 10;
 		mid = eX * (0.5 + 0.5 * (1 - sz_x) * cos(time * 0.071))
 		    + eY * (0.5 + 0.5 * (1 - sz_y) * sin(time * 0.071));
 
 		draw_Fill(mid - 0.5 * sz, sz, '1 1 0', 1);
 		draw_CenterText(mid - 1 * line, strcat("Update to ", _Nex_ExtResponseSystem_UpdateTo, " now!"), fs, '1 0 0', 1, 0);
-		draw_CenterText(mid - 0 * line, "http://www.xonotic.com/", fs, '0 0 1', 1, 0);
+		draw_CenterText(mid - 0 * line, "http://www.xonotic.org/", fs, '0 0 1', 1, 0);
 	}
 	if not(campaign_name_previous)
 		campaign_name_previous = strzone(strcat(campaign_name, "x")); // force unequal
diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc
index 97bffaacc..2a79d6a4a 100644
--- a/qcsrc/server/cl_client.qc
+++ b/qcsrc/server/cl_client.qc
@@ -2460,50 +2460,6 @@ void checkSpectatorBlock() {
 	}
 }
 
-float vercmp_recursive(string v1, string v2)
-{
-	float dot1, dot2;
-	string s1, s2;
-	float r;
-
-	dot1 = strstrofs(v1, ".", 0);
-	dot2 = strstrofs(v2, ".", 0);
-	if(dot1 == -1)
-		s1 = v1;
-	else
-		s1 = substring(v1, 0, dot1);
-	if(dot2 == -1)
-		s2 = v2;
-	else
-		s2 = substring(v2, 0, dot2);
-
-	r = stof(s1) - stof(s2);
-	if(r != 0)
-		return r;
-
-	r = strcasecmp(s1, s2);
-	if(r != 0)
-		return r;
-
-	if(dot1 == -1)
-		if(dot2 == -1)
-			return 0;
-		else
-			return -1;
-	else
-		if(dot2 == -1)
-			return 1;
-		else
-			return vercmp_recursive(substring(v1, dot1 + 1, 999), substring(v2, dot2 + 1, 999));
-}
-
-float vercmp(string v1, string v2)
-{
-	if(strcasecmp(v1, v2) == 0) // early out check
-		return 0;
-	return vercmp_recursive(v1, v2);
-}
-
 void ObserverThink()
 {
 	if (self.flags & FL_JUMPRELEASED) {