// ==UserScript== // @name Is it Down? (Updated) // @version 0.6.1 // @namespace https://trackerstatus.info/ // @description Pulls from TrackerStatus API and displays status on supported trackers // @match https://redacted.sh/* // @match https://orpheus.network/* // @match https://passthepopcorn.me/* // @match https://broadcasthe.net/* // @match https://gazellegames.net/* // @match https://alpharatio.cc/* // @match https://anthelion.me/* // @match https://nebulance.io/* // @grant GM.xmlHttpRequest // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/508248/Is%20it%20Down%20%28Updated%29.user.js // @updateURL https://update.greasyfork.icu/scripts/508248/Is%20it%20Down%20%28Updated%29.meta.js // ==/UserScript== (function() { 'use strict'; const Settings = { showIfStable: false, checkInterval: 120000, // check every 2 mins by default apiEndpoints: { 'redacted.sh': 'https://red.trackerstatus.info/api/all/', 'orpheus.network': 'https://ops.trackerstatus.info/api/all/', 'passthepopcorn.me': 'https://ptp.trackerstatus.info/api/all/', 'broadcasthe.net': 'https://btn.trackerstatus.info/api/all/', 'gazellegames.net': 'https://ggn.trackerstatus.info/api/all/', 'alpharatio.cc': 'https://ar.trackerstatus.info/api/all/', 'anthelion.me': 'https://ant.trackerstatus.info/api/all/', 'nebulance.io': 'https://nbl.trackerstatus.info/api/all/' } }; const styles = ` .tracker-status { position: fixed; z-index: 9999; box-sizing: border-box; width: 100%; display: none; padding: 0.2rem; bottom: 0; left: 0; font-size: 14px; text-align: center; } .tracker-status--stable { background-color: #056B00; } .tracker-status--offline { background-color: #A00E0E; } .tracker-status--unstable { background-color: #FFA500; } .tracker-status--both { background-color: #FF4B33; } .tracker-status__message { color: white; font-weight: bold; margin: 0; } .tracker-status__link { color: white; text-decoration: underline; } body { transition: margin-bottom 0.3s ease; } `; function createStatusElement() { const trackerStatus = document.createElement('div'); trackerStatus.className = 'tracker-status'; const message = document.createElement('p'); message.className = 'tracker-status__message'; trackerStatus.appendChild(message); document.body.append(trackerStatus); const styleElement = document.createElement('style'); styleElement.textContent = styles; document.head.appendChild(styleElement); return trackerStatus; } function updateStatus(trackerStatus) { const currentDomain = window.location.hostname; const apiUrl = Settings.apiEndpoints[currentDomain]; if (!apiUrl) { console.error('No API endpoint found for the current domain'); return; } GM.xmlHttpRequest({ method: 'POST', url: apiUrl, headers: { "X-Requested-With": "XMLHttpRequest" }, onload: function(response) { const messageElement = trackerStatus.querySelector('.tracker-status__message'); if (response.status >= 200 && response.status < 400) { const services = JSON.parse(response.responseText); const downServices = Object.entries(services).filter(service => service[1].Status === '0'); const unstableServices = Object.entries(services).filter(service => service[1].Status === '2'); if (downServices.length > 0 && unstableServices.length > 0) { trackerStatus.className = 'tracker-status tracker-status--both'; messageElement.innerHTML = `The following services are currently offline or unstable: ${[...downServices, ...unstableServices].map(service => service[0]).join(', ')}. More info`; trackerStatus.style.display = 'block'; } else if (downServices.length > 0) { trackerStatus.className = 'tracker-status tracker-status--offline'; messageElement.innerHTML = `The following services are currently offline: ${downServices.map(service => service[0]).join(', ')}. More info`; trackerStatus.style.display = 'block'; } else if (unstableServices.length > 0) { trackerStatus.className = 'tracker-status tracker-status--unstable'; messageElement.innerHTML = `The following services are unstable: ${unstableServices.map(service => service[0]).join(', ')}. More info`; trackerStatus.style.display = 'block'; } else { trackerStatus.className = 'tracker-status tracker-status--stable'; messageElement.textContent = 'All systems operational.'; trackerStatus.style.display = Settings.showIfStable ? 'block' : 'none'; } } else { console.error('Error fetching tracker status'); trackerStatus.className = 'tracker-status tracker-status--offline'; messageElement.innerHTML = 'Error fetching tracker status.'; trackerStatus.style.display = 'block'; } const statusHeight = trackerStatus.offsetHeight; document.body.style.marginBottom = trackerStatus.style.display !== 'none' ? `${statusHeight}px` : '0'; }, onerror: function(error) { console.error('Error fetching tracker status:', error); const messageElement = trackerStatus.querySelector('.tracker-status__message'); trackerStatus.className = 'tracker-status tracker-status--offline'; messageElement.innerHTML = 'Error fetching tracker status.'; trackerStatus.style.display = 'block'; const statusHeight = trackerStatus.offsetHeight; document.body.style.marginBottom = `${statusHeight}px`; } }); } const trackerStatus = createStatusElement(); updateStatus(trackerStatus); setInterval(() => updateStatus(trackerStatus), Settings.checkInterval); window.addEventListener('resize', () => { const statusHeight = trackerStatus.offsetHeight; document.body.style.marginBottom = trackerStatus.style.display !== 'none' ? `${statusHeight}px` : '0'; }); })();