Nitro Type Leaderboards Overlay

View NT leaderboards natively on Nitro Type, Nitro Race, and Nitro Math

目前为 2025-03-26 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Nitro Type Leaderboards Overlay
  3. // @namespace https://ntleaderboard.netlify.app/
  4. // @version 4.4
  5. // @description View NT leaderboards natively on Nitro Type, Nitro Race, and Nitro Math
  6. // @author nincaleb // adapted from Ginfino's Code
  7. // @match https://www.nitrotype.com/*
  8. // @match https://www.nitrotype.com/race/*
  9. // @match https://www.nitromath.com/*
  10. // @grant none
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. 'use strict';
  16.  
  17. function embedLeaderboards(event) {
  18. if (event) event.preventDefault();
  19.  
  20. if (!document.getElementById('leaderboardsIframe')) {
  21. const iframe = document.createElement('iframe');
  22. iframe.id = 'leaderboardsIframe';
  23. iframe.src = 'https://ntleaderboard.netlify.app/';
  24. iframe.style.position = 'fixed';
  25. iframe.style.top = '0';
  26. iframe.style.left = '0';
  27. iframe.style.width = '100%';
  28. iframe.style.height = '100%';
  29. iframe.style.border = 'none';
  30. iframe.style.zIndex = '9999';
  31.  
  32. const closeButtonContainer = document.createElement('div');
  33. closeButtonContainer.style.position = 'fixed';
  34. closeButtonContainer.style.top = '0';
  35. closeButtonContainer.style.right = '0';
  36. closeButtonContainer.style.width = '70px';
  37. closeButtonContainer.style.height = '70px';
  38. closeButtonContainer.style.zIndex = '10001';
  39. closeButtonContainer.style.pointerEvents = 'auto';
  40.  
  41. const closeButton = document.createElement('img');
  42. closeButton.src = 'https://res.cloudinary.com/dxgejwplx/image/upload/v1740041586/Red_X_ltzgdy.png';
  43. closeButton.alt = 'Close Leaderboards';
  44. closeButton.style.position = 'absolute';
  45. closeButton.style.top = '10px';
  46. closeButton.style.right = '10px';
  47. closeButton.style.width = '50px';
  48. closeButton.style.height = '50px';
  49. closeButton.style.cursor = 'pointer';
  50.  
  51. closeButton.onclick = function () {
  52. document.body.removeChild(iframe);
  53. document.body.removeChild(closeButtonContainer);
  54. };
  55.  
  56. closeButtonContainer.appendChild(closeButton);
  57. document.body.appendChild(iframe);
  58. document.body.appendChild(closeButtonContainer);
  59. }
  60. }
  61.  
  62. function insertLeaderboardButton() {
  63. const navList = document.querySelector('.nav-list');
  64. if (navList && !document.querySelector('.nt-custom-tab-leaderboards')) {
  65. const li = document.createElement('li');
  66. li.className = 'nav-list-item nt-custom-tab-leaderboards';
  67. li.innerHTML = `
  68. <a href="#"
  69. class="nav-link"
  70. id="leaderboardsLink_unique">
  71. Leaderboards
  72. </a>
  73. `;
  74.  
  75. // Find the "Achievements" and "News" buttons
  76. const achievementsButton = Array.from(navList.children).find((child) =>
  77. child.textContent.trim().includes('Achievements')
  78. );
  79. const newsButton = Array.from(navList.children).find((child) =>
  80. child.textContent.trim().includes('News')
  81. );
  82.  
  83. // Insert the new button between "Achievements" and "News" if both exist
  84. if (achievementsButton && newsButton) {
  85. navList.insertBefore(li, newsButton);
  86. } else {
  87. // Fallback: insert at the end if buttons not found
  88. navList.appendChild(li);
  89. }
  90.  
  91. document
  92. .getElementById('leaderboardsLink_unique')
  93. .addEventListener('click', embedLeaderboards);
  94. }
  95. }
  96.  
  97. function observeNavList() {
  98. const observer = new MutationObserver((mutations, obs) => {
  99. const navList = document.querySelector('.nav-list');
  100. if (navList) {
  101. insertLeaderboardButton();
  102. if (document.querySelector('.nt-custom-tab-leaderboards')) {
  103. obs.disconnect();
  104. }
  105. }
  106. });
  107.  
  108. observer.observe(document.body, {
  109. childList: true,
  110. subtree: true,
  111. });
  112. }
  113.  
  114. // Try to insert the button immediately
  115. insertLeaderboardButton();
  116.  
  117. // If immediate insertion fails, set up the observer
  118. if (!document.querySelector('.nt-custom-tab-leaderboards')) {
  119. observeNavList();
  120. }
  121. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址