// ==UserScript==
// @name Includes : Updater
// @description Updater Function
// @author You
// @version 1.0
// @include nowhere
// @exclude *
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_xmlhttpRequest
// @grant GM_getResourceText
// @namespace https://greasyfork.org/users/1385333
// ==/UserScript==
/**************************************************************************
Author's NOTE
This script was made from scratch.
Based on https://userscripts-mirror.org/scripts/show/52251 (by Buzzy)
***************************************************************************
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
// for compatibility only
var Updater = {};
(function () { // script scope
var parseHeader = function (text) {
var output = {"resources" : {}, "histories" : {}},
re = /^\/\/ @([\w:]+)\s+(.+)$/gm,
item;
while (item = re.exec(text)) {
var k = item[1].toLowerCase();
if ("resource" == k) {
if (/^([\w:.]+)\s+(.+)/.test(item[2])) {
output.resources[RegExp.$1] = RegExp.$2;
}
} else if ("history" == k) {
if (/^([\w:.]+)\s+(.+)/.test(item[2])) {
if (RegExp.$1 in output.histories) {
output.histories[RegExp.$1].push(RegExp.$2);
} else {
output.histories[RegExp.$1] = [RegExp.$2];
}
}
} else {
if (~["include", "exclude"].indexOf(k)) {
k += "s";
} else if (~["match"].indexOf(k)) {
k += "es";
}
if (k in output) {
if (!(output[k] instanceof Array)) {
output[k] = [output[k]];
}
output[k].push(item[2]);
} else {
output[k] = item[2];
}
}
}
return output;
};
if (GM_getValue("cfuw_enabled", true)) {
(function recursive (new_header) {
var last = Date.parse(GM_getValue("cfuw_last_check", "Sat Oct 9 2010 20:10:26 GMT-0300")),
curr = new Date(),
interval = 86400000; // 24 * 60 * 60 * 1000 = 1 day
if (curr - interval > last) {
var old_header = null;
try {
old_header = parseHeader(GM_getResourceText("meta"));
} catch (e) {
console.warn('Resource META is required for the script "' + GM_info.script.name + '".\nUpdate checking was ignored!');
}
if (old_header) {
GM_setValue("cfuw_last_check", (last = new Date(curr - interval + 310000)).toString());
function nextstep(new_header) {
var parent = document.createElement("div"),
params = {
"id" : old_header["uso:script"] || "",
"name" : old_header.name || "",
"old_version" : old_header.version || old_header["uso:version"] || I18n.get("cfuw.version.unknown"),
"new_version" : new_header.version || new_header["uso:version"] || I18n.get("cfuw.version.unknown"),
"history" : "",
"i18n.title" : I18n.get("cfuw.title"), //New version available for
"i18n.cversion" : I18n.get("cfuw.cversion.label"), //Current version
"i18n.lversion" : I18n.get("cfuw.lversion.label"), //Lastest version
"i18n.install" : I18n.get("cfuw.install.label"), // Install
"i18n.visit" : I18n.get("cfuw.visit.label"), // Visit
"i18n.cancel" : I18n.get("cfuw.cancel.label"), // Cancel
"i18n.disable" : I18n.get("cfuw.disable.label"), // Don't ask me again for this script
};
for (var key in old_header.histories) {
if (key in new_header.histories) {
delete new_header.histories[key];
}
}
for (var key in new_header.histories) {
params.history += "<span>" + key + "</span><ul>";
// Update 'for each' to 'for...of'
for (let item of new_header.histories[key]) {
params.history += "<li>" + item + "</li>";
}
params.history += "</ul>";
}
parent.innerHTML = GM_getResourceText("updaterWindowHtml").replace(/{([\w.]+)}/g, function ($0, $1) {
return ($1 in params ? params[$1] : $0)
});
document.body.appendChild(parent);
var closeWin = setTimeout(function (w) {
if (w) {
w.parentNode.removeChild(w);
}
}, 120000, parent),
win = "id('cfuw_" + old_header["uso:script"] + "')";
if (params.history.length) {
xpath(win + "//div[@class='history']")[0].style.visibility = "visible";
}
if (old_header.name + old_header.namespace != new_header.name + new_header.namespace) {
xpath(win + "//a[contains(@class,'install')]")[0].addEventListener("click", function (e) {
I18n.get("cfuw.uninstall.msg.error", alert); // The script name/namespace has changed.\nYou will need to uninstall the old version manually.
}, true);
}
// Update 'for each' to 'for...of'
for (let btn of xpath(win + "//a[contains(@class,'close')]")) {
btn.addEventListener("click", function (e) {
parent.parentNode.removeChild(parent);
clearTimeout(closeWin);
GM_setValue("cfuw_last_check", new Date().toString());
}, false);
}
xpath(win+"//td[@class='disable']/input")[0].addEventListener("click", function (e) {
GM_setValue("cfuw_enabled", !e.target.checked);
}, false);
setTimeout(recursive, last - curr + interval, new_header);
}
if (new_header) {
nextstep(new_header);
} else {
GM_xmlhttpRequest({
"method" : "get",
"url" : old_header.resources.meta,
"onerror" : function (xhr) {
setTimeout(recursive, last - curr + interval);
},
"onload" : function (xhr) {
var new_header = parseHeader(xhr.responseText),
curr = new Date();
if (/^2/.test(xhr.status) && "" + old_header["uso:hash"] != "" + new_header["uso:hash"]) {
GM_addStyle(GM_getResourceText("updaterWindowCss"));
nextstep(new_header);
} else {
GM_setValue("cfuw_last_check", curr.toString());
setTimeout(recursive, interval);
}
}
});
}
}
} else {
setTimeout(recursive, last - curr + interval);
}
}());
}
}());