NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name PowerPyx Trophy Tracker // @description A script to track the trophies in the PowerPyx trophy guides website // @namespace alike.powerpyx // @version 1.0 // @author alike03 // @icon https://www.powerpyx.com/wp-content/uploads/trophy-guide-platinum.png // @updateURL https://openuserjs.org/meta/alike03/PowerPyx_Trophy_Tracker.meta.js // @downloadURL https://openuserjs.org/install/alike03/PowerPyx_Trophy_Tracker.user.js // @match https://www.powerpyx.com/*trophy* // @noframes // @copyright 2023, alike03 (https://openuserjs.org/users/alike03) // @license MIT // ==/UserScript== /* jshint esversion: 6 */ (function() { const save = { trophies: { hideCompleted: false, completed: [] } }; const updateSave = () => { localStorage.setItem('powerpyx.alike', JSON.stringify(save)); }; const loadSave = () => { const loaded = localStorage.getItem('powerpyx.alike'); if (loaded) { Object.assign(save, JSON.parse(loaded)); } } const loadCss = () => { const style = document.createElement('style'); style.innerHTML = ` .alike-container { display: flex; justify-content: space-evenly; margin: 50px; } .alike-button { padding: 7px 13px; } .completed { opacity: 0.5; filter: grayscale(100%); } .hide-completed .completed, .hide-completed .completed + .details { display: none; } `; document.head.appendChild(style); } const table = document.querySelector('table'); if (!table) return; const tbody = table.querySelector('tbody'); if (!tbody) return; const rows = tbody.querySelectorAll('tr'); if (!rows) return; // initialize loadSave(); loadCss(); // Check if the table is hidden if (save.trophies.hideCompleted) { table.classList.add('hide-completed'); } // Add the button to hide completed trophies const hideCompletedButton = document.createElement('button'); hideCompletedButton.innerText = 'Hide completed'; hideCompletedButton.classList.add('hide-button', 'alike-button'); hideCompletedButton.addEventListener('click', function() { table.classList.toggle('hide-completed'); save.trophies.hideCompleted = table.classList.contains('hide-completed'); updateSave(); }); const container = document.createElement('div'); container.classList.add('alike-container'); container.appendChild(hideCompletedButton); table.parentNode.insertBefore(container, table); // Add the button to each row to mark the trophy as completed let count = 0; let completed = 0; rows.forEach((row, index) => { const cells = row.querySelectorAll('td'); if (!cells) return; // if it is only one cell it is the content if (cells.length === 1) { row.classList.add('details'); } else { row.classList.add('header'); count++; // Check if the trophy is completed and add the class if (save.trophies.completed[index]) { row.classList.add('completed'); completed++; } // Add the button to mark the trophy as completed const button = document.createElement('button'); button.innerText = 'Completed'; button.classList.add('complete-button', 'alike-button'); button.addEventListener('click', function() { row.classList.toggle('completed'); save.trophies.completed[index] = row.classList.contains('completed'); if (save.trophies.completed[index]) { completed++; } else { completed--; } updateCounter(); updateSave(); }); cells[2].appendChild(button); } }); // Add the counter const counter = document.createElement('div'); counter.innerText = `${completed}/${count}`; counter.classList.add('counter'); container.appendChild(counter); const updateCounter = () => { counter.innerText = `${completed}/${count}`; } })();