Skip to content

Instantly share code, notes, and snippets.

@Kein
Last active January 17, 2020 19:15
Show Gist options
  • Save Kein/9fd38b55590989b7b71090797b8e5d43 to your computer and use it in GitHub Desktop.
Save Kein/9fd38b55590989b7b71090797b8e5d43 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Wishlist Bulk Remover
// @version 0.1
// @description Removes wishlist items in bulk
// @author Kein
// @match *://store.steampowered.com/wishlist/profiles/*
// @match *://store.steampowered.com/wishlist/id/*
// @grant none
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
if (!g_bCanEdit)
return;
const appIDs = [];
const x = "<input type='checkbox' class='bulk_checkbox' name='slct_item' style='position: relative; left: calc(50% - 4px); top: 5px;'>";
const btn = "<div id='bulk_delete' class='filter_tab dropdown settings_tab'> <img src='data:image/svg+xml;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MTIgNjEyIj48c3R5bGU+LmF7ZmlsbDojZmZmO308L3N0eWxlPjxwYXRoIGQ9Ik01MTAuOCA4NS45Yy0yOS4zLTE0LjktNTguNC0xNi4zLTU5LjYtMTYuNCAtMC4yIDAtMC41IDAtMC43IDBINDA0LjJjMC0wLjEgMC0wLjMgMC0wLjQgMC0yNi44LTEyLjgtNDguMS0zNS45LTU5LjkgLTE2LjEtOC4yLTMxLjktOS4xLTMzLjYtOS4yQzMzNC40IDAgMzM0LjIgMCAzMzMuOSAwaC01NS44Yy0wLjIgMC0wLjUgMC0wLjcgMCAtMS43IDAuMS0xNy41IDEtMzMuNiA5LjJDMjIwLjYgMjEgMjA3LjggNDIuMyAyMDcuOCA2OS4xYzAgMC4xIDAgMC4zIDAgMC40aC00Ni4zYy0wLjIgMC0wLjUgMC0wLjcgMCAtMS4yIDAuMS0zMC4zIDEuNC01OS42IDE2LjQgLTI4LjIgMTQuNC02MS45IDQ0LjEtNjEuOSAxMDMuNSAwIDkuNiA3LjggMTcuNCAxNy40IDE3LjRoMTUuMmw2Ny4xIDM5MC44YzEuNCA4LjMgOC43IDE0LjQgMTcuMSAxNC40aDI5OS45YzguNCAwIDE1LjctNi4xIDE3LjEtMTQuNGw2Ny4xLTM5MC44aDE1LjJjOS42IDAgMTcuNC03LjggMTcuNC0xNy4zQzU3Mi43IDEzMCA1MzkuMSAxMDAuMyA1MTAuOCA4NS45ek03NS40IDE3Mi4xYzQuMi0yNC41IDE3LjgtNDIuOSA0MC43LTU0LjggMjEuMy0xMS4xIDQzLjMtMTIuOSA0NS45LTEzLjFoMjg4YzIuNiAwLjIgMjQuMSAxLjkgNDUgMTIuNiAyMy40IDExLjkgMzcuMyAzMC41IDQxLjYgNTUuM0w3NS40IDE3Mi4xIDc1LjQgMTcyLjF6TTI0Mi41IDY5LjFjMC0xMy42IDUuMi0yMi43IDE2LjItMjguNiA4LjktNC44IDE4LjQtNS43IDE5LjktNS44aDU0LjdjMS43IDAuMSAxMS4xIDEuMSAxOS45IDUuOCAxMS4xIDUuOSAxNi4yIDE1IDE2LjIgMjguNiAwIDAuMSAwIDAuMyAwIDAuNEgyNDIuNUMyNDIuNSA2OS40IDI0Mi41IDY5LjMgMjQyLjUgNjkuMXpNNDQxLjMgNTc3LjNIMTcwLjdsLTYzLjYtMzcwLjVoMzk3LjhMNDQxLjMgNTc3LjN6IiBjbGFzcz0iYSIvPjxwYXRoIGQ9Ik0zMDYgNTE5LjZjOS42IDAgMTcuNC03LjggMTcuNC0xNy4zVjI1Ny45YzAtOS42LTcuOC0xNy4zLTE3LjMtMTcuMyAtOS42IDAtMTcuMyA3LjgtMTcuMyAxNy40VjUwMi4yQzI4OC43IDUxMS44IDI5Ni40IDUxOS42IDMwNiA1MTkuNnoiIGNsYXNzPSJhIi8+PHBhdGggZD0iTTIwMy44IDUwMy44YzAuOCA5IDguNCAxNS44IDE3LjMgMTUuOCAwLjUgMCAxIDAgMS42LTAuMSA5LjUtMC44IDE2LjYtOS4zIDE1LjctMTguOGwtMjEuNy0yNDQuM2MtMC44LTkuNS05LjMtMTYuNi0xOC44LTE1LjcgLTkuNSAwLjgtMTYuNiA5LjMtMTUuNyAxOC44TDIwMy44IDUwMy44eiIgY2xhc3M9ImEiLz48cGF0aCBkPSJNMzg5LjQgNTE5LjVjMC41IDAgMSAwLjEgMS42IDAuMSA4LjkgMCAxNi41LTYuOCAxNy4zLTE1LjhsMjEuNy0yNDQuM2MwLjgtOS41LTYuMi0xOC0xNS43LTE4LjggLTkuNS0wLjktMTggNi4yLTE4LjggMTUuN2wtMjEuNyAyNDQuM0MzNzIuOCA1MTAuMiAzNzkuOSA1MTguNyAzODkuNCA1MTkuNXoiIGNsYXNzPSJhIi8+PC9zdmc+'></div>";
let hbeat = setInterval(firstPass, 200, document.getElementById("throbber"));
const wl = document.querySelector('#wishlist_ctn');
const s = document.querySelector(".search");
// Functions
function firstPass(t)
{
if (t == null || t == undefined)
{
resetTimer(hbeat);
}
else if (t.style.display.length >= 3 && g_Wishlist.rgElements != null)
{
resetTimer(hbeat);
let k = Object.keys(g_Wishlist.rgElements);
for (let i = 0; i < k.length; i++)
{
let n = g_Wishlist.rgElements[k[i]][0];
if (n.querySelector(".bulk_checkbox") == null)
n.firstElementChild.firstElementChild.innerHTML += x;
}
mainPass();
}
}
function mainPass()
{
if (wl)
{
s.innerHTML = btn + s.innerHTML;
s.querySelector("#bulk_delete").addEventListener("click", clF, false);
wl.addEventListener("click", CheckEvent, false);
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === 'childList' && mutation.target.id === 'wishlist_ctn' && mutation.addedNodes.length > 0) {
setTimeout(addCheckBox(mutation.addedNodes), 0);
}
});
});
observer.observe(wl, { childList: true });
}
}
function resetTimer(obj) {
clearInterval(obj);
obj = hbeat = null;
}
function clF() {
let me = event.target;
if (me.id === "bulk_delete" || me.parentElement.id === "bulk_delete") {
if (appIDs.length < 1)
ShowAlertDialog("Wishlist Bulk remover", "Does not look like you have any games marked", "OK");
else {
ShowConfirmDialog("Confirm mass removal", "Remove '%1$s' selected entries from your wishlist?".replace(/%1\$s/,V_EscapeHTML(appIDs.length))).done(function(){
let counter = appIDs.length;
let dlg = ShowBlockingWaitDialog('Removal in process', 'Entries left: #' + counter);
for (let i = 0; i < appIDs.length; i++) {
const nAppId = appIDs[i];
$J.ajax({
type: "POST",
url: g_strWishlistBaseURL + 'remove/',
data: {'appid':nAppId, sessionid: g_sessionID},
error: function (xhr, ajaxOptions, thrownError) {
console.log('Received error from SteamAPI for appID ' + nAppId + ': ' + thrownError + '|' + xhr.status);
},
complete: function (xhr, ajaxOptions, thrownError) {
dlg.Dismiss();
if (counter > 0) {
dlg = ShowBlockingWaitDialog('Removal in process', 'Entries left: #' + --counter);
if (counter <= 0)
setTimeout(dlg.Dismiss(), 3000);
}
}.bind(dlg).bind(counter)
});
delete g_rgAppInfo[nAppId];
}
appIDs.clear();
$J('#wishlist_ctn').removeClass ('sorting');
g_Wishlist.rgAllApps = Object.keys(g_rgAppInfo);
g_Wishlist.Update(true);
});
}
}
}
function addCheckBox(nodes) {
if (nodes != null && nodes != undefined) {
for (let i = 0; i < nodes.length; i++) {
let u = nodes[i].querySelector(".bulk_checkbox");
if (u == null || u == undefined) {
nodes[i].firstElementChild.firstElementChild.innerHTML += x;
}
}
}
}
function CheckEvent() {
let me = event.target;
if (me.name === "slct_item") {
let id = me.closest('.wishlist_row').dataset.appId;
let has = appIDs.includes(id);
if (me.checked && !has)
appIDs.push(id);
else if (!me.checked && has)
appIDs.splice(appIDs.indexOf(id), 1);
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment