您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Display a red square if cameras or guards are down in Big Al's. 1 Api call 2 seconds after you open any page, and every 60 seconds. Add your public Api key on line 62.
当前为
// ==UserScript== // @name Shoplifting alert // @namespace http://torn.city.com.dot.com.com // @version 1.1 // @description Display a red square if cameras or guards are down in Big Al's. 1 Api call 2 seconds after you open any page, and every 60 seconds. Add your public Api key on line 62. // @author Adobi // @match *://*/* // @grant GM_setValue // @grant GM_getValue // @license MIT // ==/UserScript== (function() { 'use strict'; // Function to create and display the red square with centered text and a line break function displayRedSquare(camera, guard) { if (camera === true || guard === true) { const redSquare = document.createElement('div'); redSquare.style.position = 'fixed'; redSquare.style.left = '0'; redSquare.style.top = '0'; redSquare.style.width = '100px'; redSquare.style.height = '100px'; redSquare.style.backgroundColor = 'red'; redSquare.style.zIndex = '9999'; redSquare.style.display = 'flex'; // Use flexbox for centering // Create a container div for centered text const textContainer = document.createElement('div'); textContainer.style.margin = 'auto'; // Center horizontally textContainer.style.textAlign = 'center'; // Center text textContainer.style.display = 'flex'; textContainer.style.flexDirection = 'column'; // Center vertically // Create text nodes for "camera" and "guard" values const cameraTextNode = document.createTextNode(`Camera: ${camera}`); const lineBreak = document.createElement('br'); const guardTextNode = document.createTextNode(`Guard: ${guard}`); // Append the text nodes and line break to the text container textContainer.appendChild(cameraTextNode); textContainer.appendChild(lineBreak); textContainer.appendChild(guardTextNode); // Append the text container to the red square redSquare.appendChild(textContainer); document.body.appendChild(redSquare); } } // Function to fetch API data and display the red square function fetchAndDisplayData() { const currentTime = Date.now(); const lastCallTime = GM_getValue('lastCallTime', 0); // Check if at least 60 seconds have passed since the last API call if (currentTime - lastCallTime >= 60000) { GM_setValue('lastCallTime', currentTime); // Store the current timestamp fetch('https://api.torn.com/torn/?selections=shoplifting&key=key here') .then(response => response.json()) .then(data => { // Get the values for "camera" and "guard" from the API data const camera = data.shoplifting.big_als[0].disabled; const guard = data.shoplifting.big_als[1].disabled; // Store the values of "camera" and "guard" GM_setValue('cameraValue', camera); GM_setValue('guardValue', guard); // Call the displayRedSquare function with camera and guard values displayRedSquare(camera, guard); }) .catch(error => console.error('API Error:', error)); } } // Initial run after 2 seconds with saved values of camera and guard, or fetch new data if values don't exist setTimeout(() => { const currentTime = Date.now(); const lastCallTime = GM_getValue('lastCallTime', 0); // Check if the last saved timestamp is more than 60 seconds ago or if cameraValue and guardValue don't exist if ( currentTime - lastCallTime >= 61000 || GM_getValue('cameraValue') === undefined || GM_getValue('guardValue') === undefined ) { // If any of the conditions are met, fetch new data fetchAndDisplayData(); } else { // Otherwise, use the old saved values for camera and guard const savedCamera = GM_getValue('cameraValue', false); // Default to false if not saved const savedGuard = GM_getValue('guardValue', false); // Default to false if not saved displayRedSquare(savedCamera, savedGuard); } }, 2000); // Repeat every 60 seconds setInterval(fetchAndDisplayData, 4000); })();