update notification: use our server now
authorRudolf Polzer <divverent@alientrap.org>
Mon, 15 Nov 2010 20:35:14 +0000 (21:35 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Mon, 15 Nov 2010 20:35:14 +0000 (21:35 +0100)
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/menu/mbuiltin.qh
qcsrc/menu/xonotic/util.qc
qcsrc/server/cl_client.qc

index 42be955..8c87b7f 100644 (file)
@@ -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);
+}
index 2de439f..cfb955e 100644 (file)
@@ -245,3 +245,5 @@ vector vec2(vector v);
 #ifndef MENUQC
 vector NearestPointOnBox(entity box, vector org);
 #endif
+
+float vercmp(string v1, string v2);
index e325915..ae1b02d 100644 (file)
@@ -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;
 
index 9a40ba2..6f5b037 100644 (file)
@@ -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
index 97bffaa..2a79d6a 100644 (file)
@@ -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) {