您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Display remaining travel time, hospital time, raceway time, and time left for chain on tab title.
// ==UserScript== // @name Time on Tab Title // @namespace http://tampermonkey.net/ // @version 0.8 // @description Display remaining travel time, hospital time, raceway time, and time left for chain on tab title. // @author HesperCroft [2924630] // @match https://www.torn.com/hospitalview.php // @include https://www.torn.com/loader.php?sid=racing* // @include https://www.torn.com/factions.php* // @include https://www.torn.com/page.php?sid=travel* // @icon // @grant none // ==/UserScript== (function() { 'use strict'; const title = "[Time on Tab Title]: "; const TEXT_TRAVEL = " Traveling | TORN"; const TEXT_HOSPITAL = " Hospital | TORN"; const TEXT_RACEWAY = " Racing | TORN"; const TEXT_CHAIN = " Chain | TORN"; const ID_HOSPITAL = 'theCounter'; const ID_RACEWAY = 'infoSpot'; const SPAN_CHAIN_TITLE = 'span.chain-box-title'; const SPAN_CHAIN_LENGTH = 'p.bar-value___uxnah'; const SPAN_CHAIN_TIME = "p.bar-timeleft___B9RGV"; const URL_HOSPITAL = "https://www.torn.com/hospitalview.php"; const URL_RACEWAY = "https://www.torn.com/loader.php?sid=racing"; const URL_CHAIN = 'https://www.torn.com/factions.php'; const URL_TRAVEL = "https://www.torn.com/page.php?sid=travel"; const IF_PARSE_HOSPITAL_TIME = false; const IF_PARSE_RACEWAY_TIME = false; function parseTime(timeString) { // Extract hours, minutes, and seconds from the string let hoursMatch = timeString.match(/(\d+)\s*hour/); let minutesMatch = timeString.match(/(\d+)\s*minute/); let secondsMatch = timeString.match(/(\d+)\s*second/); // If hours, minutes, or seconds weren't found, default to 0 let hours = hoursMatch ? parseInt(hoursMatch[1], 10) : 0; let minutes = minutesMatch ? parseInt(minutesMatch[1], 10) : 0; let seconds = secondsMatch ? parseInt(secondsMatch[1], 10) : 0; // Add any minutes over 60 to the hours and keep the remainder as minutes hours += Math.floor(minutes / 60); minutes = minutes % 60; // Pad the hours, minutes, and seconds with leading zeros if necessary hours = hours.toString().padStart(2, '0'); minutes = minutes.toString().padStart(2, '0'); seconds = seconds.toString().padStart(2, '0'); return hours + ':' + minutes + ':' + seconds; } function startObserving(spanId, tabText) { let span = document.getElementById(spanId); if (span) { let observer = new MutationObserver(function(mutations) { if (document.contains(span)) { let text = null; if (spanId === ID_RACEWAY) { if (span.textContent.startsWith("Race")) { text = span.textContent; } else { text = span.querySelector("span").textContent; if (IF_PARSE_RACEWAY_TIME) { text = parseTime(text); } } } else { text = span.textContent; } // If raceway or hospital check for if parse time is enabled if (spanId === ID_HOSPITAL && IF_PARSE_HOSPITAL_TIME) { text = parseTime(text); } else { text = span.textContent; } let newTitle = text + tabText; document.title = newTitle; } else { observer.disconnect(); console.log(title + 'Element with id "' + spanId + '" not found. Observer disconnected.'); } }); observer.observe(span, { characterData: true, childList: true, subtree: true }); } else { window.setTimeout(() => startObserving(spanId, tabText), 500); } } function startObservingChain() { let span = document.querySelector(SPAN_CHAIN_TIME); if (span) { let observer = new MutationObserver(function(mutations) { if (document.contains(span)) { let length = document.querySelector(SPAN_CHAIN_LENGTH).textContent; let time = document.querySelector(SPAN_CHAIN_TIME).textContent; document.title = time + " left " + length + " " + TEXT_CHAIN; } else { observer.disconnect(); console.log(title + 'Element with class ' + SPAN_CHAIN_TITLE + ' not found or chain inactive. Observer disconnected.'); } }); observer.observe(span, { characterData: true, childList: true, subtree: true }); } else { window.setTimeout(startObservingChain, 500); } } function startObservingTravel() { let span = document.querySelector("#travel-root > div.flightProgressSection___fhrD5 > div.progressText___qJFfY > span > span:nth-child(2) > time"); if (span) { let observer = new MutationObserver(function(mutations) { if (document.contains(span)) { let text = span.textContent; document.title = text + TEXT_TRAVEL; } else { observer.disconnect(); console.log(title + 'Element with id "travel-root" not found. Observer disconnected.'); } }); observer.observe(span, { characterData: true, childList: true, subtree: true }); } else { window.setTimeout(startObservingTravel, 500); } } if (window.location.href === URL_TRAVEL) { startObservingTravel(); } else if (window.location.href === URL_HOSPITAL){ // For Hospital Times startObserving(ID_HOSPITAL, TEXT_HOSPITAL); } else if (window.location.href.startsWith(URL_RACEWAY)) { // For Raceway startObserving(ID_RACEWAY, TEXT_RACEWAY); } else if (window.location.href.startsWith(URL_CHAIN)) { // For Chain startObservingChain(); } })();