// ==UserScript== // @name HWM_InterceptionAlert // @namespace Небылица // @version 1.15 // @description Оповещение о близящемся перехвате // @author Небылица // @include /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/.+/ // @exclude /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/(login|war|cgame|campaign|frames|chat|chatonline|ch_box|chat_line|ticker|chatpost)\.php.*/ // @grant GM_setValue // @grant GM_getValue // @downloadURL https://update.greasyfork.icu/scripts/36041/HWM_InterceptionAlert.user.js // @updateURL https://update.greasyfork.icu/scripts/36041/HWM_InterceptionAlert.meta.js // ==/UserScript== (function() { "use strict"; // Настройки – время до перехвата, за которое показывать оповещение, в минутах var alertInterval = 20; // // Вспомогательные функции 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 addAlertImage(interceptionsString){ // Вывод иконки при наличии перехватов в ближайшие alertInterval минут // получаем текущее время и массив с перехватами var currentTimeFull = document.querySelector("td[align='right'][valign='bottom'][height='17']").innerHTML.match(/(\S*?),/)[1], interceptions = interceptionsString.split("|"); // запускаем цикл по массиву перехватов var i, maxI = interceptions.length, interceptionTime, interceptionLocale; for (i=0;i= parseInt(interceptionTime.split(":")[0])*60 + parseInt(interceptionTime.split(":")[1])) ){ // получаем район перехвата interceptionLocale = interceptions[i].match(/(East\sRiver|Tiger\sLake|Rogues'\sWood|Wolf\sDale|Peaceful\sCamp|Lizard\sLowland|Green\sWood|Eagle\sNest|Portal's\sRuins|Dragons'\sCaves|Shining\sSpring|Sunny\sCity|Magma\sMines|Bear\sMountain|Fairy\sTrees|Harbour\sCity|Mythril\sCoast|Great\sWall|The\sGreat\sWall|Titans'\sValley|Fishing\sVillage|Kingdom\sCastle|Ungovernable\sSteppe|Crystal\sGarden|The\sWilderness|Sublime\sArbor)/i)[1]; // определяем и вставляем в страницу иконку var alertImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAcUlEQVR42qVS2wnAIAzMVBkyk7iJAzhBfswYloNeqPanoQdiyD18itwYYywzW6q6DfTAyRMRkcQJBkGzJc85V2vttQJ64HIlFhT33jMdNU0MFjQAit0901HTRM1m4AwhjSf3z/BpS+VDl6+1/HDVr3EB28R1qA0hRi8AAAAASUVORK5CYII=", alertImageTd = document.createElement("td"); alertImageTd.innerHTML = ""; document.querySelector("a[href='bselect.php']").parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(alertImageTd); break; } } } // // Eсли родного значка активного перехвата нет, то запускаем скрипт if (document.querySelector("img[src*='target.gif'") === null){ // определяем текущий момент времени на сервере и дату в строковом виде без ведущих нулей var currentMoment = new Date(), currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000), currentDateOnServer = currentMomentOnServer.getDate().toString() + "." + (currentMomentOnServer.getMonth() + 1).toString(); // если c момента последней попытки получения информации о перехватах прошло более 10 минут, то запрашиваем данные if (GM_getValue("interceptions") === undefined || GM_getValue("checkMoment") === undefined || currentMomentOnServer.getTime() - GM_getValue("checkMoment") >= 600000){ sendGETRequest("sms_clans.php", "text/html; charset=windows-1251", function(){ // получаем страницу кланпочты в виде HTML и вытаскиваем список писем var parser = new DOMParser(), responseHTML = parser.parseFromString(this.responseText, "text/html"), letters = responseHTML.querySelectorAll("a[href*='&page=0&read=']"); // запускаем цикл по массиву писем var i, maxI = letters.length; for (i=0;i