Luscious Revive Requests

Adds a button to request a revive from Luscious Medics

目前为 2024-12-06 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Luscious Revive Requests
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0.3
  5. // @description Adds a button to request a revive from Luscious Medics
  6. // @author Stig [2648238]
  7. // @match https://www.torn.com/*
  8. // @grant GM_addStyle
  9. // @grant GM.xmlHttpRequest
  10. // @grant GM_registerMenuCommand
  11. // @connect api.no1irishstig.co.uk
  12. // ==/UserScript==
  13. 'use strict';
  14.  
  15. const owner = "Luscious Medics";
  16. const source = "Luscious Medics Script";
  17. const buttonLabel = "LH Revive Me";
  18. const colour = "#ff0000";
  19. const API_URL = 'https://api.no1irishstig.co.uk/request';
  20.  
  21. setInterval(checkButton, 500);
  22. GM_addStyle(`
  23. .revive-text {
  24. color: ${colour};
  25. }
  26.  
  27. .revive-icon {
  28. fill: ${colour} !important;
  29. }
  30.  
  31. `);
  32.  
  33. let btn;
  34.  
  35. function getButton() {
  36. btn = document.createElement('a');
  37.  
  38. if (document.body.classList.contains('dark-mode')) {
  39. btn.classList.add('custom-dark-mode');
  40. }
  41.  
  42. btn.id = 'custom-btn';
  43. btn.className = "custom-revive t-clear h c-pointer m-icon line-h24 right last"
  44. btn.innerHTML = `
  45. <span class="icon-wrap svg-icon-wrap">
  46. <span class="link-icon-svg">
  47. ${icon}
  48. </span>
  49. </span>
  50. <span class="revive-text">${buttonLabel}</span>
  51. `;
  52. btn.href = '#custom-revive';
  53. btn.addEventListener('click', submitRequest);
  54. btn.addEventListener("mouseenter", () => {
  55. document.getElementsByClassName("revive-text")[0].style.color = colour;
  56. document.getElementsByClassName("revive-icon")[0].setAttribute("style", `fill: ${colour} !important`);
  57.  
  58. });
  59.  
  60. btn.addEventListener("mouseleave", () => {
  61. document.getElementsByClassName("revive-text")[0].style.color = null;
  62. document.getElementsByClassName("revive-icon")[0].removeAttribute("style");
  63. });
  64. return btn;
  65. }
  66.  
  67. function checkButton() {
  68. if(inCloudflareChallenge()) return;
  69.  
  70. const {hospital} = getSessionData();
  71. const exists = document.getElementById('custom-btn');
  72.  
  73. if (!hospital) {
  74. if (btn) {
  75. btn.remove();
  76. }
  77. return;
  78. }
  79.  
  80. if (exists) {
  81. return;
  82. }
  83.  
  84. const location = document.getElementById("top-page-links-list");
  85. if (location != null) {
  86. const issues = document.getElementsByClassName("tt-revive");
  87. if (issues.length !== 0) {
  88. issues[0].remove();
  89. }
  90. location.children[location.children.length - 1].insertAdjacentElement('afterend', getButton());
  91. }
  92. }
  93.  
  94. function handleResponse(response) {
  95. if (response?.status && response.status !== 200) {
  96. var responseText = response.responseText.replace(/^"|"$/g, '');
  97. alert(`Error Code: ${response.status}\nMessage: ${responseText}` || `An unknown error has occurred - Please report this to ${owner} leadership.`);
  98. return;
  99. }
  100.  
  101. let contract = false;
  102. try {
  103. contract = !!JSON.parse(response.responseText).contract;
  104. } catch (e) {
  105. }
  106.  
  107. if (contract) {
  108. alert(`Contract request has been sent to ${owner}. Thank you!`)
  109. } else {
  110. alert(`Request has been sent to ${owner}. Please pay your reviver a Xanax or $1m. Thank you!`);
  111. }
  112. }
  113.  
  114. function submitRequest(e) {
  115. e?.preventDefault();
  116.  
  117. const sessionData = getSessionData();
  118. if (!sessionData.hospital) {
  119. alert('You are not in the hospital.');
  120. return;
  121. }
  122.  
  123. btn.setAttribute('disabled', true);
  124. btn.setAttribute('aria-pressed', true);
  125.  
  126. GM.xmlHttpRequest({
  127. method: 'POST',
  128. url: API_URL,
  129. headers: {
  130. 'Content-Type': 'application/json',
  131. },
  132. data: JSON.stringify({
  133. 'tornid': parseInt(sessionData.userID),
  134. 'username': '' + sessionData.userName,
  135. "vendor": owner,
  136. 'source': `${source} ${GM_info.script.version}`,
  137. 'type': 'revive'
  138. }),
  139. onload: handleResponse,
  140. });
  141. }
  142.  
  143. function getSessionData() {
  144. const sidebar = Object.keys(sessionStorage).find((k) => /sidebarData\d+/.test(k));
  145. const data = JSON.parse(sessionStorage.getItem(sidebar));
  146. return {
  147. userID: data.user.userID,
  148. userName: data.user.name,
  149. hospital: data.statusIcons?.icons?.hospital,
  150. };
  151. }
  152.  
  153. function inCloudflareChallenge() {
  154. return document.getElementsByClassName('iAmUnderAttack').length;
  155. }
  156.  
  157. GM_registerMenuCommand(`Request revive from ${owner}`, () => submitRequest());
  158.  
  159. const icon = `
  160. <svg xmlns="http://www.w3.org/2000/svg"
  161. width="15" height="15" viewBox="0 0 20 20" id="svg3" >
  162. <path id="revive-icon" fill="none"
  163. class="revive-icon"
  164. d="M18.737,9.691h-5.462c-0.279,0-0.527,0.174-0.619,0.437l-1.444,4.104L8.984,3.195c-0.059-0.29-0.307-0.506-0.603-0.523C8.09,2.657,7.814,2.838,7.721,3.12L5.568,9.668H1.244c-0.36,0-0.655,0.291-0.655,0.655c0,0.36,0.294,0.655,0.655,0.655h4.8c0.281,0,0.532-0.182,0.621-0.45l1.526-4.645l2.207,10.938c0.059,0.289,0.304,0.502,0.595,0.524c0.016,0,0.031,0,0.046,0c0.276,0,0.524-0.174,0.619-0.437L13.738,11h4.999c0.363,0,0.655-0.294,0.655-0.655C19.392,9.982,19.1,9.691,18.737,9.691z"/>
  165. </svg>`;