HWM_InterceptionAlert

Оповещение о близящемся перехвате

Från och med 2017-12-07. Se den senaste versionen.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         HWM_InterceptionAlert
// @namespace    Небылица
// @version      1.12
// @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|frames|chat|chatonline|ch_box|chat_line|ticker|chatpost)\.php.*/
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {
    "use strict";

    // Настройки – время до перехвата, за которое показывать оповещение, в минутах
    var alertInterval = 20;
    //

    // Вспомогательные функции
    function sendGETRequest(url, callback){ // Универсалка для отправки GET-запроса к url с исполнением функции callback при получении ответа
        var xhr = new XMLHttpRequest();

        xhr.open("GET", url, true);
        xhr.onreadystatechange = function(){
            if (xhr.readyState === 4 && xhr.status === 200){
                if (typeof callback === "function"){
                    callback.apply(xhr);
                }
            }
        };
        xhr.send();
    }
    function addAlertImage(interceptionsString, alertInterval){ // Вывод иконки при наличии перехватов в ближайшие 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<maxI;i++){
            // получаем время перехвата и проверяем, не находится ли оно ближе alertInterval минут
            interceptionTime = interceptions[i].match(/([\d]{2}:[\d]{2})/)[1];
            if ((parseInt(currentTimeFull.split(":")[0])*60 + parseInt(currentTimeFull.split(":")[1]) < parseInt(interceptionTime.split(":")[0])*60 + parseInt(interceptionTime.split(":")[1])) &&
                (parseInt(currentTimeFull.split(":")[0])*60 + parseInt(currentTimeFull.split(":")[1]) + alertInterval >= 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 = "<a href='mapwars.php'><img align='absmiddle' src='" + alertImage + "' width='12' height='12' border='0' title='Близится перехват: " + interceptionTime + " в " + interceptionLocale + "'></a>";
                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", 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<maxI;i++){
                    // находим первое письмо по перехватам c датой и выходим из цикла
                    if ((letters[i].innerHTML.indexOf("Перехват") !== -1 || encodeURI(letters[i].innerHTML).indexOf("%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD") !== -1) && letters[i].innerHTML.match(/([\d]{1,2}\.[\d]{1,2})/) !== null){
                        // отправляем запрос к странице письма, если оно не то же самое, что в прошлый раз (другая ссылка), и запоминаем адрес
                        if (letters[i].getAttribute("href") !== GM_getValue("dataHref")){
                            GM_setValue("dataHref", letters[i].getAttribute("href"));
                            sendGETRequest(letters[i].getAttribute("href"), function(){
                                // вытаскиваем список перехватов и определяем дату получения информации в строковом виде без ведущих нулей
                                var interceptions = this.responseText.match(/([\d]{2}:[\d]{2}.*?(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))|((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).*?[\d]{2}:[\d]{2})/gi),
                                    interceptionsString = "",

                                    currentMoment = new Date(),
                                    currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000),
                                    currentDateOnServer = currentMomentOnServer.getDate().toString() + "." + (currentMomentOnServer.getMonth() + 1).toString();

                                // собираем строчку со списком перехватов для помещения в хранилище
                                if (interceptions !== null){
                                    var i2,
                                        maxI2 = interceptions.length;
                                    if (maxI2 !== 1){
                                        for (i2=0;i2<maxI2;i2++){
                                            if (i2 !== maxI2 - 1){
                                                interceptionsString += interceptions[i2] + "|";
                                            } else{
                                                interceptionsString += interceptions[i2];
                                            }
                                        }
                                    } else{
                                        interceptionsString = interceptions[1];
                                    }
                                }

                                // запоминаем полученный список перехватов в строковом виде, дату их получения и запускаем функцию добавления значка
                                GM_setValue("interceptions", interceptionsString);
                                GM_setValue("dataDate", currentDateOnServer);

                                addAlertImage(interceptionsString, alertInterval);
                            });
                        } else if (GM_getValue("dataDate") !== currentDateOnServer){ // если же первое найденное письмо то же, что и в прошлый раз, то проверяем дату
                            // и стираем список перехватов, если она сменилась (данные устаревшие)
                            GM_setValue("interceptions", "");
                        } else{ // иначе оставляем и используем
                            addAlertImage(GM_getValue("interceptions"), alertInterval);
                        }
                        break;
                    }
                }
                // после выхода из цикла (либо при нахождении первого письма по перехватам с датой, либо при отсутствии таковых) запоминаем момент проверки
                GM_setValue("checkMoment", currentMomentOnServer.getTime());
            });
        } else if (GM_getValue("interceptions") !== ""){ // если есть валидная по времени информация о перехватах, то запускаем функцию добавления значка сразу
            addAlertImage(GM_getValue("interceptions"), alertInterval);
        }
    }
})();