NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @author Hate, Rexedead // @name SteamWishListTool // @namespace steam-categories // @version 1.3.1 // @description steam-categories // @grant GM_getValue // @grant GM_setValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_addStyle // @namespace https://github.com/Rexedead/SteamWishlistTool // @run-at document-end // @include *steamcommunity.com/id/*/wishlist* // @include *steamcommunity.com/profiles/*/wishlist* // @downloadURL https://raw.githubusercontent.com/Rexedead/SteamWishlistTool/master/SteamWishlistTool.user.js // @updateURL https://raw.githubusercontent.com/Rexedead/SteamWishlistTool/master/SteamWishlistTool.meta.js // ==/UserScript== (function () { 'use strict'; // Your code here... //ИТА ЩЕДЕВРЕЛЬНЭ! ©Hate // GM_deleteValue(""); window.addEventListener("load", Greasemonkey_main, false); function Greasemonkey_main() { var DivBar = document.createElement('div'); var addTextField = document.createElement('input'); var addButton = document.createElement('button'); var child = document.getElementById('wishlist_items'); var span = document.createElement('span'); var categoryList = document.createElement('div'); var donBut = document.createElement('button'); var donSpan = document.createElement('span'); var userid = window.location.href.split('/')[4]; console.log("ID for this page is: " + userid); var observer; span.appendChild(document.createTextNode("Add new category")); addButton.appendChild(span); addButton.className = "btnv6_blue_hoverfade btn_small "; addButton.type = "button"; addButton.onclick = formcheck; addButton.style = "outline: none;"; addTextField.type = "text"; addTextField.name = "TextField"; addTextField.onkeydown = enterf; DivBar.style = "margin-bottom: 13px;"; DivBar.className = "Add_Button_Bar"; DivBar.id = "barName"; donSpan.appendChild(document.createTextNode("DONATE")); donSpan.style = "color: rgb(255, 249, 0);"; donBut.className = "btnv6_blue_hoverfade btn_small "; donBut.type = "button"; donBut.appendChild(donSpan); donBut.style = "outline: none;"; donBut.id = "donate"; donBut.onclick = donate; categoryList.className = "categoryList"; categoryList.classList.add("droptarget"); DivBar.appendChild(addTextField); DivBar.appendChild(addButton); DivBar.appendChild(donBut); child.parentNode.insertBefore(DivBar, child); child.insertBefore(categoryList, child.firstChild); child.classList.add("droptarget"); restore(); //Functions function enterf(e) { if (e.keyCode == 13) { formcheck(); } } function save() { var stringOfSave = ""; var arrOfDetails; arrOfDetails = categoryList.childNodes; for (var inD = 0; inD < arrOfDetails.length; inD++) { stringOfSave += (categoryList.childNodes[inD].className); var cat_items = arrOfDetails[inD].querySelectorAll('.wishlistRow'); for (var j = 0; j < cat_items.length; j++) { var item_id = cat_items[j].id; //В переменной item_id хранится id j элемента категории stringOfSave += "," + item_id; } stringOfSave += "^"; } stringOfSave = stringOfSave.replace(/\^$/, ""); //console.log(stringOfSave.valueOf()); GM_setValue(userid, stringOfSave); } function restore() { //DEBUG START var arry = []; arry = GM_listValues(); var p = arry.length; console.log('##=## GM_listValues ' + p); for (p = arry.length - 1; p > -1; p--) { console.log('##=## ' + p + ' ' + arry[p] + ' = ' + GM_getValue(arry[p])); } //DEBUG END try { var restoreWishlistSave = GM_getValue(userid); if (restoreWishlistSave.length > 0) { var wlitemsUns = restoreWishlistSave.valueOf().split("^"); var wlItemsByCat; for (var cat = 0; cat < wlitemsUns.length; cat++) { wlItemsByCat = wlitemsUns[cat].valueOf().split(","); addTag(wlItemsByCat[0]); var category = child.getElementsByClassName(wlItemsByCat[0]); for (var item = 1; item < wlItemsByCat.length; item++) { try { var game = document.getElementById(wlItemsByCat[item]); category[0].appendChild(game); } catch (npe) { console.log("list modified"); } } } //console.log(wlItemsByCat[0]); // console.log(wlitems); } } catch (newpage) { } } function addGameInCategory(addInCategoryButton) { var activeButtons = document.querySelectorAll('.push'); var addSpan = addInCategoryButton.firstElementChild; addInCategoryButton.parentNode.lastChild.onclick = cancel; addInCategoryButton.parentNode.lastChild.firstElementChild.textContent = "Cancel"; for (var i = 0; i < activeButtons.length; i++) { activeButtons[i].firstElementChild.textContent = "Add games"; activeButtons[i].classList.remove("push"); var button = activeButtons[i]; activeButtons[i].onclick = function () { addGameInCategory(button); }; } function cancel() { addInCategoryButton.firstElementChild.textContent = "Add games"; addInCategoryButton.onclick = again; addInCategoryButton.parentNode.lastChild.onclick = function () { remGames(addInCategoryButton.parentNode.lastChild); }; addInCategoryButton.parentNode.lastChild.firstElementChild.textContent = "Remove games"; var game = document.querySelectorAll('.selection'); for (var i = 0; i < game.length; i++) { game[i].parentNode.remove(); } } addSpan.textContent = "Add selected games"; addInCategoryButton.onclick = addInCurrentCategory; addInCategoryButton.classList.add("push"); addCheckBox(); function again() { addGameInCategory(addInCategoryButton); } function addInCurrentCategory() { addList(addInCategoryButton); } } function addList(addInCategoryButton) { var game = document.querySelectorAll('.selection'); addInCategoryButton.lastChild.textContent = "Add games"; addInCategoryButton.onclick = again; var games = addInCategoryButton.parentNode.parentNode.querySelectorAll('.wishlistRow'); var col = addInCategoryButton.parentNode.parentNode.firstChild.getElementsByClassName('num')[0].firstChild; for (var i = 0; i < game.length; i++) { if (game[i].checked) { observer.observe(game[i].parentNode.parentNode, { attributes: true, }); game[i].parentNode.parentNode.classList.add("inCategory"); addInCategoryButton.parentNode.parentNode.appendChild(game[i].parentNode.parentNode); col.nodeValue = Number(col.nodeValue) + 1; } game[i].parentNode.remove(); //addInCategoryButton.parentNode.lastChild.onclick = function () { remGames(addInCategoryButton.parentNode.lastChild); }; addInCategoryButton.parentNode.lastChild.firstElementChild.textContent = "Remove games"; } function again() { addGameInCategory(addInCategoryButton); } save(); } function remGames(Button) { Button.parentNode.firstElementChild.onclick = cancel; Button.parentNode.firstElementChild.firstElementChild.textContent = "Cancel"; delCheckBox(Button); Button.lastChild.textContent = "Remove Selected Games"; Button.onclick = remFromList; function delGame() { remGames(Button); } function cancel() { Button.firstElementChild.textContent = "Remove Games"; Button.onclick = delGame; Button.parentNode.firstElementChild.onclick = function () { addGameInCategory(Button.parentNode.firstElementChild); }; Button.parentNode.firstElementChild.firstElementChild.textContent = "Add games"; var sfrgame = Button.parentNode.parentNode.querySelectorAll('.selection'); for (var i = 0; i < sfrgame.length; i++) { sfrgame[i].parentNode.remove(); } } function remFromList() { var game = Button.parentNode.parentNode.querySelectorAll('.inCategory'); var sfrgame = Button.parentNode.parentNode.querySelectorAll('.selection'); var col = Button.parentNode.parentNode.firstChild.getElementsByClassName('num')[0].firstChild; for (var i = 0; i < sfrgame.length; i++) { if (sfrgame[i].checked) { game[i].parentNode.parentNode.parentNode.appendChild(game[i]); col.nodeValue = Number(col.nodeValue) - 1; game[i].classList.remove("inCategory"); } sfrgame[i].parentNode.remove(); } Button.firstElementChild.textContent = "Remove Games"; Button.onclick = delGame; Button.parentNode.firstElementChild.onclick = function () { addGameInCategory(Button.parentNode.firstElementChild); }; Button.parentNode.firstElementChild.firstElementChild.textContent = "Add games"; save(); } } function formcheck() { if (addTextField.value === "") { alert("Error: empty field!"); } else { if (categoryList.getElementsByClassName(addTextField.value).length > 0) { alert("This category already exists"); } else { addTag(addTextField.value); } } } function addTag(cat_name) { var category = document.createElement('details'); var categoryName = document.createElement('summary'); var addInCategoryButton = document.createElement('button'); var remInCategoryButton = document.createElement('button'); var remGamesButton = document.createElement('button'); var addSpan = document.createElement('span'); var remCatSpan = document.createElement('span'); var remGamesSpan = document.createElement('span'); var addRemoveDiv = document.createElement('div'); var itemsNum = document.createElement('span'); var sortOptionBar = document.createElement('div'); var sortByPriceButton = document.createElement('button'); var sortByNameButton = document.createElement('button'); var sortByRankButton = document.createElement('button'); observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (mutation.attributeName === "class") { category.addEventListener("mouseout", handl); } }); }); itemsNum.classList.add("num"); itemsNum.appendChild(document.createTextNode("0")); sortOptionBar.appendChild(document.createTextNode("Sort by: ")); sortOptionBar.appendChild(sortByRankButton); sortOptionBar.appendChild(sortByNameButton); sortOptionBar.appendChild(sortByPriceButton); sortOptionBar.style = "float: right; outline: none; font-size: 11px; color: #56707f; padding: 0 15px;"; sortByRankButton.className = "btnv6_blue_hoverfade btn_small "; sortByRankButton.appendChild(document.createTextNode("by rank")); sortByRankButton.type = "button"; sortByRankButton.onclick = sortByRankIncreas; sortByRankButton.style = "line-height: 22px; padding: 0 15px;"; sortByPriceButton.className = "btnv6_blue_hoverfade btn_small "; sortByPriceButton.appendChild(document.createTextNode("by price")); sortByPriceButton.type = "button"; sortByPriceButton.onclick = sortByPriceIncreas; sortByPriceButton.style = "line-height: 22px; padding: 0 15px;"; sortByNameButton.className = "btnv6_blue_hoverfade btn_small "; sortByNameButton.appendChild(document.createTextNode("by name")); sortByNameButton.type = "button"; sortByNameButton.onclick = sortByNameIncreas; sortByNameButton.style = "line-height: 22px; padding: 0 15px;"; function handl(event) { var col = this.firstChild.getElementsByClassName('num')[0].firstChild; var drag = categoryList.querySelectorAll('.inDrag'); if (drag.length > 0) { //alert("asd"); drag[0].classList.remove("inCategory"); col.nodeValue = Number(col.nodeValue) - 1; child.appendChild(drag[0]); save(); } category.removeEventListener("mouseout", handl); } addSpan.appendChild(document.createTextNode("Add games")); remCatSpan.appendChild(document.createTextNode("Remove Category")); remGamesSpan.appendChild(document.createTextNode("Remove Games")); addInCategoryButton.appendChild(addSpan); addInCategoryButton.className = "btnv6_blue_hoverfade btn_small "; addInCategoryButton.type = "button"; addInCategoryButton.onclick = add; addInCategoryButton.style = "outline: none;"; remInCategoryButton.appendChild(remCatSpan); remInCategoryButton.className = "btnv6_blue_hoverfade btn_small "; remInCategoryButton.style = "float: right; outline: none;"; remInCategoryButton.type = "button"; remInCategoryButton.onclick = del; remGamesButton.appendChild(remGamesSpan); remGamesButton.className = "btnv6_blue_hoverfade btn_small "; remGamesButton.type = "button"; remGamesButton.onclick = delGame; remGamesButton.style = "outline: none;"; addRemoveDiv.appendChild(addInCategoryButton); addRemoveDiv.appendChild(remGamesButton); addRemoveDiv.style = "margin-bottom: 2%"; categoryName.appendChild(document.createTextNode(cat_name)); //get user text input categoryName.appendChild(document.createTextNode(" (")); categoryName.appendChild(itemsNum); categoryName.appendChild(document.createTextNode(")")); categoryName.appendChild(sortOptionBar); categoryName.style = "font-size: 16px; font-weight: 300; color: #ffffff; padding: 5px; cursor: default; cursor: default; cursor: -moz-default; outline: none;"; categoryName.appendChild(remInCategoryButton); category.appendChild(categoryName); category.appendChild(addRemoveDiv); category.className = cat_name; category.style = "min-height: inherit; background-color: rgba( 84, 133, 183, 0.2); color: #56707f; padding: 8px 1%; margin-bottom: 15px; position: relative;"; category.addEventListener("DOMNodeInserted", function (event) { var games = category.querySelectorAll('.wishlistRow'); var col = category.firstChild.getElementsByClassName('num')[0].firstChild; for (var i = 0; i < games.length; i++) { if (!games[i].classList.contains('inCategory')) { observer.observe(games[i], { attributes: true }); games[i].classList.add("inCategory"); col.nodeValue = Number(col.nodeValue) + 1; save(); } } }); addTextField.value = null; categoryList.appendChild(category); save(); function add() { addGameInCategory(addInCategoryButton); } function del() { var gamesMas = category.querySelectorAll('.inCategory'); var cat = category.parentNode.parentNode; for (var i = 0; i <= gamesMas.length - 1; i++) { gamesMas[i].classList.remove("inCategory"); cat.appendChild(gamesMas[i]); } if (category.querySelectorAll('.push').length > 0) { var game = document.querySelectorAll('.selection'); for (var j = 0; j < game.length; j++) { game[j].parentNode.remove(); } } category.remove(); save(); } function delGame() { remGames(remGamesButton); } function sortByRankIncreas() { var items = Array.prototype.slice.call(category.querySelectorAll('.wishlistRow')); for (var AllItems = items.length - 1; AllItems >= 0; AllItems--) { for (var item = 0; item < AllItems; item++) { if (Number(items[item].getElementsByClassName('wishlist_rank')[0].value) > Number(items[item + 1].getElementsByClassName('wishlist_rank')[0].value)) { var temp = items[item]; items[item] = items[item + 1]; items[item + 1] = temp; } } } for (var i = 0; i < items.length; i++) { category.appendChild(items[i]); } sortByRankButton.onclick = sortByRankDecreas; } function sortByRankDecreas() { var items = Array.prototype.slice.call(category.querySelectorAll('.wishlistRow')); for (var AllItems = items.length - 1; AllItems >= 0; AllItems--) { for (var item = 0; item < AllItems; item++) { if (Number(items[item].getElementsByClassName('wishlist_rank')[0].value) < Number(items[item + 1].getElementsByClassName('wishlist_rank')[0].value)) { var temp = items[item]; items[item] = items[item + 1]; items[item + 1] = temp; } } } for (var i = 0; i < items.length; i++) { category.appendChild(items[i]); } sortByRankButton.onclick = sortByRankIncreas; } function sortByNameIncreas() { var items = Array.prototype.slice.call(category.querySelectorAll('.wishlistRow')); for (var AllItems = items.length - 1; AllItems >= 0; AllItems--) { for (var item = 0; item < AllItems; item++) { if (items[item].getElementsByTagName('h4')[0].firstChild.nodeValue.charAt(0) > items[item + 1].getElementsByTagName('h4')[0].firstChild.nodeValue.charAt(0)) { var temp = items[item]; items[item] = items[item + 1]; items[item + 1] = temp; } } } for (var i = 0; i < items.length; i++) { category.appendChild(items[i]); } sortByNameButton.onclick = sortByNameDecreas; } function sortByNameDecreas() { var items = Array.prototype.slice.call(category.querySelectorAll('.wishlistRow')); for (var AllItems = items.length - 1; AllItems >= 0; AllItems--) { for (var item = 0; item < AllItems; item++) { if (items[item].getElementsByTagName('h4')[0].firstChild.nodeValue.charAt(0) < items[item + 1].getElementsByTagName('h4')[0].firstChild.nodeValue.charAt(0)) { var temp = items[item]; items[item] = items[item + 1]; items[item + 1] = temp; } } } for (var i = 0; i < items.length; i++) { category.appendChild(items[i]); } sortByNameButton.onclick = sortByNameIncreas; } function sortByPriceIncreas() { var items = Array.prototype.slice.call(category.querySelectorAll('.wishlistRow')); for (var AllItems = items.length - 1; AllItems >= 0; AllItems--) { for (var item = 0; item < AllItems; item++) { var first = select(items[item]); var second = select(items[item + 1]); //alert(items[item].getElementsByClassName('price').length); if (first > second) { var temp = items[item]; items[item] = items[item + 1]; items[item + 1] = temp; } } } function select(check) { try { return Number(check.getElementsByClassName('discount_final_price')[0].firstChild.nodeValue.substring(0, check.getElementsByClassName('discount_final_price')[0].firstChild.nodeValue.indexOf(" "))); } catch (ErrEvent) { return Number(check.getElementsByClassName('price')[0].firstChild.nodeValue.trim().substring(0, check.getElementsByClassName('price')[0].firstChild.nodeValue.trim().indexOf(" "))); } } for (var i = 0; i < items.length; i++) { category.appendChild(items[i]); } sortByPriceButton.onclick = sortByPriceDecreas; } function sortByPriceDecreas() { var items = Array.prototype.slice.call(category.querySelectorAll('.wishlistRow')); for (var AllItems = items.length - 1; AllItems >= 0; AllItems--) { for (var item = 0; item < AllItems; item++) { var first = select(items[item]); var second = select(items[item + 1]); //alert(items[item].getElementsByClassName('price').length); if (first < second) { var temp = items[item]; items[item] = items[item + 1]; items[item + 1] = temp; } } } function select(check) { try { return Number(check.getElementsByClassName('discount_final_price')[0].firstChild.nodeValue.substring(0, check.getElementsByClassName('discount_final_price')[0].firstChild.nodeValue.indexOf(" "))); } catch (ErrEvent) { return Number(check.getElementsByClassName('price')[0].firstChild.nodeValue.trim().substring(0, check.getElementsByClassName('price')[0].firstChild.nodeValue.trim().indexOf(" "))); } } for (var i = 0; i < items.length; i++) { category.appendChild(items[i]); } sortByPriceButton.onclick = sortByPriceIncreas; } } function delCheckBox(Button) { var game = Button.parentNode.parentNode.querySelectorAll('.inCategory'); function check() { if (this.firstElementChild.checked === false) { this.firstElementChild.checked = true; } else { this.firstElementChild.checked = false; } } for (var i = 0; i <= game.length - 1; i++) { if (game[i].classList.contains('inCategory')) { var checkBox = document.createElement('input'); var text = document.createElement('button'); text.appendChild(checkBox); text.appendChild(document.createTextNode("Select for remove")); text.className = "btnv6_blue_hoverfade btn_small "; text.style = "cursor: default; cursor: pointer; cursor: -moz-default; outline: none;position: relative; display: block; padding-right: 1%; margin-top: 1%;"; text.type = "button"; text.onclick = check; checkBox.type = "checkbox"; checkBox.className = "selection"; game[i].appendChild(text); } } } function addCheckBox() { var game = document.querySelectorAll('.wishlistRow'); function check() { if (this.firstElementChild.checked === false) { this.firstElementChild.checked = true; } else { this.firstElementChild.checked = false; } } for (var i = 0; i <= game.length - 1; i++) { //PROBLEM PLACE if (!game[i].classList.contains('inCategory') && game[i].querySelectorAll('.selection').length <= 0) { var checkBox = document.createElement('input'); var text = document.createElement('button'); text.appendChild(checkBox); text.appendChild(document.createTextNode("Add game to category")); text.className = "btnv6_blue_hoverfade btn_small "; text.style = "cursor: default; cursor: pointer; cursor: -moz-default; outline: none; position: relative; display: block; padding-right: 1%; margin-top: 1%;"; text.type = "button"; text.onclick = check; checkBox.type = "checkbox"; checkBox.className = "selection"; game[i].appendChild(text); } } } function donate() { GM_addStyle(" .donatip { position: relative; display: inline-block;} .donatip .donatiptext { visibility: hidden; width: 120px; background-color: #2B475E; color: #67C1F5; text-align: center; border-radius: 6px; padding: 5px 0; /* Position the donatip */ position: absolute; z-index: 1; bottom: 100%; left: 50%; margin-left: -60px;} .donatip:hover .donatiptext {visibility: visible;}"); donBut.firstChild.textContent = "Cancel"; donBut.onclick = cancel; var help = document.createElement('span'); help.className = 'help'; help.innerHTML = '<a target="_blank" class="donatip" href="https://steamcommunity.com/tradeoffer/new/?partner=22861895&token=GtBPPaCq">' + '<img src="/public/shared/images/header/globalheader_logo.png" height="20">' + ' <span class="donatiptext">Help us via items</span>' + '</a>' + '<a target="_blank" class="donatip" href="https://www.paypal.me/rexedead">' + '<img src="https://www.paypalobjects.com/webstatic/i/logo/rebrand/ppcom-white.svg" height="18">' + '<span class="donatiptext">Help us via cent</span>' + '</a>'; help.style = "position:absolute; margin-left:5px;"; var donParent = document.getElementById("barName"); donParent.appendChild(help); function cancel() { donParent.removeChild(help); donBut.firstChild.textContent = "DONATE"; donBut.onclick = donate; } } } })();