RetroAchievements Cleanup Unlocks

Hide total unlocks and remove parentheses from hardcore unlocks on game pages

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         RetroAchievements Cleanup Unlocks
// @namespace    https://metalsnake.space/
// @version      0.4
// @description  Hide total unlocks and remove parentheses from hardcore unlocks on game pages
// @author       MetalSnake
// @match        *://retroachievements.org/*
// @icon         https://static.retroachievements.org/assets/images/favicon.webp
// @grant        none
// @license      GPL-3.0-or-later; https://spdx.org/licenses/GPL-3.0-or-later.html
// ==/UserScript==

(function () {
  'use strict';

  let lastUrl = location.href;

  function processUnlocks() {
    const totalSpans = document.querySelectorAll('span.cursor-help[title="Total unlocks"]');

    totalSpans.forEach(totalSpan => {
      // Hide total unlocks span
      totalSpan.style.display = 'none';

      // Look for the next hardcore unlocks span
      let sibling = totalSpan.nextElementSibling;
      while (sibling && !sibling.matches('span.cursor-help.font-bold[title="Hardcore unlocks"]')) {
        sibling = sibling.nextElementSibling;
      }

      if (sibling && sibling.textContent) {
        // Remove parentheses from the hardcore unlocks text
        sibling.textContent = sibling.textContent.replace(/[()]/g, '');
      }
    });
  }

  function onUrlChange() {
    // kleiner Delay, damit der neue DOM aufgebaut werden kann
    setTimeout(processUnlocks, 50);
  }

  // Initialer Seitenaufruf
  // Run once on load
   setTimeout(() => {
        processUnlocks();
    }, 100);


  // pushState / replaceState hooken
  const originalPushState = history.pushState;
  const originalReplaceState = history.replaceState;

  history.pushState = function (...args) {
    originalPushState.apply(this, args);
    if (location.href !== lastUrl) {
      lastUrl = location.href;
      onUrlChange();
    }
  };

  history.replaceState = function (...args) {
    originalReplaceState.apply(this, args);
    if (location.href !== lastUrl) {
      lastUrl = location.href;
      onUrlChange();
    }
  };

  // Browser zurück / vor
  window.addEventListener('popstate', () => {
    if (location.href !== lastUrl) {
      lastUrl = location.href;
      onUrlChange();
    }
  });



})();