HWM_Tavern_AutoAccept_BlackList_Notification

Скрипт для таверны, автоматически отклоняет людей что в черном списке / принимает игру либо воспроизводит оповещения об вступлении в заявку.

  1. // ==UserScript==
  2. // @name HWM_Tavern_AutoAccept_BlackList_Notification
  3. // @author emptimd
  4. // @namespace emptimd
  5. // @description Скрипт для таверны, автоматически отклоняет людей что в черном списке / принимает игру либо воспроизводит оповещения об вступлении в заявку.
  6. // @include /https?:\/\/(www.heroeswm.ru|178.248.235.15|www.lordswm.com)\/(tavern.php)/
  7. // @version 2.0
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. /*
  12. Variables
  13. */
  14.  
  15. // nicknames that the script will auto deny. To add a new nickname, place it inside quotes. '',
  16. const blackList = [];
  17.  
  18. const autoAccept = 0; // 1 if should auto accept new games from players.
  19. const soundAlert = 0; // 1 if should make a sound alert when some player made a request/script accepted request.
  20. const maxTavernBallance = 500000; // if player has a bigger tavern balance then he will be skipped
  21.  
  22. /*
  23. Code
  24. */
  25.  
  26. // sound alarm
  27. function beep(vol, freq, duration) {
  28. var a=new AudioContext();
  29. var v=a.createOscillator()
  30. var u=a.createGain()
  31. v.connect(u)
  32. v.frequency.value=freq
  33. v.type="square"
  34. u.connect(a.destination)
  35. u.gain.value=vol*0.01
  36. v.start(a.currentTime)
  37. v.stop(a.currentTime+duration*0.001)
  38. }
  39.  
  40. function make_alarm() {
  41. if(document.visibilityState === 'hidden') {
  42. beep(3, 300, 300);//first number stands for sound volume
  43. }
  44. }
  45.  
  46. let a = document.querySelector('a[href^="acard_game.php"]');
  47.  
  48. if(!a) {
  49. delete localStorage['tavernRequestHtml'];
  50. throw new Error();
  51. }
  52.  
  53. // check nickname
  54. let nickname = a.previousSibling.previousSibling.childNodes[0].text;
  55.  
  56. if(blackList.includes(nickname)) {
  57. // deny
  58. window.open(a.nextElementSibling.href,'_self');
  59. }else {
  60. //auto accept.
  61. if (autoAccept) window.open(a.href,'_self');
  62. else get_table();
  63. }
  64.  
  65.  
  66. function get_table() {
  67. // get html from localstorage
  68. if (localStorage['tavernRequestHtml']) return show_tables(localStorage['tavernRequestHtml']);
  69.  
  70. // or make an ajax call to player profile to get html taver balance
  71. var href = a.previousSibling.previousSibling.childNodes[0].href;
  72. var xhr = new XMLHttpRequest();
  73. xhr.open("GET", href, true);
  74. xhr.overrideMimeType('text/html; charset=windows-1251');
  75. xhr.send();
  76. xhr.onreadystatechange = function() { process_xhr(xhr); }
  77. }
  78.  
  79. function process_xhr(xhr) {
  80. if (xhr.readyState != 4) return;
  81.  
  82. if (xhr.status == 200) {
  83. var _perk_ = "<";
  84. var text = xhr.responseText.split('table');
  85. for(var i=1; i<text.length; i++){
  86. if(text[i].indexOf('&nbsp;&nbsp;Всего&nbsp;игр:') > -1){
  87. _perk_ += "table" + text[i] + "table" + text[i+1] + "table" + text[i+2] + "table" + text[i+3];
  88. }
  89. }
  90. _perk_ += "table>";
  91. show_tables(_perk_);
  92. }
  93. }
  94.  
  95. function show_tables(html) {
  96. var elements = htmlToElements(html);
  97. var docFragment = elementsToDocFragment(elements);
  98. //a.parentElement.parentElement.appendChild(docFragment);
  99.  
  100. //make parent table relative
  101. a.parentElement.parentElement.parentElement.parentElement.style.position = 'relative';
  102. var element = a.parentElement.parentElement;
  103. element.parentNode.insertBefore(docFragment, element.nextSibling);
  104. element.nextElementSibling.style.backgroundColor = '#fff';
  105. element.nextElementSibling.style.position = 'absolute';
  106. element.nextElementSibling.style.top = '18px';
  107. element.nextElementSibling.style.left = '270px';
  108.  
  109. var balance = getBalance(element.nextElementSibling.firstChild.childNodes);
  110. balance = parseInt(balance.replace(/,/g, ""), 10);
  111.  
  112. // if big balance then skip
  113. if (balance > maxTavernBallance) window.open(a.nextElementSibling.href,'_self');
  114.  
  115. //sound alert.
  116. if (soundAlert) make_alarm();
  117.  
  118. // finnaly add html to localStorage to prevent multiple ajax requests.
  119. if (!localStorage['tavernRequestHtml']) localStorage['tavernRequestHtml'] = html;
  120. }
  121.  
  122.  
  123. /*Helpers*/
  124. function htmlToElements(html) {
  125. var template = document.createElement('template');
  126. template.innerHTML = html;
  127. return template.content.childNodes;
  128. }
  129.  
  130. function elementsToDocFragment(elements) {
  131. var docFrag = document.createDocumentFragment();
  132. for(var i = 0; i < elements.length; i++) {
  133. docFrag.appendChild(elements[i]); // Note that this does NOT go to the DOM
  134. }
  135. return docFrag;
  136. }
  137.  
  138. function getBalance(tavern_parent) {
  139. var text_bal = ' Баланс:';
  140. tavern_parent[0].childNodes[0].setAttribute('style', 'white-space: nowrap;');
  141. tavern_parent[1].childNodes[1].setAttribute('style', 'white-space: nowrap;');
  142. tavern_parent[2].childNodes[1].setAttribute('style', 'white-space: nowrap;');
  143. var tavern_0bal = tavern_parent[1].querySelector("tr");
  144. var tavern_1bal = tavern_parent[2].querySelector("tr");
  145. if ( !tavern_0bal && !tavern_1bal ) return;
  146. if ( tavern_0bal ) {
  147. tavern_0bal.childNodes[1].setAttribute('style', 'text-align: right; padding-right: 5px;');
  148. tavern_0bal = tavern_0bal.childNodes[1].innerHTML.replace(/,/g, "");
  149. tavern_parent[1].childNodes[3].firstChild.width = "100%";
  150. add_el = tavern_parent[1].cloneNode(true);
  151. } else { tavern_0bal = 0; }
  152. if ( tavern_1bal ) {
  153. tavern_1bal.childNodes[1].setAttribute('style', 'text-align: right; padding-right: 5px;');
  154. tavern_1bal = tavern_1bal.childNodes[1].innerHTML.replace(/,/g, "");
  155. tavern_parent[2].childNodes[3].firstChild.width = "100%";
  156. add_el = tavern_parent[2].cloneNode(true);
  157. } else { tavern_1bal = 0; }
  158. var tavern_bal = digit(tavern_0bal - tavern_1bal);
  159. add_el.firstChild.innerHTML = text_bal;
  160. add_el.childNodes[1].innerHTML = "";
  161. add_el.childNodes[2].innerHTML = " ";
  162. add_el.childNodes[3].innerHTML = '<table border="0" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td><img width="24" height="24" src="https://dcdn3.heroeswm.ru/i/gold.gif" border="0" title="Золото" alt=""></td><td style="text-align: right; padding-right: 5px;">454,000</td></tr></tbody></table>';
  163. add_el.querySelector("tr").childNodes[1].innerHTML = tavern_bal;
  164. tavern_parent[2].parentNode.insertBefore(add_el, tavern_parent[2].nextSibling);
  165.  
  166. return tavern_bal;
  167. }
  168.  
  169. function digit(value) {
  170. return value.toString().replace(/(?=\B(?:\d{3})+(?!\d))/g, ',');
  171. }