Advertisement
Nyan-Cat

NyanCatTW1's badge type display script v1.000

Apr 27th, 2024
877
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         NyanCatTW1's badge type display script
  3. // @namespace    http://tampermonkey.net/
  4. // @version      1.000
  5. // @author       Nyan Cat
  6. // @match        https://*.roblox.com/badges/*
  7. // @grant        GM.xmlHttpRequest
  8. // @grant        unsafeWindow
  9. // @connect      bor-valuable-badge-database-production.up.railway.app
  10. // ==/UserScript==
  11.  
  12. /*jshint esversion: 8 */
  13. /*jshint loopfunc: true */
  14. /*global $ */
  15.  
  16. var allNVLBadgeIds = new Set();
  17. function isNVL(badgeId) {
  18.     return allNVLBadgeIds.has(parseInt(badgeId));
  19. }
  20.  
  21. function getBadgeValue(placeId, badgeId) {
  22.     if (badgeValuesDict[placeId].hasOwnProperty(badgeId)) {
  23.         return badgeValuesDict[placeId][badgeId];
  24.     }
  25.     return NaN;
  26. }
  27.  
  28. function reportMissingBadgesToDB(badgeIds) {
  29.     GM.xmlHttpRequest({
  30.         method: "GET",
  31.         url: `https://bor-valuable-badge-database-production.up.railway.app/api/v3/user/reportmissing?badgeIds=${badgeIds.join(",")}`,
  32.         onload: function(response) {
  33.             return response;
  34.         },
  35.         onerror: function() {
  36.             return "null";
  37.         }
  38.     });
  39. }
  40.  
  41. function checkBadgeValuesOnload(placeId, response) {
  42.     unsafeWindow.badgeDbNeedsRefresh = false;
  43.     var resp = JSON.parse(response.responseText).data;
  44.     var missingBadges = [];
  45.     for (var badgeId in resp) {
  46.         var badge = resp[badgeId];
  47.         if (!badge.found) {
  48.             unsafeWindow.badgeDbNeedsRefresh = true;
  49.             missingBadges.push(badge.badge_id);
  50.             continue;
  51.         }
  52.  
  53.         valueCheckedBadgeIds[placeId].add(badge.badge_id);
  54.         badgeValuesDict[placeId][badge.badge_id] = badge.value;
  55.         if (badge.is_nvl) {
  56.             allNVLBadgeIds.add(badge.badge_id);
  57.         }
  58.     }
  59.  
  60.     if (unsafeWindow.badgeDbNeedsRefresh) {
  61.         reportMissingBadgesToDB(missingBadges);
  62.     }
  63. }
  64.  
  65. function checkBadgeValues() {
  66.     for (let i = 0, n = allPlaces.length; i < n; i++) {
  67.         let placeId = allPlaces[i];
  68.  
  69.         var toCheck = [];
  70.         for (let i = 0, n = allBadgeIds[placeId].length; i < n; i++) {
  71.             let id = allBadgeIds[placeId][i];
  72.             if (!valueCheckedBadgeIds[placeId].has(id)) {
  73.                 toCheck.push(id);
  74.             }
  75.         }
  76.  
  77.         if (toCheck.length === 0) {
  78.             continue;
  79.         }
  80.  
  81.         toCheck = toCheck.slice(0, 100);
  82.         const url = `https://bor-valuable-badge-database-production.up.railway.app/api/v3/query/bybadgeids?badgeIds=${toCheck.join(",")}`;
  83.  
  84.         GM.xmlHttpRequest({
  85.             method: "GET",
  86.             url: url,
  87.             onload: checkBadgeValuesOnload.bind(null, placeId),
  88.         });
  89.     }
  90. }
  91.  
  92. function initPlaceRecord(placeId) {
  93.     if (allPlaces.includes(placeId)) {
  94.         console.error("Who the hell called initPlaceRecord twice ??/?/???///");
  95.         return;
  96.     }
  97.  
  98.     allPlaces.push(placeId);
  99.     allBadgeIds[placeId] = [];
  100.  
  101.     valueCheckedBadgeIds[placeId] = valueCheckedBadgeIds[placeId] || new Set();
  102.     badgeValuesDict[placeId] = badgeValuesDict[placeId] || {};
  103. }
  104.  
  105. var allPlaces = [];
  106. var allBadgeIds = {};
  107. var valueCheckedBadgeIds = {};
  108. var badgeValuesDict = {};
  109. var curPlaceId = 0;
  110.  
  111. function updateBadgesPageDisplay() {
  112.     var badgeValue = getBadgeValue(curPlaceId, allBadgeIds[curPlaceId][0]);
  113.     if (isNaN(badgeValue)) {
  114.         badgeValue = 0;
  115.     } else {
  116.         badgeValue += 1;
  117.     }
  118.  
  119.     if (isNVL(allBadgeIds[curPlaceId][0])) {
  120.         badgeValue = 4;
  121.     }
  122.  
  123.     var badgeValueDescs = ["Loading...", "Free", "Valuable (non-legacy)", "Legacy", "Non-Valuable Legacy"];
  124.     var badgeValueElm = document.getElementById("nyan-badge-value");
  125.     if (badgeValueElm === null) {
  126.         document.getElementsByClassName("clearfix item-type-field-container")[0].outerHTML += `
  127. <div class="clearfix item-field-container">
  128.     <div class="font-header-1 text-subheader text-label text-overflow field-label">Value</div>
  129.     <div class="field-content" id="nyan-badge-value">Loading...</div>
  130. </div>`;
  131.     } else if (badgeValueElm.innerText != badgeValueDescs[badgeValue]) {
  132.         badgeValueElm.innerText = badgeValueDescs[badgeValue];
  133.     }
  134. }
  135.  
  136. // Init
  137. if (location.href.includes("/badges/")) {
  138.     // F: I know, I know, it's dirty like hell
  139.     curPlaceId = [].concat.apply([], document.getElementsByTagName("a"))
  140.                     .filter((elm) => elm.href.includes("PlaceId="))[0]
  141.                     .href.split("PlaceId=")[1].split("&")[0];
  142.     initPlaceRecord(curPlaceId);
  143.     allBadgeIds[curPlaceId].push(location.href.split("/")[4])
  144.     setInterval(updateBadgesPageDisplay, 100);
  145.     setInterval(checkBadgeValues, 100);
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement