Stigs Torn Scripts

Adds options to request an assist on the attack page

当前为 2024-06-16 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Stigs Torn Scripts
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.2
  5. // @description Adds options to request an assist on the attack page
  6. // @author Stig [2648238]
  7. // @match https://www.torn.com/loader.php?sid=attack*
  8. // @grant GM_addStyle
  9. // @grant GM.xmlHttpRequest
  10. // @grant GM_registerMenuCommand
  11. // @connect api.no1irishstig.co.uk
  12. // ==/UserScript==
  13.  
  14. function addLocID() {
  15. const locID = prompt("Please provide a Location, this should be provided by your Faction");
  16.  
  17. if (locID) {
  18. localStorage.setItem('assistLocID', locID);
  19. location.reload();
  20. }
  21. }
  22.  
  23. GM_registerMenuCommand('Select Assist Location', () => addLocID());
  24. const source = 'Stigs Script';
  25. let interval;
  26. let bar = null;
  27.  
  28. (function() {
  29. 'use strict';
  30.  
  31. GM_addStyle(`
  32. .assist-request-top {
  33. justify-content: center !important;
  34. gap: 5px;
  35. flex-wrap: wrap;
  36. padding: 0 5px;
  37. }
  38.  
  39. .assist-request-button {
  40. width: unset !important;
  41. margin: 5px 0;
  42. cursor: pointer;
  43. }
  44.  
  45. .arb-default:hover {
  46. background: #AAAAAA !important;
  47. }
  48.  
  49. :root .dark-mode .arb-default:hover {
  50. background: #666666 !important;
  51. }
  52.  
  53. .arb-green {
  54. background: linear-gradient(180deg,#f8f2eb,#d2e8bc) !important;
  55. cursor: not-allowed !important;
  56. }
  57.  
  58. :root .dark-mode .arb-green {
  59. background: linear-gradient(180deg,#7e9160,#363636) !important;
  60. }
  61.  
  62. .arb-red {
  63. background: linear-gradient(180deg, #f8ebeb, #e8b3b3) !important;
  64. cursor: not-allowed !important;
  65. }
  66.  
  67. :root .dark-mode .arb-red {
  68. background: linear-gradient(180deg, #8e4343, #363636) !important;
  69. }
  70. `);
  71.  
  72. var buttonList = [];
  73.  
  74. function waitForElement(selector, callback) {
  75. let el = document.querySelector(selector);
  76. if (el) {
  77. callback(el);
  78. } else {
  79. setTimeout(function() {
  80. waitForElement(selector, callback);
  81. }, 500);
  82. }
  83. }
  84.  
  85. async function getCustomButtons() {
  86. return new Promise((resolve, reject) => {
  87. GM.xmlHttpRequest({
  88. method: 'GET',
  89. url: `https:/api.no1irishstig.co.uk/abtns?locid=${localStorage['assistLocID']}`,
  90. headers: {
  91. 'Content-Type': 'application/json',
  92. },
  93. onload: function(response) {
  94. if (response?.status && response.status !== 200) {
  95. var responseText = response.responseText.replace(/^"|"$/g, '');
  96. alert(`Error Code: ${response.status}\nMessage: ${responseText}` || `An unknown error has occurred - Please report this to ${owner} leadership.`);
  97. reject(new Error(responseText));
  98. } else {
  99. let json = JSON.parse(response.responseText);
  100. for (const [key, value] of Object.entries(json)) {
  101. buttonList.push({ name: key, value: value });
  102. }
  103. resolve();
  104. }
  105. }
  106. });
  107. });
  108. }
  109.  
  110. function render() {
  111. let bar = document.getElementById('assist-request');
  112. if (bar != null) {
  113. return;
  114. }
  115.  
  116. const header = document.getElementById('react-root');
  117. const element = document.createElement('div');
  118. element.className = 'msg-info-wrap';
  119. header.parentNode.insertBefore(element, header);
  120.  
  121. if (localStorage['assistLocID'] === undefined) {
  122. element.innerHTML = `
  123. <div id='assist-request' class='info-msg-cont border-round m-top10 assist-request-top'>
  124. <div class='info-msg border-round assist-request-top'>
  125. <a class='assist-request-button arb-default msg border-round' tabindex='0' href='#' id='setup_location'>
  126. Set Assist Location
  127. </a>
  128. </div>
  129. </div>
  130. <hr class='page-head-delimiter m-top10 m-bottom10 '>
  131. `;
  132. document.getElementById("setup_location").addEventListener("click", addLocID);
  133. return;
  134. }
  135.  
  136. if (buttonList.length === 0) {
  137. return;
  138. }
  139.  
  140. let buttons = '';
  141. for (const b of buttonList) {
  142. buttons += `
  143. <div class='assist-request-button arb-default msg border-round' tabindex='0' data-assist-type='${b.value}'>
  144. ${b.name}
  145. </div>
  146. `;
  147. }
  148.  
  149. element.innerHTML = `
  150. <div id='assist-request' class='info-msg-cont border-round m-top10 assist-request-top'>
  151. <div class='info-msg border-round assist-request-top'>
  152. ${buttons}
  153. </div>
  154. </div>
  155. <hr class='page-head-delimiter m-top10 m-bottom10 '>
  156. `;
  157.  
  158. bar = document.getElementById('assist-request');
  159. const buttonSet = document.getElementsByClassName('assist-request-button');
  160. for (let i = 0; i < buttonSet.length; i++) {
  161. buttonSet[i].addEventListener('click', request.bind(buttonSet[i]));
  162. }
  163. }
  164.  
  165. async function main() {
  166. await waitForElement('.coreWrap___LtSEy', async function(coreWrap) {
  167. await getCustomButtons();
  168. render();
  169. });
  170. }
  171. main();
  172. })();