HWM_InterceptionAlert

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

Version au 07/12/2017. Voir la dernière version.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==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);
        }
    }
})();