From: Rudolf Polzer 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) {