Steam Wishlist Sorter

Sort Steam wishlist contents by review score and title, then save the new order.

// ==UserScript==
// @name         Steam Wishlist Sorter
// @namespace    Violentmonkey Scripts
// @version      2.4
// @description  Sort Steam wishlist contents by review score and title, then save the new order.
// @autor        Vamos
// @match        https://store.steampowered.com/wishlist/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
  'use strict';

  function waitForWishlist() {
      return new Promise((resolve) => {
          const checkWishlist = () => {
              if (window.g_Wishlist && window.g_Wishlist.rgAllApps) {
                  resolve(window.g_Wishlist);
              } else {
                  setTimeout(checkWishlist, 500);
              }
          };
          checkWishlist();
      });
  }

  function exportWishlist(wishlist) {
      const wishlistArray = wishlist.rgAllApps.map(appId => {
          const app = window.g_rgAppInfo[appId];
          if (app) {
              return {
                  id: appId,
                  title: app.name,
                  reviewScore: app.review_score || 0
              };
          } else {
              return null;
          }
      }).filter(app => app !== null);

      wishlistArray.sort((a, b) => {
          if (a.reviewScore === b.reviewScore) {
              return a.title.localeCompare(b.title);
          }
          return b.reviewScore - a.reviewScore;
      });

      console.log(`[SWPS] Number of elements in the wishlist: ${wishlistArray.length}`);
      return wishlistArray;
  }

  function saveWishlistOrder(wishlistArray) {
      window.g_Wishlist.rgAllApps = wishlistArray.map(app => app.id);
      window.g_Wishlist.SaveOrder();
      console.log("[SWPS] Wishlist order saved.");
  }

  function addSortButton() {
      const button = document.createElement('button');
      button.innerText = 'Sort Wishlist';
      button.style.position = 'fixed';
      button.style.top = '10px';
      button.style.right = '10px';
      button.style.zIndex = '1000';
      document.body.appendChild(button);

      button.addEventListener('click', async () => {
          const wishlist = await waitForWishlist();
          const sortedWishlist = exportWishlist(wishlist);
          saveWishlistOrder(sortedWishlist);

          // Show spinner and block inputs
          const spinner = document.createElement('div');
          spinner.innerHTML = `
              <div style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 1001; display: flex; align-items: center; justify-content: center;">
                  <div style="border: 16px solid #f3f3f3; border-top: 16px solid #3498db; border-radius: 50%; width: 120px; height: 120px; animation: spin 2s linear infinite;"></div>
              </div>
              <style>
                  @keyframes spin {
                      0% { transform: rotate(0deg); }
                      100% { transform: rotate(360deg); }
                  }
              </style>
          `;
          document.body.appendChild(spinner);

          // Wait for 5 seconds before reloading the page
          await new Promise(resolve => setTimeout(resolve, 5000));
          location.reload(); // Refresh the page
      });
  }

  waitForWishlist().then(() => {
      addSortButton();
  });
})();

QingJ © 2025

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