HWM_InterceptionAlert

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

  1. // ==UserScript==
  2. // @name HWM_InterceptionAlert
  3. // @namespace Небылица
  4. // @version 1.15
  5. // @description Оповещение о близящемся перехвате
  6. // @author Небылица
  7. // @include /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/.+/
  8. // @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.*/
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. "use strict";
  15.  
  16. // Настройки – время до перехвата, за которое показывать оповещение, в минутах
  17. var alertInterval = 20;
  18. //
  19.  
  20. // Вспомогательные функции
  21. function sendGETRequest(url, mimeType, callback){ // Универсалка для отправки GET-запроса к url с выставлением заданного MIME Type и исполнением функции callback при получении ответа
  22. var xhr = new XMLHttpRequest();
  23. xhr.open("GET", url, true);
  24.  
  25. if (typeof mimeType === "string"){
  26. xhr.overrideMimeType(mimeType);
  27. }
  28.  
  29. if (typeof callback === "function"){
  30. xhr.onreadystatechange = function(){
  31. if (xhr.readyState === 4 && xhr.status === 200){
  32. callback.apply(xhr);
  33. }
  34. };
  35. }
  36.  
  37. xhr.send();
  38. }
  39. function addAlertImage(interceptionsString){ // Вывод иконки при наличии перехватов в ближайшие alertInterval минут
  40. // получаем текущее время и массив с перехватами
  41. var currentTimeFull = document.querySelector("td[align='right'][valign='bottom'][height='17']").innerHTML.match(/(\S*?),/)[1],
  42. interceptions = interceptionsString.split("|");
  43.  
  44. // запускаем цикл по массиву перехватов
  45. var i,
  46. maxI = interceptions.length,
  47. interceptionTime,
  48. interceptionLocale;
  49. for (i=0;i<maxI;i++){
  50. // получаем время перехвата и проверяем, не находится ли оно ближе alertInterval минут
  51. interceptionTime = interceptions[i].match(/([\d]{2}:[\d]{2})/)[1];
  52. if ((parseInt(currentTimeFull.split(":")[0])*60 + parseInt(currentTimeFull.split(":")[1]) < parseInt(interceptionTime.split(":")[0])*60 + parseInt(interceptionTime.split(":")[1])) &&
  53. (parseInt(currentTimeFull.split(":")[0])*60 + parseInt(currentTimeFull.split(":")[1]) + alertInterval >= parseInt(interceptionTime.split(":")[0])*60 + parseInt(interceptionTime.split(":")[1]))
  54. ){
  55. // получаем район перехвата
  56. 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];
  57. // определяем и вставляем в страницу иконку
  58. var alertImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAcUlEQVR42qVS2wnAIAzMVBkyk7iJAzhBfswYloNeqPanoQdiyD18itwYYywzW6q6DfTAyRMRkcQJBkGzJc85V2vttQJ64HIlFhT33jMdNU0MFjQAit0901HTRM1m4AwhjSf3z/BpS+VDl6+1/HDVr3EB28R1qA0hRi8AAAAASUVORK5CYII=",
  59. alertImageTd = document.createElement("td");
  60. alertImageTd.innerHTML = "<a href='mapwars.php'><img align='absmiddle' src='" + alertImage + "' width='12' height='12' border='0' title=\"Близится перехват: " + interceptionTime + " в " + interceptionLocale + "\"></a>";
  61. document.querySelector("a[href='bselect.php']").parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(alertImageTd);
  62.  
  63. break;
  64. }
  65. }
  66. }
  67. //
  68.  
  69. // Eсли родного значка активного перехвата нет, то запускаем скрипт
  70. if (document.querySelector("img[src*='target.gif'") === null){
  71. // определяем текущий момент времени на сервере и дату в строковом виде без ведущих нулей
  72. var currentMoment = new Date(),
  73. currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000),
  74. currentDateOnServer = currentMomentOnServer.getDate().toString() + "." + (currentMomentOnServer.getMonth() + 1).toString();
  75.  
  76. // если c момента последней попытки получения информации о перехватах прошло более 10 минут, то запрашиваем данные
  77. if (GM_getValue("interceptions") === undefined || GM_getValue("checkMoment") === undefined || currentMomentOnServer.getTime() - GM_getValue("checkMoment") >= 600000){
  78. sendGETRequest("sms_clans.php", "text/html; charset=windows-1251", function(){
  79. // получаем страницу кланпочты в виде HTML и вытаскиваем список писем
  80. var parser = new DOMParser(),
  81. responseHTML = parser.parseFromString(this.responseText, "text/html"),
  82. letters = responseHTML.querySelectorAll("a[href*='&page=0&read=']");
  83.  
  84. // запускаем цикл по массиву писем
  85. var i,
  86. maxI = letters.length;
  87. for (i=0;i<maxI;i++){
  88. // находим первое письмо по перехватам c датой и выходим из цикла
  89. if (letters[i].innerHTML.indexOf("Перехват") !== -1 && letters[i].innerHTML.match(/([\d]{1,2}\.[\d]{1,2})/) !== null){
  90. // отправляем запрос к странице письма, если оно не то же самое, что в прошлый раз (другая ссылка), и запоминаем адрес
  91. if (letters[i].getAttribute("href") !== GM_getValue("dataHref")){
  92. GM_setValue("dataHref", letters[i].getAttribute("href"));
  93. sendGETRequest(letters[i].getAttribute("href"), function(){
  94. // вытаскиваем список перехватов и определяем дату получения информации в строковом виде без ведущих нулей
  95. 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),
  96. interceptionsString = "",
  97.  
  98. currentMoment = new Date(),
  99. currentMomentOnServer = new Date(Date.now() + currentMoment.getTimezoneOffset()*60000 + 10800000),
  100. currentDateOnServer = currentMomentOnServer.getDate().toString() + "." + (currentMomentOnServer.getMonth() + 1).toString();
  101.  
  102. // собираем строчку со списком перехватов для помещения в хранилище
  103. if (interceptions !== null){
  104. var i2,
  105. maxI2 = interceptions.length;
  106. if (maxI2 !== 1){
  107. for (i2=0;i2<maxI2;i2++){
  108. if (i2 !== maxI2 - 1){
  109. interceptionsString += interceptions[i2] + "|";
  110. } else{
  111. interceptionsString += interceptions[i2];
  112. }
  113. }
  114. } else{
  115. interceptionsString = interceptions[1];
  116. }
  117. }
  118.  
  119. // запоминаем полученный список перехватов в строковом виде, дату их получения и запускаем функцию добавления значка
  120. GM_setValue("interceptions", interceptionsString);
  121. GM_setValue("dataDate", currentDateOnServer);
  122.  
  123. addAlertImage(interceptionsString);
  124. });
  125. } else if (GM_getValue("dataDate") !== currentDateOnServer){ // если же первое найденное письмо то же, что и в прошлый раз, то проверяем дату
  126. // и стираем список перехватов, если она сменилась (данные устаревшие)
  127. GM_setValue("interceptions", "");
  128. } else{ // иначе оставляем и используем
  129. addAlertImage(GM_getValue("interceptions"));
  130. }
  131. break;
  132. }
  133. }
  134. // после выхода из цикла (либо при нахождении первого письма по перехватам с датой, либо при отсутствии таковых) запоминаем момент проверки
  135. GM_setValue("checkMoment", currentMomentOnServer.getTime());
  136. });
  137. } else if (GM_getValue("interceptions") !== ""){ // если есть валидная по времени информация о перехватах, то запускаем функцию добавления значка сразу
  138. addAlertImage(GM_getValue("interceptions"));
  139. }
  140. }
  141. })();