您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Guess how many busts you can do without getting jailed
- // ==UserScript==
- // @name Busting reminder
- // @namespace http://torn.city.com.dot.com.com
- // @version 0.7.2
- // @description Guess how many busts you can do without getting jailed
- // @author Adobi
- // @match https://www.torn.com/*
- // @grant GM_setValue
- // @grant GM_getValue
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- ////// USER DEFINED VARIABLES
- let maxScore = 0; // If set to 0, script will determine your max bust capacity based on log.
- // END OF USER DEFINED VARIABLES
- function findLongestSequence(timestampArray) {
- const period = 24 * 60 * 60 * 3
- let longestSequence = 0;
- let currentSequence = 1;
- let currentMin = timestampArray[0];
- let currentMax = timestampArray[0];
- let firstTimestamp = 0;
- for (let i = 1; i < timestampArray.length; i++) {
- const TS = timestampArray[i];
- if ((currentMin - TS) <= period && (currentMax - TS) <= period) {
- currentSequence++;
- currentMin = Math.min(currentMin, TS);
- currentMax = Math.max(currentMax, TS);
- } else {
- if (longestSequence < currentSequence) { firstTimestamp = currentMin; }
- longestSequence = Math.max(longestSequence, currentSequence);
- currentSequence = 1;
- currentMin = TS;
- currentMax = TS;
- }
- }
- console.log(firstTimestamp)
- /*
- let score = 0;
- let localScore = 0
- for (let i = 0; i < timestampArray.length; i++) {
- if (firstTimestamp <= timestampArray[i]) {
- const hours = (timestampArray[i] - firstTimestamp) / 60 / 60;
- const tenHours = hours / 7.2;
- if (hours <= 72) {
- localScore = 128 / Math.pow(2, tenHours);
- score += localScore;
- console.log(hours + " - " + localScore)
- }
- }
- } */
- let currentMaxScore = 0;
- for (let i = 0; i < timestampArray.length - longestSequence; i++) {
- let score = 0;
- let localScore = 0
- const initial_timestamp = timestampArray[i];
- for (let j = 0; j < longestSequence; j++) {
- const hours = (initial_timestamp - timestampArray[i+j]) / 60 / 60;
- const tenHours = hours / 7.2;
- localScore = 128 / Math.pow(2, tenHours);
- score += localScore;
- }
- currentMaxScore = Math.max(currentMaxScore, score);
- }
- return [Math.max(longestSequence, currentSequence), currentMaxScore];
- }
- // Function to create and display yellow square with the option to enter API key
- function displayYellowSquare() {
- const yellowSquare = document.createElement('div');
- yellowSquare.id = 'yellowSquare';
- yellowSquare.style.position = 'fixed';
- yellowSquare.style.left = '0';
- yellowSquare.style.top = '0';
- yellowSquare.style.color = 'black';
- yellowSquare.style.top = '100px';
- yellowSquare.style.width = '100px';
- yellowSquare.style.height = '100px';
- yellowSquare.style.backgroundColor = 'yellow';
- yellowSquare.style.zIndex = '99999999';
- yellowSquare.style.display = 'flex'; // Use flexbox for centering
- yellowSquare.style.cursor = 'pointer'; // Change cursor to pointer
- // 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 the yellow square with a line break
- const yellowTextNode0 = document.createTextNode('Busting reminder');
- const lineBreak = document.createElement('br');
- const yellowTextNode1 = document.createTextNode('Click here to supply full access API key');
- // Append the text nodes and line break to the text container
- textContainer.appendChild(yellowTextNode0);
- textContainer.appendChild(lineBreak);
- textContainer.appendChild(yellowTextNode1);
- // Append the text container to the yellow square
- yellowSquare.appendChild(textContainer);
- // Append the yellow square to the body (if it's not already added)
- if (!document.getElementById('yellowSquare')) {
- document.body.appendChild(yellowSquare);
- }
- // Add a click event listener to the yellow square
- yellowSquare.addEventListener('click', () => {
- const apiKey = prompt('Enter your full access API key:');
- if (apiKey) {
- // Store the API key with GM_setValue
- GM_setValue('busting_api_key', apiKey);
- yellowSquare.remove(); // Remove the yellow square after entering the API key
- fetchAndDisplayData(); // Run an API call with the new key
- }
- });
- }
- // Function to fetch API data
- function fetchAndDisplayData() {
- const currentTime = Date.now()/1000;
- const apiKey = GM_getValue('busting_api_key', '');
- // If the API key is not stored, display the yellow square
- if (!apiKey) {
- displayYellowSquare();
- return;
- }
- const url = `https://api.torn.com/user/?selections=log&log=5360&key=${apiKey}`
- const timestamps = [];
- let mostBustsIn72h = 0;
- let last24h = 0;
- let last72h = 0;
- fetch(url)
- .then(response => response.json())
- .then(data => {
- if (data.error) {
- if (data.error.error === "Incorrect key" || data.error.error === "Access level of this key is not high enough") {
- GM_setValue('busting_api_key', "");
- displayYellowSquare();
- } else { return; }
- } else {
- // Counts how many busts you've done in last 72h and 24h.
- let score = 0;
- let localScore = 0
- for (const entry in data['log']) {
- timestamps.push(data['log'][entry]['timestamp']);
- const hours = (currentTime - data['log'][entry]['timestamp']) / 60 / 60;
- const tenHours = hours / 7.2;
- if (hours <= 72) {
- localScore = 128 / Math.pow(2, tenHours);
- score += localScore;
- }
- if (data['log'][entry]['timestamp'] > currentTime - 24 * 60 * 60 * 3) {
- last72h++;
- if (data['log'][entry]['timestamp'] > currentTime - 24 * 60 * 60) {
- last24h++;
- }
- }
- }
- if (maxScore === 0) {
- const sequenceAndScore = findLongestSequence(timestamps);
- mostBustsIn72h = sequenceAndScore[0];
- maxScore = Math.floor(sequenceAndScore[1]);
- }
- const currentAvailableBusts = (maxScore - score) / 128;
- console.log(score.toFixed(0) + " current bust score out of a maximum " + maxScore + ", " + currentAvailableBusts.toFixed(2) + " busts available.");
- let jailLink = document.querySelector('div#nav-jail');
- let jailLinkText = jailLink.querySelector('.linkName___FoKha');
- // Check if there's an existing text element and remove it
- let existingTextElement = jailLinkText.parentNode.querySelector('.bust-guesser');
- if (existingTextElement) {
- existingTextElement.remove();
- }
- const newSpan = document.createElement('p');
- newSpan.className = 'linkName___FoKha bust-guesser';
- newSpan.style.color = 'red';
- if (currentAvailableBusts <= 0) { newSpan.style.color = 'green'; }
- newSpan.style.float = 'right';
- newSpan.style.paddingRight = '5px';
- newSpan.textContent = Math.floor(score) + "/" + maxScore + ": " + Math.floor(currentAvailableBusts);
- jailLinkText.parentNode.appendChild(newSpan);
- }
- });
- }
- fetchAndDisplayData()
- setInterval(fetchAndDisplayData, 10 * 60 * 1000);
- //displayYellowSquare() //debugging
- })();