您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
description
当前为
// ==UserScript== // @name Torn War Stuff // @namespace namespace // @version 0.5 // @description description // @author tos // @match *.torn.com/factions.php* // @grant GM_addStyle // ==/UserScript== const APIKEY = 'API_KEY_HERE' const sort_enemies = true GM_addStyle(` .warstuff_highlight { background-color: #afa5 !important; } `) setInterval(() => { const warDIV = document.querySelector('DIV.faction-war') if (warDIV) replaceEnemyInfo(warDIV) }, 15000) const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { for (const node of mutation.addedNodes) { if (node.classList && node.classList.contains('faction-war')) { replaceEnemyInfo(node) } } } }) const wrapper = document.body//.querySelector('#mainContainer') observer.observe(wrapper, { subtree: true, childList: true }) async function replaceEnemyInfo(node) { const enemy_LIs = node.querySelectorAll('LI.enemy') const enemy_faction_id = enemy_LIs[0].querySelector(`A[href^='/factions.php']`).href.split('ID=')[1] const enemy_basic = await fetch(`https://api.torn.com/faction/${enemy_faction_id}?selections=basic&key=${APIKEY}`).then(r => r.json()).catch(console.error) enemy_LIs.forEach((li) => { const status_DIV = li.querySelector('DIV.status') const enemy_id = li.querySelector(`A[href^='/profiles.php']`).href.split('ID=')[1] const enemy_status = enemy_basic.members[enemy_id].status li.setAttribute('data-until', enemy_status.until) enemy_status.description = enemy_status.description.replace('South Africa', 'SA').replace('Cayman Islands', 'CI').replace('United Kingdom', 'UK').replace('Argentina', 'Arg').replace('Switzerland', 'Switz') switch(enemy_status.state) { case 'Abroad': case 'Traveling': if (enemy_status.description.includes('Traveling to ')) { li.setAttribute('data-sortA', '4') status_DIV.innerText = '► ' + enemy_status.description.split('Traveling to ')[1] } else if (enemy_status.description.includes('In ')) { li.setAttribute('data-sortA', '3') status_DIV.innerText = enemy_status.description.split('In ')[1] } else if (enemy_status.description.includes('Returning')) { li.setAttribute('data-sortA', '2') status_DIV.innerText = '◄ ' + enemy_status.description.split('Returning to Torn from ')[1] } else if (enemy_status.description.includes('Traveling')) { li.setAttribute('data-sortA', '5') status_DIV.innerText = 'Traveling' } break case 'Hospital': li.setAttribute('data-sortA', '1') const discharge_time = new Date(enemy_status.until*1000) const h = discharge_time.getUTCHours().toString().padStart(2, '0') const m = discharge_time.getUTCMinutes().toString().padStart(2, '0') const s = discharge_time.getUTCSeconds().toString().padStart(2, '0') const time_string = `${h}:${m}:${s}` const hosp_time_remaining = Math.round(enemy_status.until - (new Date().getTime() / 1000)) status_DIV.innerText = time_string li.classList.remove('warstuff_highlight') //li.style.backgroundColor = 'transparent' if (hosp_time_remaining < 300) { //status_DIV.innerText = time_string//hosp_time_remaining + 's' li.classList.add('warstuff_highlight') } break default: li.setAttribute('data-sortA', '0') break } }) if (sort_enemies) { const enemy_UL = document.querySelector('LI.enemy').closest('UL.members-list') Array.from(enemy_LIs).sort((a, b) => { return a.getAttribute('data-sortA') - b.getAttribute('data-sortA') || a.getAttribute('data-until') - b.getAttribute('data-until') }).forEach(li => enemy_UL.appendChild(li)) } }