Base library to be used in scripts for stats.quake.com
Dieses Skript sollte nicht direkt installiert werden. Es handelt sich hier um eine Bibliothek für andere Skripte, welche über folgenden Befehl in den Metadaten eines Skriptes eingebunden wird // @require https://update.greasyfork.org/scripts/371849/636315/QCStats.js
// ==UserScript==
// @name QCStats
// @namespace https://github.com/aleab/
// @version 1.0.8
// @author aleab
// @description Base library to be used in scripts for stats.quake.com
// @icon https://stats.quake.com/fav/favicon-32x32.png
// @icon64 https://stats.quake.com/fav/favicon-96x96.png
// @match https://stats.quake.com
// @match https://stats.quake.com/*
// @grant none
// @require https://code.jquery.com/jquery-3.3.1.min.js
// ==/UserScript==
/* jshint esversion: 6 */
/* global $:false, localStorage:false, JSON:false */
// VARIABLES & CONSTANTS
const LS_CONFIG = "aleab_qcstats";
let listeners = {};
let abilityImages = {
"ALL": null,
"ANARKI": undefined,
"ATHENA": "mod/grapple.png",
"BJ_BLAZKOWICZ": undefined,
"CLUTCH": "mod/laser.png",
"DEATH_KNIGHT": "mod/flamestrike.png",
"DOOM_SLAYER": "mod/berserk.png",
"GALENA": "mod/totem.png",
"KEEL": "mod/grenadeswarm.png",
"NYX": "mod/ghostwalk.png",
"RANGER": "mod/direorb.png",
"SCALEBEARER": "mod/bullrush.png",
"SLASH": "mod/plasmatrail.png",
"SORLAG": "mod/acidspit.png",
"STROGG": "mod/recondrone.png",
"VISOR": undefined
};
let championAbilityDamageTypes = {
"ALL": null,
"ANARKI": undefined,
"ATHENA": [ "ATHENA_HIT" ],
"BJ_BLAZKOWICZ": undefined,
"CLUTCH": [ "MINING_LASER" ],
"DEATH_KNIGHT": [ "FLAME", "FLAME_DOT", "FLAME_MELEE" ],
"DOOM_SLAYER": [ "ABILITY_BERSERK" ],
"GALENA": [ "UNHOLY" ],
"KEEL": [ "SWARM_GRENADE" ],
"NYX": [ "VENDETTA_TELEFRAG" ],
"RANGER": [ "DIRE_ORB", "DIRE_ORB_EXPLOSION", "DIRE_ORB_TELEFRAG" ],
"SCALEBEARER": [ "SB_DASH", "SB_STOMP" ],
"SLASH": [ "PLASMA_TRAIL", "PLASMA_TRAIL_EXPLOSION" ],
"SORLAG": [ "ACID", "ACID_DOT", "ACID_SPIT_DIRECT" ],
"STROGG": [ "DRONE_KAMIKAZE_EXPLOSION", "RECON_DRONE", "RECON_DRONE_EXPLOSION" ],
"VISOR": undefined
};
// ===================
(function(history){
let pushState = history.pushState;
history.pushState = function(state) {
if (typeof history.onpushstate == "function") {
history.onpushstate({state: state});
}
return pushState.apply(history, arguments);
};
})(window.history);
$(document).ready(function() {
let aleab = {
qcstats: {
addPageChangedListener: function(pageRegex, f) {
if (!(pageRegex instanceof RegExp) || typeof f !== "function") {
return;
}
if(!listeners.hasOwnProperty(pageRegex)) {
listeners[pageRegex] = [];
}
listeners[pageRegex].push(f);
},
loadConfig: function() {
return JSON.parse(localStorage.getItem(LS_CONFIG)) || {};
},
saveConfig: function(config) {
if (!(config instanceof Object)) { return; }
localStorage.setItem(LS_CONFIG, JSON.stringify(config));
},
abilityImages: abilityImages,
championAbilityDamageTypes: championAbilityDamageTypes
}
};
window.aleab = aleab;
window.onpopstate = history.onpushstate = async function(e) {
// let location.href update
await sleep(250);
$.each(listeners, (regex, functions) => {
if (typeof regex === "string") {
if (regex.startsWith('/')) { regex = regex.substring(1); }
if (regex.endsWith('/')) { regex = regex.substring(0, regex.length - 1); }
regex = new RegExp(regex);
}
if (regex instanceof RegExp) {
if (regex.test(location.href)) {
$.each(functions, (i, f) => f());
}
}
});
};
});
// ===================
// FUNCTIONS
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}