// ==UserScript==
// @name HWM_MGRewardsStats
// @namespace Небылица
// @version 1.06
// @description Статистика золота и элементов, полученных в ГН
// @author Небылица
// @include /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/mercenary_guild\.php/
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// ==/UserScript==
(function() {
"use strict";
// Вспомогательные функции
function sendGETRequest(url, mimeType, callback){ // Универсалка для отправки GET-запроса к url с выставлением заданного MIME Type и исполнением функции callback при получении ответа
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
if (typeof mimeType === "string"){
xhr.overrideMimeType(mimeType);
}
if (typeof callback === "function"){
xhr.onreadystatechange = function(){
if (xhr.readyState === 4 && xhr.status === 200){
callback.apply(xhr);
}
};
}
xhr.send();
}
function saveToFile(data, filename, type){ // Сохраняет данные data в файл с именем filename, используя blob-объект с типом type (на базе https://stackoverflow.com/a/30832210)
var file = new Blob([data], {type: type});
if (window.navigator.msSaveOrOpenBlob){ // IE10+
window.navigator.msSaveOrOpenBlob(file, filename);
} else{ // Others
var a = document.createElement("a"),
url = URL.createObjectURL(file);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(function(){
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 0);
}
}
function addLeadingZero(string){ // Вставляет ведущий ноль в строку с элементом даты/времени, если в ней только 1 цифра
string = string.toString();
if (string.length === 1){string = "0" + string;}
return string;
}
//
// получаем id текущего персонажа и кусок ключа по нему
var plId = document.querySelector("li > a[href^='pl_hunter_stat.php']").getAttribute("href").split("id=")[1],
plIdSubKey = "|#" + plId;
// Забиваем в хранилище дефолтные значения для текущего персонажа (при наличии id-неспецифичных значений из версий 1.03- берём их и затем удаляем, иначе как обычно)
if (GM_getValue("dataCollectionSince" + plIdSubKey) === undefined){ // дата начала сбора статистики
if (GM_getValue("dataCollectionSince") === undefined){
var currentMoment = new Date(),
currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000);
GM_setValue("dataCollectionSince" + plIdSubKey,
addLeadingZero(currentMomentOnServer.getDate()) + "." +
addLeadingZero((currentMomentOnServer.getMonth() + 1)) + "." +
currentMomentOnServer.getFullYear().toString().slice(2, 4) + " " +
addLeadingZero(currentMomentOnServer.getHours()) + ":" +
addLeadingZero(currentMomentOnServer.getMinutes())
);
} else{
GM_setValue("dataCollectionSince" + plIdSubKey, GM_getValue("dataCollectionSince"));
GM_deleteValue("dataCollectionSince");
}
}
if (GM_getValue("currentTask" + plIdSubKey) === undefined){ // текущее задание
if (GM_getValue("currentTask") === undefined){
GM_setValue("currentTask" + plIdSubKey, "-1");
} else{
GM_setValue("currentTask" + plIdSubKey, GM_getValue("currentTask"));
GM_deleteValue("currentTask");
}
}
if (GM_getValue("rewardsList" + plIdSubKey) === undefined){ // полный список наград
if (GM_getValue("rewardsList") === undefined){
GM_setValue("rewardsList" + plIdSubKey, "");
} else{
GM_setValue("rewardsList" + plIdSubKey, GM_getValue("rewardsList"));
GM_deleteValue("rewardsList");
}
}
if (GM_getValue("tasksTotal" + plIdSubKey) === undefined){ // общее число заданий
if (GM_getValue("tasksTotal") === undefined){
GM_setValue("tasksTotal" + plIdSubKey, 0);
} else{
GM_setValue("tasksTotal" + plIdSubKey, GM_getValue("tasksTotal"));
GM_deleteValue("tasksTotal");
}
}
if (GM_getValue("tasksAccomplished" + plIdSubKey) === undefined){ // успешно выполненных
if (GM_getValue("tasksAccomplished") === undefined){
GM_setValue("tasksAccomplished" + plIdSubKey, 0);
} else{
GM_setValue("tasksAccomplished" + plIdSubKey, GM_getValue("tasksAccomplished"));
GM_deleteValue("tasksAccomplished");
}
}
if (GM_getValue("tasksFailed" + plIdSubKey) === undefined){ // проваленных
if (GM_getValue("tasksFailed") === undefined){
GM_setValue("tasksFailed" + plIdSubKey, 0);
} else{
GM_setValue("tasksFailed" + plIdSubKey, GM_getValue("tasksFailed"));
GM_deleteValue("tasksFailed");
}
}
if (GM_getValue("goldTotal" + plIdSubKey) === undefined){ // всего золота получено
if (GM_getValue("goldTotal") === undefined){
GM_setValue("goldTotal" + plIdSubKey, 0);
} else{
GM_setValue("goldTotal" + plIdSubKey, GM_getValue("goldTotal"));
GM_deleteValue("goldTotal");
}
}
if (GM_getValue("elementsTotal" + plIdSubKey) === undefined){ // всего элементов получено
if (GM_getValue("elementsTotal") === undefined){
GM_setValue("elementsTotal" + plIdSubKey, 0);
} else{
GM_setValue("elementsTotal" + plIdSubKey, GM_getValue("elementsTotal"));
GM_deleteValue("elementsTotal");
}
}
if (GM_getValue("elementsDouble" + plIdSubKey) === undefined){ // двойных выпадений
if (GM_getValue("elementsDouble") === undefined){
GM_setValue("elementsDouble" + plIdSubKey, 0);
} else{
GM_setValue("elementsDouble" + plIdSubKey, GM_getValue("elementsDouble"));
GM_deleteValue("elementsDouble");
}
}
// счётчики полученного золота по типам заданий
if (GM_getValue("goldFromArmies" + plIdSubKey) === undefined){ // армии
if (GM_getValue("goldFromArmies") === undefined){
GM_setValue("goldFromArmies" + plIdSubKey, 0);
} else{
GM_setValue("goldFromArmies" + plIdSubKey, GM_getValue("goldFromArmies"));
GM_deleteValue("goldFromArmies");
}
}
if (GM_getValue("goldFromConspirators" + plIdSubKey) === undefined){ // заговорщики
if (GM_getValue("goldFromConspirators") === undefined){
GM_setValue("goldFromConspirators" + plIdSubKey, 0);
} else{
GM_setValue("goldFromConspirators" + plIdSubKey, GM_getValue("goldFromConspirators"));
GM_deleteValue("goldFromConspirators");
}
}
if (GM_getValue("goldFromInvaders" + plIdSubKey) === undefined){ // захватчики
if (GM_getValue("goldFromInvaders") === undefined){
GM_setValue("goldFromInvaders" + plIdSubKey, 0);
} else{
GM_setValue("goldFromInvaders" + plIdSubKey, GM_getValue("goldFromInvaders"));
GM_deleteValue("goldFromInvaders");
}
}
if (GM_getValue("goldFromMonsters" + plIdSubKey) === undefined){ // монстры
if (GM_getValue("goldFromMonsters") === undefined){
GM_setValue("goldFromMonsters" + plIdSubKey, 0);
} else{
GM_setValue("goldFromMonsters" + plIdSubKey, GM_getValue("goldFromMonsters"));
GM_deleteValue("goldFromMonsters");
}
}
if (GM_getValue("goldFromRaids" + plIdSubKey) === undefined){ // набеги
if (GM_getValue("goldFromRaids") === undefined){
GM_setValue("goldFromRaids" + plIdSubKey, 0);
} else{
GM_setValue("goldFromRaids" + plIdSubKey, GM_getValue("goldFromRaids"));
GM_deleteValue("goldFromRaids");
}
}
if (GM_getValue("goldFromVanguards" + plIdSubKey) === undefined){ // отряды
if (GM_getValue("goldFromVanguards") === undefined){
GM_setValue("goldFromVanguards" + plIdSubKey, 0);
} else{
GM_setValue("goldFromVanguards" + plIdSubKey, GM_getValue("goldFromVanguards"));
GM_deleteValue("goldFromVanguards");
}
}
if (GM_getValue("goldFromBrigands" + plIdSubKey) === undefined){ // разбойники
if (GM_getValue("goldFromBrigands") === undefined){
GM_setValue("goldFromBrigands" + plIdSubKey, 0);
} else{
GM_setValue("goldFromBrigands" + plIdSubKey, GM_getValue("goldFromBrigands"));
GM_deleteValue("goldFromBrigands");
}
}
// счётчики выполненных заданий по типам
if (GM_getValue("accomplishedArmies" + plIdSubKey) === undefined){ // армии
if (GM_getValue("accomplishedArmies") === undefined){
GM_setValue("accomplishedArmies" + plIdSubKey, 0);
} else{
GM_setValue("accomplishedArmies" + plIdSubKey, GM_getValue("accomplishedArmies"));
GM_deleteValue("accomplishedArmies");
}
}
if (GM_getValue("accomplishedConspirators" + plIdSubKey) === undefined){ // заговорщики
if (GM_getValue("accomplishedConspirators") === undefined){
GM_setValue("accomplishedConspirators" + plIdSubKey, 0);
} else{
GM_setValue("accomplishedConspirators" + plIdSubKey, GM_getValue("accomplishedConspirators"));
GM_deleteValue("accomplishedConspirators");
}
}
if (GM_getValue("accomplishedInvaders" + plIdSubKey) === undefined){ // захватчики
if (GM_getValue("accomplishedInvaders") === undefined){
GM_setValue("accomplishedInvaders" + plIdSubKey, 0);
} else{
GM_setValue("accomplishedInvaders" + plIdSubKey, GM_getValue("accomplishedInvaders"));
GM_deleteValue("accomplishedInvaders");
}
}
if (GM_getValue("accomplishedMonsters" + plIdSubKey) === undefined){ // монстры
if (GM_getValue("accomplishedMonsters") === undefined){
GM_setValue("accomplishedMonsters" + plIdSubKey, 0);
} else{
GM_setValue("accomplishedMonsters" + plIdSubKey, GM_getValue("accomplishedMonsters"));
GM_deleteValue("accomplishedMonsters");
}
}
if (GM_getValue("accomplishedRaids" + plIdSubKey) === undefined){ // набеги
if (GM_getValue("accomplishedRaids") === undefined){
GM_setValue("accomplishedRaids" + plIdSubKey, 0);
} else{
GM_setValue("accomplishedRaids" + plIdSubKey, GM_getValue("accomplishedRaids"));
GM_deleteValue("accomplishedRaids");
}
}
if (GM_getValue("accomplishedVanguards" + plIdSubKey) === undefined){ // отряды
if (GM_getValue("accomplishedVanguards") === undefined){
GM_setValue("accomplishedVanguards" + plIdSubKey, 0);
} else{
GM_setValue("accomplishedVanguards" + plIdSubKey, GM_getValue("accomplishedVanguards"));
GM_deleteValue("accomplishedVanguards");
}
}
if (GM_getValue("accomplishedBrigands" + plIdSubKey) === undefined){ // разбойники
if (GM_getValue("accomplishedBrigands") === undefined){
GM_setValue("accomplishedBrigands" + plIdSubKey, 0);
} else{
GM_setValue("accomplishedBrigands" + plIdSubKey, GM_getValue("accomplishedBrigands"));
GM_deleteValue("accomplishedBrigands");
}
}
// счётчики полученных элементов по типам
if (GM_getValue("gainedAbrasives" + plIdSubKey) === undefined){ // арбазивы
if (GM_getValue("gainedAbrasives") === undefined){
GM_setValue("gainedAbrasives" + plIdSubKey, 0);
} else{
GM_setValue("gainedAbrasives" + plIdSubKey, GM_getValue("gainedAbrasives"));
GM_deleteValue("gainedAbrasives");
}
}
if (GM_getValue("gainedViperVenoms" + plIdSubKey) === undefined){ // змеиные яды
if (GM_getValue("gainedViperVenoms") === undefined){
GM_setValue("gainedViperVenoms" + plIdSubKey, 0);
} else{
GM_setValue("gainedViperVenoms" + plIdSubKey, GM_getValue("gainedViperVenoms"));
GM_deleteValue("gainedViperVenoms");
}
}
if (GM_getValue("gainedTigerClaws" + plIdSubKey) === undefined){ // клыки тигра
if (GM_getValue("gainedTigerClaws") === undefined){
GM_setValue("gainedTigerClaws" + plIdSubKey, 0);
} else{
GM_setValue("gainedTigerClaws" + plIdSubKey, GM_getValue("gainedTigerClaws"));
GM_deleteValue("gainedTigerClaws");
}
}
if (GM_getValue("gainedIceCrystals" + plIdSubKey) === undefined){ // ледяные кристаллы
if (GM_getValue("gainedIceCrystals") === undefined){
GM_setValue("gainedIceCrystals" + plIdSubKey, 0);
} else{
GM_setValue("gainedIceCrystals" + plIdSubKey, GM_getValue("gainedIceCrystals"));
GM_deleteValue("gainedIceCrystals");
}
}
if (GM_getValue("gainedMoonstones" + plIdSubKey) === undefined){ // лунные камни
if (GM_getValue("gainedMoonstones") === undefined){
GM_setValue("gainedMoonstones" + plIdSubKey, 0);
} else{
GM_setValue("gainedMoonstones" + plIdSubKey, GM_getValue("gainedMoonstones"));
GM_deleteValue("gainedMoonstones");
}
}
if (GM_getValue("gainedFireCrystals" + plIdSubKey) === undefined){ // огненные кристаллы
if (GM_getValue("gainedFireCrystals") === undefined){
GM_setValue("gainedFireCrystals" + plIdSubKey, 0);
} else{
GM_setValue("gainedFireCrystals" + plIdSubKey, GM_getValue("gainedFireCrystals"));
GM_deleteValue("gainedFireCrystals");
}
}
if (GM_getValue("gainedMeteoriteShards" + plIdSubKey) === undefined){ // осколки метеорита
if (GM_getValue("gainedMeteoriteShards") === undefined){
GM_setValue("gainedMeteoriteShards" + plIdSubKey, 0);
} else{
GM_setValue("gainedMeteoriteShards" + plIdSubKey, GM_getValue("gainedMeteoriteShards"));
GM_deleteValue("gainedMeteoriteShards");
}
}
if (GM_getValue("gainedWitchBlooms" + plIdSubKey) === undefined){ // цветки ведьм
if (GM_getValue("gainedWitchBlooms") === undefined){
GM_setValue("gainedWitchBlooms" + plIdSubKey, 0);
} else{
GM_setValue("gainedWitchBlooms" + plIdSubKey, GM_getValue("gainedWitchBlooms"));
GM_deleteValue("gainedWitchBlooms");
}
}
if (GM_getValue("gainedWindflowers" + plIdSubKey) === undefined){ // цветки ветров
if (GM_getValue("gainedWindflowers") === undefined){
GM_setValue("gainedWindflowers" + plIdSubKey, 0);
} else{
GM_setValue("gainedWindflowers" + plIdSubKey, GM_getValue("gainedWindflowers"));
GM_deleteValue("gainedWindflowers");
}
}
if (GM_getValue("gainedFernFlowers" + plIdSubKey) === undefined){ // цветки папоротника
if (GM_getValue("gainedFernFlowers") === undefined){
GM_setValue("gainedFernFlowers" + plIdSubKey, 0);
} else{
GM_setValue("gainedFernFlowers" + plIdSubKey, GM_getValue("gainedFernFlowers"));
GM_deleteValue("gainedFernFlowers");
}
}
if (GM_getValue("gainedToadstools" + plIdSubKey) === undefined){ // ядовитые грибы
if (GM_getValue("gainedToadstools") === undefined){
GM_setValue("gainedToadstools" + plIdSubKey, 0);
} else{
GM_setValue("gainedToadstools" + plIdSubKey, GM_getValue("gainedToadstools"));
GM_deleteValue("gainedToadstools");
}
}
//
// задаём некоторые глобальные переменные
var documentInnerHTHL = document.documentElement.innerHTML,
currentTask = GM_getValue("currentTask" + plIdSubKey),
rewardsList = GM_getValue("rewardsList" + plIdSubKey);
// Код для страницы принятого задания
if (documentInnerHTHL.indexOf("минут") !== -1 && documentInnerHTHL.indexOf("Принять") === -1 && documentInnerHTHL.indexOf("Вы еще не приняли это задание") === -1){
// получаем и запоминаем текущее задание
var currentTaskArr = documentInnerHTHL.match(/'<b>(.+?)<\/b>/);
if (currentTaskArr !== null){
GM_setValue("currentTask" + plIdSubKey, currentTaskArr[1]);
}
} else if (documentInnerHTHL.indexOf("мин.") === -1){ // если ни принятого, ни сданного (но ещё не обсчитанного) задания нет, то стираем сохранённое значение
GM_setValue("currentTask" + plIdSubKey, "-1");
}
// Код для страницы сданного задания (с защитой от двойного прогона при обновлении страницы до появления нового)
if (documentInnerHTHL.indexOf("мин.") !== -1 && currentTask !== "-1"){
// увеличиваем счётчик сданных заданий
GM_setValue("tasksTotal" + plIdSubKey, GM_getValue("tasksTotal" + plIdSubKey) + 1);
// получаем текст награды (без статуса)
var rewardArr = documentInnerHTHL.match(/<b>Вы\sполучаете\s(.+?)<\/b>/);
if (rewardArr !== null){ // если награда есть
var reward = rewardArr[1];
// увеличиваем счётчик успешно выполненных заданий
GM_setValue("tasksAccomplished" + plIdSubKey, GM_getValue("tasksAccomplished" + plIdSubKey) + 1);
// увеличиваем кол-во полученного золота
var gainedGold = parseInt(reward.match(/([\d]+?)\sзолота/)[1]);
GM_setValue("goldTotal" + plIdSubKey, GM_getValue("goldTotal" + plIdSubKey) + gainedGold);
// получаем тип задания
var taskTypeArr = (currentTask !== undefined) ? currentTask.match(/(Армия|заговорщики|захватчики|монстр|набеги|Отряд|разбойники)/) : null,
subKey = "";
if (taskTypeArr !== null){
// выставляем кусок ключа в зависимости от типа задания
switch (taskTypeArr[1]){
case "Армия": subKey = "Armies";
break;
case "заговорщики": subKey = "Conspirators";
break;
case "захватчики": subKey = "Invaders";
break;
case "монстр": subKey = "Monsters";
break;
case "набеги": subKey = "Raids";
break;
case "Отряд": subKey = "Vanguards";
break;
case "разбойники": subKey = "Brigands";
}
// увеличиваем пару переменных (сумму полученного золота и счётчик выполненных), соответствующих типу задания
if (subKey !== ""){
GM_setValue("goldFrom" + subKey + plIdSubKey, GM_getValue("goldFrom" + subKey + plIdSubKey) + gainedGold);
GM_setValue("accomplished" + subKey + plIdSubKey, GM_getValue("accomplished" + subKey + plIdSubKey) + 1);
}
}
// получаем выпавшие элементы
var gainedElementsArr = reward.match(/(абразив|змеиный\sяд|клык\sтигра|ледяной\sкристалл|лунный\sкамень|огненный\sкристалл|осколок\sметеорита|цветок\sведьм|цветок\sветров|цветок\sпапоротника|ядовитый\sгриб)/g);
if (gainedElementsArr !== null){ // если элементы есть
var gainedElementsNumber = gainedElementsArr.length;
// увеличиваем общий счётчик выпавших элементов
GM_setValue("elementsTotal" + plIdSubKey, GM_getValue("elementsTotal" + plIdSubKey) + gainedElementsNumber);
// если выпало 2 элемента, то увеличиваем счётчик двойных
if (gainedElementsNumber === 2){
GM_setValue("elementsDouble" + plIdSubKey, GM_getValue("elementsDouble" + plIdSubKey) + 1);
}
// цикл по массиву с элементами
var i,
maxI = gainedElementsNumber;
subKey = "";
for (i=0;i<maxI;i++){
// выставляем кусок ключа в зависимости от типа элемента
switch (gainedElementsArr[i]){
case "абразив": subKey = "Abrasives";
break;
case "змеиный яд": subKey = "ViperVenoms";
break;
case "клык тигра": subKey = "TigerClaws";
break;
case "ледяной кристалл": subKey = "IceCrystals";
break;
case "лунный камень": subKey = "Moonstones";
break;
case "огненный кристалл": subKey = "FireCrystals";
break;
case "осколок метеорита": subKey = "MeteoriteShards";
break;
case "цветок ведьм": subKey = "WitchBlooms";
break;
case "цветок ветров": subKey = "Windflowers";
break;
case "цветок папоротника": subKey = "FernFlowers";
break;
case "ядовитый гриб": subKey = "Toadstools";
}
// увеличиваем счётчик выпадений соответствующего элемента
if (subKey !== ""){
GM_setValue("gained" + subKey + plIdSubKey, GM_getValue("gained" + subKey + plIdSubKey) + 1);
}
}
}
// записываем в хранилище строчку для очередной награды (без номера задания)
if (rewardsList !== ""){
GM_setValue("rewardsList" + plIdSubKey, ": " + reward + " за '" + currentTask + "'" + " " + rewardsList);
} else{
GM_setValue("rewardsList" + plIdSubKey, ": " + reward + " за '" + currentTask + "'");
}
rewardsList = GM_getValue("rewardsList" + plIdSubKey); // обновляем переменную после перезаписи хранилища
// запрашиваем страницу персонажа
sendGETRequest("pl_info.php?id=" + plId, "text/html; charset=windows-1251", function(){
// получаем номер выполненного задания
var taskNumberArr = this.responseText.match(/Гильдия\sНаемников:\s[\d]{1,2}\s\((.+?)\)\s<font\sstyle=/),
taskNumber = (taskNumberArr !== null) ? taskNumberArr[1] : "";
// добавляем в хранилище номер задания
GM_setValue("rewardsList" + plIdSubKey, taskNumber + rewardsList);
});
} else{ // если награды нет и есть красный статус
if (documentInnerHTHL.indexOf("<b>Статус</b>: <font color=\"red\"><b>") !== -1){
// увеличиваем счётчик проваленных заданий
GM_setValue("tasksFailed" + plIdSubKey, GM_getValue("tasksFailed" + plIdSubKey) + 1);
}
}
// забываем текущее задание
GM_setValue("currentTask" + plIdSubKey, "-1");
}
// Код отображения статистики
var MGRewardsStatsHeaderDiv = document.createElement("div"); // создаём элемент для вставки
MGRewardsStatsHeaderDiv.setAttribute("id", "MGRewardsStatsHeaderDiv"); // задаём ему id
// вводим переменные для доступа к значениям из хранилища
var tasksTotal = GM_getValue("tasksTotal" + plIdSubKey),
tasksAccomplished = GM_getValue("tasksAccomplished" + plIdSubKey),
tasksFailed = GM_getValue("tasksFailed" + plIdSubKey),
goldTotal = GM_getValue("goldTotal" + plIdSubKey),
elementsTotal = GM_getValue("elementsTotal" + plIdSubKey),
elementsDouble = GM_getValue("elementsDouble" + plIdSubKey),
goldFromArmies = GM_getValue("goldFromArmies" + plIdSubKey),
goldFromConspirators = GM_getValue("goldFromConspirators" + plIdSubKey),
goldFromInvaders = GM_getValue("goldFromInvaders" + plIdSubKey),
goldFromMonsters = GM_getValue("goldFromMonsters" + plIdSubKey),
goldFromRaids = GM_getValue("goldFromRaids" + plIdSubKey),
goldFromVanguards = GM_getValue("goldFromVanguards" + plIdSubKey),
goldFromBrigands = GM_getValue("goldFromBrigands" + plIdSubKey),
accomplishedArmies = GM_getValue("accomplishedArmies" + plIdSubKey),
accomplishedConspirators = GM_getValue("accomplishedConspirators" + plIdSubKey),
accomplishedInvaders = GM_getValue("accomplishedInvaders" + plIdSubKey),
accomplishedMonsters = GM_getValue("accomplishedMonsters" + plIdSubKey),
accomplishedRaids = GM_getValue("accomplishedRaids" + plIdSubKey),
accomplishedVanguards = GM_getValue("accomplishedVanguards" + plIdSubKey),
accomplishedBrigands = GM_getValue("accomplishedBrigands" + plIdSubKey),
gainedAbrasives = GM_getValue("gainedAbrasives" + plIdSubKey),
gainedViperVenoms = GM_getValue("gainedViperVenoms" + plIdSubKey),
gainedTigerClaws = GM_getValue("gainedTigerClaws" + plIdSubKey),
gainedIceCrystals = GM_getValue("gainedIceCrystals" + plIdSubKey),
gainedMoonstones = GM_getValue("gainedMoonstones" + plIdSubKey),
gainedFireCrystals = GM_getValue("gainedFireCrystals" + plIdSubKey),
gainedMeteoriteShards = GM_getValue("gainedMeteoriteShards" + plIdSubKey),
gainedWitchBlooms = GM_getValue("gainedWitchBlooms" + plIdSubKey),
gainedWindflowers = GM_getValue("gainedWindflowers" + plIdSubKey),
gainedFernFlowers = GM_getValue("gainedFernFlowers" + plIdSubKey),
gainedToadstools = GM_getValue("gainedToadstools" + plIdSubKey);
// собираем строчки с дополнительной информацией в скобках при различных показателях
var tasksAccomplishedPercentageString = (tasksTotal !== 0) ? " (" + Math.round(tasksAccomplished/tasksTotal*100) + "%)" : "",
tasksFailedPercentageString = (tasksTotal !== 0) ? " (" + (100 - Math.round(tasksAccomplished/tasksTotal*100)) + "%)" : "",
goldTotalPerTaskString = (tasksAccomplished !== 0) ? " (" + Math.round(goldTotal/tasksAccomplished) + "/зад.)" : "",
elementsTotalPercentageString = (tasksAccomplished !== 0) ? " (<span title='Шанс на получение хотя бы одного элемента с задания'>" + Math.round((elementsTotal-elementsDouble)/tasksAccomplished*100) + "%</span>; <span title='Среднее количество элементов на задание (с учётом двойных)'>" + (elementsTotal/tasksAccomplished).toFixed(2) + "</span>)" : "",
elementsDoublePercentageString = (tasksAccomplished !== 0) ? " (<span title='Шанс на двойное выпадение элементов в расчёте на задание'>" + (elementsDouble/tasksAccomplished*100).toFixed(2) + "%</span>)" : "",
goldFromArmiesPerTaskString = (accomplishedArmies !== 0) ? " (" + Math.round(goldFromArmies/accomplishedArmies) + "/зад.)" : "",
goldFromConspiratorsPerTaskString = (accomplishedConspirators !== 0) ? " (" + Math.round(goldFromConspirators/accomplishedConspirators) + "/зад.)" : "",
goldFromInvadersPerTaskString = (accomplishedInvaders !== 0) ? " (" + Math.round(goldFromInvaders/accomplishedInvaders) + "/зад.)" : "",
goldFromMonstersPerTaskString = (accomplishedMonsters !== 0) ? " (" + Math.round(goldFromMonsters/accomplishedMonsters) + "/зад.)" : "",
goldFromRaidsPerTaskString = (accomplishedRaids !== 0) ? " (" + Math.round(goldFromRaids/accomplishedRaids) + "/зад.)" : "",
goldFromVanguardsPerTaskString = (accomplishedVanguards !== 0) ? " (" + Math.round(goldFromVanguards/accomplishedVanguards) + "/зад.)" : "",
goldFromBrigandsPerTaskString = (accomplishedBrigands !== 0) ? " (" + Math.round(goldFromBrigands/accomplishedBrigands) + "/зад.)" : "",
gainedAbrasivesPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedAbrasives/elementsTotal*100) + "%)" : "",
gainedViperVenomsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedViperVenoms/elementsTotal*100) + "%)" : "",
gainedTigerClawsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedTigerClaws/elementsTotal*100) + "%)" : "",
gainedIceCrystalsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedIceCrystals/elementsTotal*100) + "%)" : "",
gainedMoonstonesPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedMoonstones/elementsTotal*100) + "%)" : "",
gainedFireCrystalsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedFireCrystals/elementsTotal*100) + "%)" : "",
gainedMeteoriteShardsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedMeteoriteShards/elementsTotal*100) + "%)" : "",
gainedWitchBloomsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedWitchBlooms/elementsTotal*100) + "%)" : "",
gainedWindflowersPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedWindflowers/elementsTotal*100) + "%)" : "",
gainedFernFlowersPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedFernFlowers/elementsTotal*100) + "%)" : "",
gainedToadstoolsPercentageString = (elementsTotal !== 0) ? " (" + Math.round(gainedToadstools/elementsTotal*100) + "%)" : "";
// задаём код элемента для вставки
MGRewardsStatsHeaderDiv.innerHTML =
"<style>" +
"#MGRewardsStatsHeaderDiv{" +
"margin: 7px 0px 5px 0px;" +
"text-align: center;" +
"}" +
"#MGRewardsStatsHeaderTitleShowHide, #MGRewardsStatsInnerDiv2TitleShowHide, #MGRewardsStatsInnerDiv3TitleShowHide, #MGRewardsStatsInnerDiv4TitleShowHide, #MGRewardsStatsInnerDiv4TitleExportToFile{" +
"color: blue;" +
"cursor: pointer;" +
"}" +
"#MGRewardsStatsInnerDiv1{" +
"margin: 5px 0px 15px 0px;" +
"}" +
"#MGRewardsStatsInnerDiv2InnerContainer, #MGRewardsStatsInnerDiv3InnerContainer, #MGRewardsStatsInnerDiv4InnerContainer{" +
"margin: 5px 0px 5px 0px;" +
"}" +
"#MGRewardsStatsInnerDiv4InnerContainer{" +
"padding: 0% 20% 0% 20%;" +
"text-align: left;" +
"white-space: pre-wrap;" +
"}" +
".MGRewardsStatsInnerSpanLeft{" +
"display: inline-block;" +
"width: 53%;" +
"text-align: right;" +
"}" +
".MGRewardsStatsInnerSpanRight{" +
"display: inline-block;" +
"width: 47%;" +
"text-align: left;" +
"}" +
"</style>" +
"<hr width='90%'>" +
"<div id='MGRewardsStatsHeaderTitle'>" +
"<b>Статистика наград ГН</b>: " +
"<font id='MGRewardsStatsHeaderTitleShowHide'>" +
"показать информацию" +
"</font>" +
"</div>" +
"<div id='MGRewardsStatsInnerContainer'>" +
"<div id='MGRewardsStatsInnerDiv1'>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Сдано заданий: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + tasksTotal + "</b></span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Выполнено: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + tasksAccomplished + "</b>" + tasksAccomplishedPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Провалено: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + tasksFailed + "</b>" + tasksFailedPercentageString + "</span><br>" +
"<br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Золота получено: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldTotal + "</b>" + goldTotalPerTaskString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Элементов: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + elementsTotal + "</b>" + elementsTotalPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Двойных: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + elementsDouble + "</b>" + elementsDoublePercentageString + "</span><br>" +
"<br>" +
"<font size='1'>Сбор данных идёт с " + GM_getValue("dataCollectionSince" + plIdSubKey) + "</font>" +
"</div>" +
"<div id='MGRewardsStatsInnerDiv2'>" +
"<div id='MGRewardsStatsInnerDiv2Title'>" +
"<span class='MGRewardsStatsInnerSpanLeft'><b>Золото по заданиям</b>: </span><span class='MGRewardsStatsInnerSpanRight'>" + "<font id='MGRewardsStatsInnerDiv2TitleShowHide'>" +
"показать" +
"</font></span>" +
"</div>" +
"<div id='MGRewardsStatsInnerDiv2InnerContainer'>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Армии: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromArmies + "</b>" + goldFromArmiesPerTaskString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Заговорщики: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromConspirators + "</b>" + goldFromConspiratorsPerTaskString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Захватчики: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromInvaders + "</b>" + goldFromInvadersPerTaskString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Монстры: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromMonsters + "</b>" + goldFromMonstersPerTaskString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Набеги: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromRaids + "</b>" + goldFromRaidsPerTaskString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Отряды: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromVanguards + "</b>" + goldFromVanguardsPerTaskString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Разбойники: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + goldFromBrigands + "</b>" + goldFromBrigandsPerTaskString + "</span><br>" +
"</div>" +
"</div>" +
"<div id='MGRewardsStatsInnerDiv3'>" +
"<div id='MGRewardsStatsInnerDiv3Title'>" +
"<span class='MGRewardsStatsInnerSpanLeft'><b>Элементы по видам</b>: </span><span class='MGRewardsStatsInnerSpanRight'>" + "<font id='MGRewardsStatsInnerDiv3TitleShowHide'>" +
"показать" +
"</font></span>" +
"</div>" +
"<div id='MGRewardsStatsInnerDiv3InnerContainer'>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Абразив: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedAbrasives + "</b>" + gainedAbrasivesPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Змеиный яд: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedViperVenoms + "</b>" + gainedViperVenomsPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Клык тигра: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedTigerClaws + "</b>" + gainedTigerClawsPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Ледяной кристалл: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedIceCrystals + "</b>" + gainedIceCrystalsPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Лунный камень: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedMoonstones + "</b>" + gainedMoonstonesPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Огненный кристалл: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedFireCrystals + "</b>" + gainedFireCrystalsPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Осколок метеорита: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedMeteoriteShards + "</b>" + gainedMeteoriteShardsPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Цветок ведьм: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedWitchBlooms + "</b>" + gainedWitchBloomsPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Цветок ветров: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedWindflowers + "</b>" + gainedWindflowersPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Цветок папоротника: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedFernFlowers + "</b>" + gainedFernFlowersPercentageString + "</span><br>" +
"<span class='MGRewardsStatsInnerSpanLeft'>Ядовитый гриб: </span><span class='MGRewardsStatsInnerSpanRight'><b>" + gainedToadstools + "</b>" + gainedToadstoolsPercentageString + "</span><br>" +
"</div>" +
"</div>" +
"<div id='MGRewardsStatsInnerDiv4'>" +
"<div id='MGRewardsStatsInnerDiv4Title'>" +
"<span class='MGRewardsStatsInnerSpanLeft'><b>Полный список наград</b>: </span><span class='MGRewardsStatsInnerSpanRight'>" +
"<font id='MGRewardsStatsInnerDiv4TitleShowHide'>" +
"показать" +
"</font>" +
" / " +
"<font id='MGRewardsStatsInnerDiv4TitleExportToFile'>" +
"сохранить в файл" +
"</font>" +
"</span>" +
"</div>" +
"<div id='MGRewardsStatsInnerDiv4InnerContainer'>" +
"</div>" +
"</div>" +
"</div>";
// увеличиваем отступ на странице сданного задания и при наличии доступного, но не просмотренного задания и нахождении в другом районе
if (documentInnerHTHL.indexOf("мин.") !== -1 || documentInnerHTHL.indexOf("Для Вас есть задание") !== -1){
MGRewardsStatsHeaderDiv.style.margin = "20px 0px 5px 0px";
}
// убираем дублирование горизонтальной линии при просмотре из другого района страницы сданного задания (без награды, с таймером до нового)
if (documentInnerHTHL.indexOf("Вы находитесь в другом районе") !== -1 && documentInnerHTHL.indexOf("минут") === -1 && documentInnerHTHL.indexOf("Для Вас есть задание") === -1){
var hr = document.querySelector("hr[width='90%']");
hr.parentNode.removeChild(hr);
}
// вставляем элемент в страницу
document.querySelector("td[rowspan='2']").appendChild(MGRewardsStatsHeaderDiv);
// задаём переменные для доступа к добавленным элементам
var MGRewardsStatsInnerContainer = document.getElementById("MGRewardsStatsInnerContainer"),
MGRewardsStatsHeaderTitleShowHide = document.getElementById("MGRewardsStatsHeaderTitleShowHide"),
MGRewardsStatsInnerDiv2InnerContainer = document.getElementById("MGRewardsStatsInnerDiv2InnerContainer"),
MGRewardsStatsInnerDiv2TitleShowHide = document.getElementById("MGRewardsStatsInnerDiv2TitleShowHide"),
MGRewardsStatsInnerDiv3InnerContainer = document.getElementById("MGRewardsStatsInnerDiv3InnerContainer"),
MGRewardsStatsInnerDiv3TitleShowHide = document.getElementById("MGRewardsStatsInnerDiv3TitleShowHide"),
MGRewardsStatsInnerDiv4InnerContainer = document.getElementById("MGRewardsStatsInnerDiv4InnerContainer"),
MGRewardsStatsInnerDiv4TitleShowHide = document.getElementById("MGRewardsStatsInnerDiv4TitleShowHide"),
MGRewardsStatsInnerDiv4TitleExportToFile = document.getElementById("MGRewardsStatsInnerDiv4TitleExportToFile");
// по умолчанию скрываем внутренние блоки
MGRewardsStatsInnerContainer.style.display = "none";
MGRewardsStatsInnerDiv2InnerContainer.style.display = "none";
MGRewardsStatsInnerDiv3InnerContainer.style.display = "none";
MGRewardsStatsInnerDiv4InnerContainer.style.display = "none";
// вешаем событие по клику на "показать/скрыть информацию" в заголовке главного информационного блока статистики
MGRewardsStatsHeaderTitleShowHide.onclick = function(){
// если скрыто, то показываем; если открыто, то скрываем; ставим соответствующий текст на кнопке
if (MGRewardsStatsInnerContainer.style.display === "none"){
MGRewardsStatsInnerContainer.style.display = "block";
MGRewardsStatsHeaderTitleShowHide.innerHTML = "скрыть информацию";
} else{
MGRewardsStatsInnerContainer.style.display = "none";
MGRewardsStatsHeaderTitleShowHide.innerHTML = "показать информацию";
}
};
// задаём события по клику на "показать/скрыть" в заголовках внутренних блоков
MGRewardsStatsInnerDiv2TitleShowHide.onclick = function(){
// если скрыто, то показываем; если открыто, то скрываем; ставим соответствующий текст на кнопке
if (MGRewardsStatsInnerDiv2InnerContainer.style.display === "none"){
MGRewardsStatsInnerDiv2InnerContainer.style.display = "block";
MGRewardsStatsInnerDiv2TitleShowHide.innerHTML = "скрыть";
} else{
MGRewardsStatsInnerDiv2InnerContainer.style.display = "none";
MGRewardsStatsInnerDiv2TitleShowHide.innerHTML = "показать";
}
};
MGRewardsStatsInnerDiv3TitleShowHide.onclick = function(){
// если скрыто, то показываем; если открыто, то скрываем; ставим соответствующий текст на кнопке
if (MGRewardsStatsInnerDiv3InnerContainer.style.display === "none"){
MGRewardsStatsInnerDiv3InnerContainer.style.display = "block";
MGRewardsStatsInnerDiv3TitleShowHide.innerHTML = "скрыть";
} else{
MGRewardsStatsInnerDiv3InnerContainer.style.display = "none";
MGRewardsStatsInnerDiv3TitleShowHide.innerHTML = "показать";
}
};
MGRewardsStatsInnerDiv4TitleShowHide.onclick = function(){
rewardsList = GM_getValue("rewardsList" + plIdSubKey);
// задаём код элемента; если скрыт, то показываем; если открыт, то скрываем; ставим соответствующий текст на кнопке
if (MGRewardsStatsInnerDiv4InnerContainer.style.display === "none"){
if (rewardsList !== ""){ // вставляем плейсхолдер при отсутствии сохранённых наград
MGRewardsStatsInnerDiv4InnerContainer.innerHTML = rewardsList;
} else{
MGRewardsStatsInnerDiv4InnerContainer.style.padding = "0px";
MGRewardsStatsInnerDiv4InnerContainer.innerHTML = "<center>(пока не сохранено ни одной награды)</center>";
}
MGRewardsStatsInnerDiv4InnerContainer.style.display = "block";
MGRewardsStatsInnerDiv4TitleShowHide.innerHTML = "скрыть";
} else{
MGRewardsStatsInnerDiv4InnerContainer.style.display = "none";
MGRewardsStatsInnerDiv4TitleShowHide.innerHTML = "показать";
}
};
// вешаем событие по клику на "сохранить в файл" в заголовке блока с полным списком наград
MGRewardsStatsInnerDiv4TitleExportToFile.onclick = function(){
rewardsList = GM_getValue("rewardsList" + plIdSubKey);
sendGETRequest("pl_info.php?id=" + plId, "text/html; charset=windows-1251", function(){
// получаем ник персонажа, текущую дату в формате dd-mm-yy и сохраняем список наград в txt-файл
var currentMoment = new Date(),
currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000),
plNickArr = this.responseText.match(/alt=""\salign=absmiddle>(.+?) \[\d+\] <img/),
plNick = (plNickArr !== null) ? plNickArr[1] : "персонажа #" + plId,
filename =
"Статистика наград ГН " +
plNick + " " +
addLeadingZero(currentMomentOnServer.getDate()) + "-" +
addLeadingZero(currentMomentOnServer.getMonth() + 1) + "-" +
currentMomentOnServer.getFullYear().toString().slice(2, 4) +
".txt";
saveToFile(rewardsList.replace(/ /g, "\r\n"), filename, "text/plain");
});
};
})();