Add tools for many bundle sites.
// ==UserScript== // @name Bundle Helper // @namespace iFantz7E.BundleHelper // @version 1.09 // @description Add tools for many bundle sites. // @match *://cubicbundle.com/* // @match *://dailyindiegame.com/* // @match *://forums.steampowered.com/forums/showthread.php?* // @match *://www.gogobundle.com/latest/bundles/* // @match *://groupees.com/* // @match *://otakumaker.com/* // @match *://www.otakumaker.com/* // @match *://otakubundle.com/latest/bundles/* // @match *://steamcommunity.com/*/home* // @match *://steamcommunity.com/groups/*/announcements* // @match *://steamcompanion.com/gifts/* // @match *://steamground.com/* // @match *://store.steampowered.com/account/notinterested/* // @match *://store.steampowered.com/app/* // @match *://store.steampowered.com/widget/* // @match *://store.steampowered.com/search/* // @match *://whosgamingnow.net/* // @match *://www.bunchkeys.com/* // @match *://www.bundlekings.com/* // @match *://www.fanatical.com/* // @match *://www.dailyindiegame.com/* // @match *://www.gamebundle.com/* // @match *://www.hrkgame.com/* // @match *://www.humblebundle.com/* // @match *://www.indiegala.com/* // @match *://www.orlygift.com/* // @match *://www.reddit.com/r/*/comments/* // @match *://www.superduperbundle.com/* // @match *://www.sgtools.info/* // @match *://steamkeys.ovh/* // @match *://steamdb.info/* // @run-at document-start // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @connect store.steampowered.com // @connect www.hrkgame.com // @connect www.fanatical.com // @connect www.steamgifts.com // @icon https://store.steampowered.com/favicon.ico // @license GPL-3.0-only // @copyright 2016, 7-elephant // @supportURL https://steamcommunity.com/id/7-elephant/ // @contributionURL https://www.paypal.me/iFantz7E // ==/UserScript== // Connect to store.steampowered.com to get owner info // Connect to www.hrkgame.com and www.fanatical.com to get Steam ID of each products // Connect to www.steamgifts.com to get bundle threads // License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html // Since 10 Jan 2016 // https://greasyfork.org/scripts/16105-bundle-helper/ (function () { "use strict"; // jshint multistr:true function attachOnLoad(callback) { window.addEventListener("load", function (e) { callback(); }); } function attachOnReady(callback) { document.addEventListener("DOMContentLoaded", function (e) { callback(); }); } function insertBeforeElement(newNode, referenceNode) { referenceNode.parentNode.insertBefore(newNode, referenceNode); } function insertAfterElement(newNode, referenceNode) { referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); } function removeElement(node) { node.parentElement.removeChild(node); } function reload() { var curHref = window.location.href; var posHashtag = curHref.indexOf("#"); if (posHashtag > -1) { window.location = curHref.substr(0, posHashtag); } else { window.location = curHref; } } function getQueryByName(name, url) { if (url == null) { url = location == null ? "" : location.search; } name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"); var r###lts = regex.exec(url); var retVal = ""; if (r###lts != null) { retVal = r###lts[1].replace(/\+/g, " "); try { retVal = decodeURIComponent(retVal); } catch (ex) { console.error("getQueryByName", ex.message); } } return retVal; } function clickToSelect(ele) { if (ele != null) { var range = document.createRange(); range.setStartBefore(ele.firstChild); range.setEndAfter(ele.lastChild); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } } function scrollToElement(selector, offset) { if (typeof offset === "undefined") { offset = -20; } var ele = null; if (selector) { if (selector instanceof HTMLElement) { ele = selector; } else { ele = document.querySelector(selector); } if (ele) { ele.scrollIntoView(true); window.scrollBy(0, offset); } } } function normalizeArray(arr) { arr = arr.filter(function(elem, index, self) { return index == self.indexOf(elem); }); return arr; } function randNum(min, max) { return Math.round(Math.random() * (max - min) + min); } var timeoutList = []; var intervalList = []; function setTimeoutCustom(func, tm, params) { var id = setTimeout(func, tm, params); timeoutList.push(id); return id; } function clearTimeoutAll() { for (var i = 0; i < timeoutList.length; i++) { clearTimeout(timeoutList[i]); } } function setIntervalCustom(func, tm, params) { var id = setInterval(func, tm, params); intervalList.push(id); return id; } function clearIntervalAll() { for (var i = 0; i < intervalList.length; i++) { clearInterval(intervalList[i]); } } function getUnixTimestamp() { return parseInt(Date.now() / 1000); } function resetProfileCacheTimestamp() { GM_setValue(name_profile_time, 0); console.log("Cache: refresh"); } function isProfileCacheExpired() { var isExpired = false; var timestampExpired = 5 * 60; var profileTimestamp = GM_getValue(name_profile_time, 0); var profileTimestampDiff = getUnixTimestamp() - profileTimestamp; if (profileTimestampDiff > timestampExpired) { isExpired = true; } if (!isExpired) { var profileJson = GM_getValue(name_profile_json, 0); if (!profileJson) { isExpired = true; } } if (!isExpired) { console.log("Cache: " + profileTimestampDiff + "s"); } return isExpired; } function setProfileCache(json) { GM_setValue(name_profile_json, json); GM_setValue(name_profile_time, getUnixTimestamp()); } function markOwned(query, getElementCallback, getProductIdCallback , classOwned, classNotInterested, classWished, getCountCallback) { if (!document.querySelector(query)) { //console.log("markOwned: empty"); return; } if (!getElementCallback) { getElementCallback = function(ele, type) { // type -> 1: Owned, 2: Ignored, 3: Wishlist return ele; }; } if (!getProductIdCallback) { getProductIdCallback = function(ele) { return ele.getAttribute("href"); }; } if (!getCountCallback) { getCountCallback = function(appCount, subCount, appOwned, subOwned) { }; } if (!classOwned) classOwned = ""; if (!classNotInterested) classNotInterested = ""; if (!classWished) classWished = ""; var apps = []; var subs = []; var rgxId = /[0-9]{3,}/g; var rgxApp = /((:\/\/(store\.steampowered\.com|steamcommunity\.com|steamdb\.info)(\/agecheck)?\/app|\/steam\/apps)\/[0-9]+|^[0-9]{3,}$)/i; var rgxSub = /(:\/\/(store\.steampowered\.com|steamdb\.info)\/sub|\/steam\/subs)\/[0-9]+/i; var markFromJson = function(dataRes) { if (!dataRes) { //console.log("markFromJson: empty"); return; } var countOwned = [0, 0]; var countAll = [0, 0]; if (typeof dataRes["rgOwnedApps"] !== "undefined" && typeof dataRes["rgOwnedPackages"] !== "undefined" && typeof dataRes["rgIgnoredApps"] !== "undefined") { var eleApps = document.querySelectorAll(query); for (var i = 0; i < eleApps.length; i++) { var attrHref = getProductIdCallback(eleApps[i]); var ids = attrHref.match(rgxId); if (ids) { var valId = parseInt(ids[0]); if (rgxApp.test(attrHref)) { if (dataRes["rgOwnedApps"].indexOf(valId) > -1) { var ele = getElementCallback(eleApps[i], 1); if (ele && classOwned !== "") { ele.classList.add(classOwned); } countOwned[0]++; } else { //console.log("App: not owned - https://store.steampowered.com/app/" + id + "/"); if (dataRes["rgWishlist"].indexOf(valId) > -1) { var ele = getElementCallback(eleApps[i], 3); if (ele && classWished !== "") { ele.classList.add(classWished); } } else if (dataRes["rgIgnoredApps"][valId] === 0) { var ele = getElementCallback(eleApps[i], 2); if (ele && classNotInterested !== "") { ele.classList.add(classNotInterested); } } } countAll[0]++; } else if (rgxSub.test(attrHref)) { if (dataRes["rgOwnedPackages"].indexOf(valId) > -1) { var ele = getElementCallback(eleApps[i], 1); if (ele && classOwned !== "") { ele.classList.add(classOwned); } countOwned[1]++; } else { //console.log("Sub: not owned - https://store.steampowered.com/sub/" + id + "/"); } countAll[1]++; } } } } if (countAll[0] > 1) { console.log("App: owned " + countOwned[0] + "/" + countAll[0]); } if (countAll[1] > 1) { console.log("Sub: owned " + countOwned[1] + "/" + countAll[1]); } getCountCallback(countAll[0], countAll[1], countOwned[0], countOwned[1]); } // Force mark from cache { setTimeoutCustom(function() { // Delay after script ran var profileJson = GM_getValue(name_profile_json, 0); markFromJson(profileJson); }, 300); } /*if (isProfileCacheExpired()) { GM_xmlhttpRequest( { method: "GET", url: "https://store.steampowered.com/dynamicstore/userdata/?t=" + getUnixTimestamp(), onload: function(response) { console.log("markOwned: userdata " + response.responseText.length + " bytes"); var dataRes = JSON.parse(response.responseText); setProfileCache(dataRes); markFromJson(dataRes); } // End onload }); }*/ } function markOwned_old(query, markOwnedCallback) { var rgxId = /[0-9]{3,}/g; var rgxApp = /:\/\/((store\.steampowered|steamcommunity)\.com\/app|cdn.akamai.steamstatic.com\/steam\/apps)\/[0-9]+/i; var rgxSub = /:\/\/store\.steampowered\.com\/sub\/[0-9]+/i; GM_xmlhttpRequest( { method: "GET", url: "https://store.steampowered.com/dynamicstore/userdata/?t=" + getUnixTimestamp(), onload: function(response) { var dataRes = JSON.parse(response.responseText); var countOwned = [0, 0]; var countAll = [0, 0]; if (typeof dataRes["rgOwnedApps"] !== "undefined" && typeof dataRes["rgOwnedPackages"] !== "undefined" && typeof dataRes["rgIgnoredApps"] !== "undefined") { var eleApps = document.querySelectorAll(query); for (var i = 0; i < eleApps.length; i++) { var attrHref = eleApps[i].getAttribute("href") || eleApps[i].getAttribute("src"); var ids = attrHref.match(rgxId); if (ids != null) { var valId = parseInt(ids[0]); if (rgxApp.test(attrHref)) { if (dataRes["rgOwnedApps"].indexOf(valId) > -1) { markOwnedCallback(eleApps[i]); countOwned[0]++; } else { console.log("App: not owned - http://store.steampowered.com/app/" + valId + "/"); } countAll[0]++; } else if (rgxSub.test(attrHref)) { if (dataRes["rgOwnedPackages"].indexOf(valId) > -1) { markOwnedCallback(eleApps[i]); countOwned[1]++; } else { console.log("Sub: not owned - http://store.steampowered.com/sub/" + valId + "/"); } countAll[1]++; } } } } var diff = countAll[0] - countOwned[0]; console.log("App: " + countOwned[0] + "/" + countAll[0] + (diff > 10 ? " Diff: " + diff : "")); console.log("Sub: " + countOwned[1] + "/" + countAll[1]); } // End onload }); } var name_profile_json = "bh_profile_json"; var name_profile_time = "bh_profile_time"; function main() { // #8BC349 // #6EA028 // #2ECC71 // #92B300 GM_addStyle( " .bh_button { " + " border-radius: 2px; border: medium none; padding: 10px; display: inline-block; " + " cursor: pointer; background: #67C1F5 none repeat scroll 0% 0%; " + " width: 120px; text-align: center; } " + " .bh_button a { " + " text-decoration: none !important; color: #FFF !important; " + " padding: 0px 2px; } " + " .bh_button:hover a { " + " color: #0079BF !important; } " + " .bh_button, .bh_button a { " + " font-family: Verdana; font-size: 12px; " + " line-height: 16px; } " + " .bh_owned { background-color: #7CA156 !important; " + " transition: background 500ms ease 0s; } " + " #bh_markOwned { " + " position: fixed; right: 20px; bottom: 20px; z-index: 33; } " + " #bh_OpenLib { " + " position: fixed; right: 20px; bottom: 65px; z-index: 33; } " ); var url = document.documentURI; if (url.indexOf("hrkgame.com") > -1) { if (window !== window.parent) return; GM_addStyle( " .bh_owned { background-color: #97BA22 !important; } " + " #bh_markOwned { bottom: 40px !important; } " ); if (url.indexOf("/randomkeyshop/make-bundle") > -1) { // Add load button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_loadAll"; divButton.setAttribute("style", "bottom: 86px;"); divButton.setAttribute("onclick", " \ this.firstElementChild.textContent = \"Loading...\"; \ window.scrollTo(0,document.body.scrollHeight); \ var countHidden = 5; \ var idx = setInterval(function(ele) \ { \ var eleLoad = document.querySelector(\"#loader-icon\"); \ if (eleLoad) \ { \ window.scrollTo(0,document.body.scrollHeight); \ if (eleLoad.style.display == \"none\") \ { \ countHidden--; \ } \ else \ { \ countHidden = 5; \ } \ } \ else \ { \ countHidden--; \ } \ if (countHidden < 0) \ { \ clearInterval(idx); \ ele.style.display=\"none\"; \ var eleRes = document.querySelector(\"#r###lt\"); \ if (eleRes) \ { \ eleRes.scrollIntoView(true); \ window.scrollBy(0, -80); \ } \ } \ }, 500, this); \ return false; \ "); divButton.innerHTML = "<a onclick='return false;'>Load All</a>"; document.body.appendChild(divButton); } // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { GM_xmlhttpRequest( { method: "GET", url: "https://store.steampowered.com/dynamicstore/userdata/?t=" + getUnixTimestamp(), onload: function(response) { var dataResSteam = JSON.parse(response.responseText); if (typeof dataResSteam["rgOwnedApps"] == "undefined" || dataResSteam["rgOwnedApps"].length == 0) { console.log("not logged in"); } else if (typeof dataResSteam["rgOwnedApps"] !== "undefined" && typeof dataResSteam["rgOwnedPackages"] !== "undefined" && typeof dataResSteam["rgIgnoredApps"] !== "undefined") { var parser = new DOMParser(); var rgxId = /[0-9]+/; var rgxApp = /:\/\/store\.steampowered\.com\/app\/[0-9]+/i; var rgxSub = /:\/\/store\.steampowered\.com\/sub\/[0-9]+/i; var elesProduct = document.querySelectorAll("#r###lt .content:not(.bh_owned)"); var productCur = 0; var tmId = setInterval(function() { if (productCur >= elesProduct.length) { clearInterval(tmId); } else { var dataHref = elesProduct[productCur].firstElementChild.getAttribute("data-href"); if (dataHref != null) { var fullHref = "https://www.hrkgame.com" + dataHref + "/"; elesProduct[productCur].setAttribute("bh_href", fullHref); GM_xmlhttpRequest( { method: "GET", url: fullHref, onload: function(response) { var isOwned = false; var dataRes = parser.parseFromString(response.responseText, "text/html"); var eleA = dataRes.querySelector(".storeside a.item[href*='store.steampowered.com/']"); if (eleA != null) { var attrHref = eleA.href; var id = rgxId.exec(attrHref); if (id != null) { var valId = parseInt(id); if (rgxApp.test(attrHref)) { if (dataResSteam["rgOwnedApps"].indexOf(valId) > -1) { isOwned = true; } else { console.log("App: not owned - http://store.steampowered.com/app/" + id + "/"); } } else if (rgxSub.test(attrHref)) { if (dataResSteam["rgOwnedPackages"].indexOf(valId) > -1) { isOwned = true; } else { console.log("Sub: not owned - http://store.steampowered.com/sub/" + id + "/"); } } if (isOwned) { for (var i = 0; i < elesProduct.length; i++) { if (elesProduct[i].getAttribute("bh_href") == response.finalUrl) { elesProduct[i].classList.add("bh_owned"); break; } } } } } else { console.log("Info: not found - " + response.finalUrl); } } // End onload }); } } productCur++ }, 200); } } // End onload }); }); } } else if (url.indexOf("/library") > -1) { var clientScript = ' \ confirm = function() \ { \ return true; \ }; \ '; var eleClientScript = document.createElement("script"); eleClientScript.innerHTML = clientScript; document.head.appendChild(eleClientScript); } } else if (url.indexOf("fanatical.com") > -1) { GM_addStyle( //" .bh_owned { background-color: #A7CC00 !important; } " " .bh_owned { background-color: #D0FE00 !important; } " + " .bh_owned:hover { background-color: #BBE500 !important; } " + " .bh_owned *, .bh_owned.pnm-product-card .card-block .card-title { " + " color: #444 !important; fill: #444 !important; } " + " .bh_owned .was, .bh_owned .was * { color: #777 !important; } " + " .bh_owned .hide-checkbox + label span { color: #DDD !important; } " + " .bh_owned .hide-checkbox:checked + label span { color: #D0FE00 !important; } " + " .bh_owned .text-fade { display: none !important; } " + " #launcher { bottom: 100px !important; } " ); if (url.indexOf("/bundle/") > -1) { var fn_markOwned = function() { markOwned(".product-details a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement .parentElement.parentElement.parentElement .parentElement.parentElement.parentElement .parentElement.parentElement.parentElement .parentElement.firstElementChild.firstElementChild; }, null, "bh_owned"); }; var obTarget_root = document.querySelector("#root"); if (obTarget_root) { var tmOb_root = -1; var obMu_root = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.type !== "attributes" || mutation.target.tagName === "TR") { clearTimeout(tmOb_root); tmOb_root = setTimeoutCustom(function() { fn_markOwned(); }, 200); } }); }); var obConfig_root = { childList: true, subtree: true }; obMu_root.observe(obTarget_root, obConfig_root); } // Add mark button /*{ var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { fn_markOwned(); }); }*/ } else if (url.indexOf("/pick-and-mix/") > -1) { // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.param_promo = url.substr(url.indexOf("/pick-and-mix/") + 14) .replace(/\?.+/, "").replace(/#.+/, ""); eleA.param_promo = divButton.param_promo; divButton.addEventListener("click", function(e) { var promo = e.target.param_promo; GM_xmlhttpRequest( { method: "GET", url: "https://store.steampowered.com/dynamicstore/userdata/?t=" + getUnixTimestamp(), onload: function(response) { var dataResSteam = JSON.parse(response.responseText); if (typeof dataResSteam["rgOwnedApps"] == "undefined" || dataResSteam["rgOwnedApps"].length == 0) { console.log("not logged in"); } else if (typeof dataResSteam["rgOwnedApps"] !== "undefined" && typeof dataResSteam["rgOwnedPackages"] !== "undefined" && typeof dataResSteam["rgIgnoredApps"] !== "undefined") { var elesProduct = document.querySelectorAll(".pnm-product-card:not(.bh_owned)"); for (var i = 0; i < elesProduct.length; i++) { var eleSlug = elesProduct[i].querySelector(".faux-block-link__overlay-link"); if (eleSlug) { var href = eleSlug.href; elesProduct[i].dataset.slug = href.substr(href.indexOf("/game/") + 6); } } GM_xmlhttpRequest( { method: "GET", url: "https://api.fanatical.com/api/promotions/" + promo, onload: function(response) { var dataRes = JSON.parse(response.responseText); var slugs = []; var i = dataRes.length - 1; //for (var i = 0; i < dataRes.length; i++) { for (var j = 0; j < dataRes[i].products.length; j++) { if (dataRes[i].products[j].drm.steam) { slugs.push(dataRes[i].products[j].slug); } } } slugs = normalizeArray(slugs); var slugCur = 0; var tmId = setInterval(function() { if (slugCur >= slugs.length) { clearInterval(tmId); } else { GM_xmlhttpRequest( { method: "GET", url: "https://api.fanatical.com/api/products/" + slugs[slugCur], onload: function(response) { var isOwned = false; var dataRes = JSON.parse(response.responseText); if (!dataRes.steam.sub) { if (dataResSteam["rgOwnedApps"].indexOf(dataRes.steam.id) > -1) { isOwned = true; } else { console.log("App: not owned - http://store.steampowered.com/app/" + dataRes.steam.id + "/ - " + dataRes.slug); } } else { if (dataResSteam["rgOwnedPackages"].indexOf(dataRes.steam.id) > -1) { isOwned = true; } else { console.log("Sub: not owned - http://store.steampowered.com/sub/" + dataRes.steam.id + "/ - " + dataRes.slug); } } if (isOwned) { for (var i = 0; i < elesProduct.length; i++) { if (elesProduct[i].dataset.slug === dataRes.slug) { elesProduct[i].classList.add("bh_owned"); break; } } } } // End onload }); } slugCur++; }, 200); } // End onload }); } } // End onload }); }); } } } else if (url.indexOf("reddit.com") > -1) { GM_addStyle( " .bh_owned , .md .bh_owned code { background-color: #DFF0D8 !important; } " + " li > .bh_owned, div > p > .bh_owned { padding: 0px 2px 0px 2px; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); //document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned("td > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); }); } setTimeout(function() { markOwned("td > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); markOwned("li > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement; }, null, "bh_owned"); markOwned("li > p > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); markOwned("div > p > a[href*='store.steampowered.com/']" , null, null, "bh_owned"); }, 1000); } else if (url.indexOf("groupees.com") > -1) { GM_addStyle( " .bh_owned { background-color: #DFF0D8 !important; } " + " #subscribe-form { display: none; } " + " input[name='search'] { position: fixed; z-index: 1099; left: 18%; top: 16px; } " + " button[role='show3dKeyModal'] { position: fixed; z-index: 1099; left: 72%; top: 16px; } " + " .cancel-spin { position: fixed !important; z-index: 1099 !important; left: 39.5% !important; top: 22px !important; } " + " .bh_owned_dark { background-color: rgba(140, 197, 63, 0.6) !important; } " ); /* var a = document.querySelector("input[name='search']"); var b = document.querySelector("#subscribe-form"); b.parentElement.insertBefore(a,b); b.parentElement.removeChild(b); */ // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { var apps = []; var eleApps = document.querySelectorAll(".bundle > .products .info .description a[href*='store.steampowered.com/app/']" + ", .expanded .product-info a[href*='store.steampowered.com/app/']" + ", .product-details.hidden .external-links a[href*='store.steampowered.com/app/']"); console.log("Apps: " + eleApps.length); for (var i = 0; i < eleApps.length; i++) { var app = /[0-9]+/.exec(eleApps[i].getAttribute("href")); if (app != null) { apps.push(app[0]); } } apps = apps.filter(function(elem, index, self) { return index == self.indexOf(elem); }); var appAll = apps.join(","); GM_xmlhttpRequest( { method: "GET", headers: { "Cache-Control": "max-age=0" }, url: "https://store.steampowered.com/api/appuserdetails/?appids=" + appAll, onload: function(response) { var dataRes = JSON.parse(response.responseText); var countOwned = 0; var elePurchases = null; var elePrds = document.querySelectorAll(".bundle > .products .product h3" + ", .expanded .details, .product-info"); var eleApps = document.querySelectorAll(".bundle > .products .info" + ", .expanded .details, .product-details.hidden"); for (var i = 0; i < eleApps.length; i++) { var eleApp = eleApps[i].querySelector(".description a[href*='store.steampowered.com/app/']" + ", .product-info a[href*='store.steampowered.com/app/']" + ", .external-links a[href*='store.steampowered.com/app/']"); if (eleApp != null) { var app = /[0-9]+/.exec(eleApp.getAttribute("href")); if (app != null) { if (typeof dataRes[app] !== "undefined") { if (dataRes[app].success) { if (dataRes[app].data.is_owned) { var eleLabel = elePrds[i]; if (eleLabel.classList.contains("product-info")) { eleLabel.classList.add("bh_owned_dark"); // Mark game in build bundles { var eleName = eleLabel.querySelector("h4"); if (eleName) { var name = eleName.textContent.trim(); if (elePurchases == null) { elePurchases = document.querySelectorAll(".purchase-products > .bundle-product > .input > label"); } if (elePurchases != null) { for (var j = 0; j < elePurchases.length; j++) { if (elePurchases[j].textContent.trim() == name) { elePurchases[j].parentElement.parentElement.classList.add("bh_owned_dark"); } } } } } } else { eleLabel.classList.add("bh_owned"); } countOwned++; } else { console.log("App: not owned - http://store.steampowered.com/app/" + app); } } else { console.log("App: not success - http://store.steampowered.com/app/" + app); } } } } } console.log("Apps: owned - " + countOwned); } // End onload }); }); } } else if (url.indexOf("indiegala.com") > -1) { GM_addStyle( " .bh_owned, .bh_owned .bundle-item-trading { background-color: rgba(125, 174, 45, 0.9) !important; } " + " .ig-bundle { padding-left: 3px; padding-right: 3px; margin-bottom: 3px; } " + " .bh_owned.ig-bundle { background-color: rgba(125, 174, 45) !important; } " + " .bh_owned.ig-bundle .bundle-item-trading { background-color: rgba(125, 174, 45, 0) !important; } " + " .bh_owned .add-info-button-cont .left, .bh_owned .add-info-button-cont .palette-background-2 { " + " background-color: #7DAE2D !important; } " + " .bh_owned .add-info-button-cont .right .inner-info, .bh_owned .add-info-button-cont .right .palette-border-2 { " + " border-color: #7DAE2D !important; } " + " .bh_owned.medium-game .game-cover-medium { border: 3px solid #7DAE2D; background-color: rgba(125, 174, 45, 0.4); } " + " .bh_owned.game-data-cont { background-color: #76AD1C !important; } " + " .bundle-item-trading-cards-cont span { opacity: 0.7; } " + " .span-title .title_game, .span-title .title_drm, .span-title .title_music { " + " line-height: 43px !important; margin: 10px 0px 10px 15px !important; " + " padding-left: 10px !important; border-radius: 3px !important; } " + " .medium-game { min-height: 146px; } " ); // Auto reload when error { setTimeout(function() { if (document.title == "500 Server Error") { console.log("Autorefresh: 500 Server Error"); setTimeout(function() { reload(); }, 5000); } }, 10000); } // Insert email to bundle section { var countRetryEmail = 10; var tmRetryEmail = setInterval(function() { var eleEmail = document.querySelector(".account-email"); var eleInput = document.querySelector(".email-input"); if (eleEmail && eleInput) { var email = eleEmail.textContent.trim(); if (email != "") { eleInput.value = email; clearInterval(tmRetryEmail); } } if (countRetryEmail < 0) { clearInterval(tmRetryEmail); } countRetryEmail--; }, 3000); } // Add mark button if (url.indexOf("/store/product/") < 0) { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { var rgxId = /[0-9]{3,}/g; var rgxApp = /:\/\/((store\.steampowered\.com|steamcommunity\.com)\/app|www.indiegala.com\/store\/product\/[^\/]+)\/[0-9]+/i; var rgxSub = /:\/\/(store\.steampowered\.com|steamcommunity\.com)\/sub\/[0-9]+/i; var rgxInvalidApp = /:\/\/store\.steampowered\.com\/[0-9]+\//i; var eleApps = document.querySelectorAll("a[href*='store.steampowered.com/']"); for (var i = 0; i < eleApps.length; i++) { var attrHref = eleApps[i].getAttribute("href"); if (rgxInvalidApp.test(attrHref)) { eleApps[i].setAttribute("href", attrHref.replace("store.steampowered.com/", "store.steampowered.com/app/")); } } GM_xmlhttpRequest( { method: "GET", url: "https://store.steampowered.com/dynamicstore/userdata/?t=" + getUnixTimestamp(), onload: function(response) { var dataRes = JSON.parse(response.responseText); var countOwned = 0; if (typeof dataRes["rgOwnedApps"] !== "undefined" && typeof dataRes["rgOwnedPackages"] !== "undefined" && typeof dataRes["rgIgnoredApps"] !== "undefined") { var elePrds = document.querySelectorAll( ".bundle-item-link, .in .in .in .game-steam-url" + ", #this_your_gift .game-steam-url"); var eleApps = document.querySelectorAll( ".game-opened-switcher a[href*='store.steampowered.com/'].game-steam-url" + ", .game-opened-switcher a[href*='steamcommunity.com/'].game-steam-url" + ", .bundle-item-header a[href*='store.steampowered.com/'].game-steam-url" + ", .bundle-item-header a[href*='steamcommunity.com/'].game-steam-url" + ", .in .in .in .game-steam-url" + ", #this_your_gift .game-steam-url" + ", .game-cover-medium[href^='/store/product/']" + ", #game_list_div .game-data-cont a[href^='/store/product/']" + ", .search-page-store .game-data-cont a[href^='/store/product/']"); var eleTitle = document.querySelector("#title-p"); if (eleTitle && eleTitle.textContent.trim() === "Indiegala gift") { elePrds = document.querySelectorAll( "#steam-key-games .game-steam-url"); eleApps = document.querySelectorAll( "#steam-key-games .game-steam-url"); } for (var i = 0; i < eleApps.length; i++) { var attrHref = eleApps[i].href; var ids = attrHref.match(rgxId); if (ids != null) { var valId = parseInt(ids[ids.length - 1]); var eleLabel = null; if (eleApps[i].classList.contains("game-cover-medium")) { eleLabel = eleApps[i].parentElement; } else if (eleApps[i].parentElement.parentElement.classList.contains("game-data-cont")) { eleLabel = eleApps[i].parentElement.parentElement; } else if (elePrds[i].classList.contains("bundle-item-link")) { eleLabel = elePrds[i].parentElement.parentElement; } else { eleLabel = elePrds[i].parentElement; } if (rgxApp.test(attrHref)) { if (dataRes["rgOwnedApps"].indexOf(valId) > -1) { eleLabel.classList.add("bh_owned"); countOwned++; } else { console.log("App: not owned - http://store.steampowered.com/app/" + valId); } } else if (rgxSub.test(attrHref)) { if (dataRes["rgOwnedPackages"].indexOf(valId) > -1) { eleLabel.classList.add("bh_owned"); countOwned++; } else { console.log("Sub: not owned - http://store.steampowered.com/sub/" + valId); } } } } console.log("Apps: owned - " + countOwned); } } // End onload }); }); } // Change title { var countRetryTitle = 10; var tmRetryTitle = setInterval(function() { var elesPrice = document.querySelectorAll(".bundle-claim-phrase"); for (var i = elesPrice.length - 1; i > -1; i--) { var elePrice = elesPrice[i].querySelector("span"); if (elePrice) { var price = elePrice.textContent.trim(); if (price.indexOf("$") == 0) { document.title = price + " " + document.title; clearInterval(tmRetryTitle); break; } } } if (countRetryTitle < 0) { clearInterval(tmRetryTitle); } countRetryTitle--; }, 3000); } // Load library if (url.indexOf("/profile") > -1) { var clientScript = " \ function openBundleLibrary() \ { \ $.ajax({ \ type: 'GET', \ data: { user_id : '" + getQueryByName("user_id") + "' }, \ url: '/ajaxprofile_sale_tab', \ dataType: 'json', \ context: $( '#profile_bundle_section .accordion-toggle' ), \ \ beforeSend: function(){ \ console.log('Start: open bundle library' ); \ openBundleLibraryAjaxSemaphore = false; \ $('.spinner', $( '#profile_bundle_section .accordion-toggle' ) ).remove(); \ $( '#profile_bundle_section .accordion-toggle' ).append(\" <span class='spinner'><i class='fa fa-spinner fa-spin'></i></span>\"); \ }, \ success: function(data){ \ console.log('Success: open bundle library' ); \ $( '#collapseBundles .panel-body' ).html( data['html'] ); \ setTimeout(function() \ { \ $('#profile_bundle_section .accordion-toggle:not([aria-expanded=\"true\"])').click(); \ }, 500); \ }, \ error: function(){ \ console.log('Error: open bundle library' ); \ setTimeout(openBundleLibrary, 500); \ }, \ complete: function(){ \ openBundleLibraryAjaxSemaphore = false; \ $('.spinner', $( '#profile_bundle_section .accordion-toggle' ) ).remove(); \ }, \ }); \ } \ setTimeout(openBundleLibrary, 1000); \ "; var eleClientScript = document.createElement("script"); eleClientScript.innerHTML = clientScript; document.head.appendChild(eleClientScript); var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_OpenLib"; divButton.setAttribute("onclick", "openBundleLibrary()"); var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Open Library"; divButton.appendChild(eleA); document.body.appendChild(divButton); } if (url.indexOf("/successpay") > -1 || url.indexOf("/gi#####age?message=ok") > -1) { setTimeout(function() { window.location = "/profile"; /* var eleBtn = document.querySelector("#faang.fa-angle-down"); if (eleBtn) { eleBtn.click(); } */ }, 10000); } } else if (url.indexOf("orlygift.com") > -1) { if (window !== window.parent) return; // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { var apps = []; var eleApps = document.querySelectorAll("div[id^='game-detail-'] a.btn-primary[href^='http://store.steampowered.com/app/']"); console.log("Apps: " + eleApps.length); for (var i = 0; i < eleApps.length; i++) { var app = /[0-9]+/.exec(eleApps[i].getAttribute("href")); if (app != null) { apps.push(app[0]); } } apps = apps.filter(function(elem, index, self) { return index == self.indexOf(elem); }); var appAll = apps.join(","); GM_xmlhttpRequest( { method: "GET", headers: { "Cache-Control": "max-age=0" }, url: "https://store.steampowered.com/api/appuserdetails/?appids=" + appAll, onload: function(response) { var dataRes = JSON.parse(response.responseText); var countOwned = 0; var elePrds = document.querySelectorAll(".box-game"); var eleApps = document.querySelectorAll("div[id^='game-detail-']"); for (var i = 0; i < eleApps.length; i++) { var eleApp = eleApps[i].querySelector("a.btn-primary[href^='http://store.steampowered.com/app/']"); if (eleApp != null) { var app = /[0-9]+/.exec(eleApp.getAttribute("href")); if (app != null) { if (typeof dataRes[app] !== "undefined") { if (dataRes[app].success) { if (dataRes[app].data.is_owned) { var eleLabel = elePrds[i]; eleLabel.classList.add("bh_owned"); countOwned++; } else { console.log("App: not owned - " + app); } } else { console.log("App: not success - " + app); } } } } } console.log("Apps: owned - " + countOwned); } // End onload }); }); } } else if (url.indexOf("cubicbundle.com") > -1) { GM_addStyle( " .bh_owned { background-color: #91BA07 !important; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned(".price a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement.parentElement.parentElement.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("dailyindiegame.com") > -1) { GM_addStyle( " .bh_owned, .bh_owned a, .bh_owned a:not(:visited) .DIG2content { color: #202020 !important; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { if (document.querySelectorAll(".DIG-content a[href*='store.steampowered.com/']").length > 0) { markOwned(".DIG-content a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement .parentElement.parentElement .parentElement.parentElement; }, null, "bh_owned"); } else { markOwned(".DIG2content a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); markOwned(".DIG3_14_Gray a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement.parentElement; }, null, "bh_owned"); } }); } } else if (url.indexOf("bundlekings.com") > -1) { // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned(".content-wrap a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("otakumaker.com") > -1) { GM_addStyle( " .bh_owned { background-color: #91BA07 !important; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned(".gantry-width-spacer a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("otakubundle.com") > -1) { GM_addStyle( " .bh_owned { background-color: #91BA07 !important; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned("#hikashop_product_left_part > .g-grid > .g-block " + " > .g-block > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("gogobundle.com") > -1) { GM_addStyle( " .bh_owned { background-color: #91BA07 !important; border: 1px solid white; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned(".g-block > .g-block > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("superduperbundle.com") > -1) { // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned("#gameslist a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("gamebundle.com") > -1) { GM_addStyle( " .bh_owned { background-color: #A0CC41 !important; border-bottom: 45px solid rgba(233, 233, 233, 0.5); } " + " .bh_owned .activebundle_game_bundle_debut_title { background-color: #A0CC41 !important; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned(".activebundle_game_section_full a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("humblebundle.com") > -1) { GM_addStyle( " .game-box img { max-height: 180px !important; max-width: 130px !important; } " + " .image-grid { animation: none !important; } " ); var rgxBta = /Pay more than the average of (.[0-9\.]+).+/i; var rgxFix = /Pay (.[0-9\.]+) or more to also unlock!/i; var strPay = "Pay "; var price = ""; var elesPrice = document.querySelectorAll(".dd-header-headline"); for (var i = 0; i < elesPrice.length; i++) { var priceRaw = elesPrice[i].textContent.trim(); if (rgxBta.test(priceRaw)) { price = priceRaw.replace(rgxBta, "$1"); break; } else if (rgxFix.test(priceRaw)) { price = priceRaw.replace(rgxFix, "$1"); break; } } if (!price && elesPrice.length >= 3 && elesPrice.length <= 4) { var priceRaw = elesPrice[1].textContent.trim(); if (priceRaw.indexOf(strPay) > -1) { price = priceRaw.replace(strPay, "").replace("+", ""); } } if (price) { document.title = price + " " + document.title; } var eleSold = document.querySelector(".heading-bundles-sold .mini-digit-holder"); if (eleSold != null) { var sold = eleSold.getAttribute("data-initial-value") || ""; eleSold.parentElement.parentElement.setAttribute("title", sold); } var countRetrySold = 10; var tmRetrySold = setInterval(function() { var sold = ""; var elesSold = document.querySelectorAll(".hr-main-container .mini-digit-holder .top-cutter .heading-num"); for (var i = 0; i < elesSold.length; i++) { sold = sold + "" + elesSold[i].textContent.trim(); } if (sold !== "") { clearInterval(tmRetrySold); var eleCount = document.querySelector(".hr-tagline-bundles-sold"); if (eleCount) { eleCount.textContent += " (" + sold.replace(/^0+/, "") + ")"; } } if (countRetrySold < 0) { clearInterval(tmRetrySold); } countRetrySold--; }, 1000); if (url.indexOf("/downloads") > -1) { GM_addStyle( " #steam-tab .redeem-instructions, #steam-tab .recommend-this-game { display: none; } " + " #papers-content { margin-bottom: 300px; } " ); attachOnLoad(function() { setTimeout(function() { var elesClick = document.querySelectorAll(".keyfield-value"); if (elesClick.length === 1) { var eleFocus = document.querySelector(".expiration-messaging"); if (eleFocus) { eleFocus.parentElement.scrollIntoView(); window.scrollBy(0, -100); elesClick[0].click(); } } }, 2000); }); /*setTimeout(function() { var elesKey = document.querySelectorAll(".sr-redeemed-bubble"); for (var i = 0; i < elesKey.length; i++) { elesKey[i].addEventListener("click", function (e) { var ele = e.target; clickToSelect(ele); }); } }, 3000);*/ } else if (url.indexOf("/receipt") > -1) { setTimeout(function() { var eleClick = document.querySelector(".js-success-redirect a"); if (eleClick) { eleClick.click(); } }, 10000); } else if (url.indexOf("/emailhelper") > -1) { setTimeout(function() { var eleClicks = document.querySelectorAll("a[href*='/?key=']"); if (eleClicks.length > 0 && eleClicks.length < 3) { eleClicks[0].click(); } }, 3000); } else if (url.indexOf("/store/") > -1) { setTimeout(function() { var elePrice = document.querySelector(".current-price.free"); if (elePrice) { scrollToElement(elePrice, -500); } }, 3000); } } else if (url.indexOf("steamcompanion.com") > -1) { GM_addStyle( " .bh_owned.banner { margin-bottom: 5px !important; margin-top: 35px !important; " + " padding-bottom: 15px !important; padding-top: 15px !important; } " + " .bh_owned.giveaway-links { opacity: 0.75; } " ); markOwned("#hero a[href*='store.steampowered.com/']" , null, null, "bh_owned"); // Mark { var query = ".giveaway-links img[src^='https://steamcdn-a.akamaihd.net/steam/apps/']"; var getLabelCallback = function(ele) { return ele.parentElement.parentElement.parentElement; }; var apps = []; var eleApps = document.querySelectorAll(query); for (var i = 0; i < eleApps.length; i++) { var app = /[0-9]+/.exec(eleApps[i].getAttribute("src")); if (app != null) { apps.push(app[0]); } } apps = apps.filter(function(elem, index, self) { return index == self.indexOf(elem); }); console.log("Apps: " + apps.length); var appAll = apps.join(","); GM_xmlhttpRequest( { method: "GET", headers: { "Cache-Control": "max-age=0" }, url: "https://store.steampowered.com/api/appuserdetails/?appids=" + appAll, onload: function(response) { var dataRes = JSON.parse(response.responseText); var countOwned = 0; var eleApps = document.querySelectorAll(query); for (var i = 0; i < eleApps.length; i++) { var appUrl = eleApps[i].getAttribute("src"); if (appUrl.indexOf("https://steamcdn-a.akamaihd.net/steam/apps/") > -1) { var app = /[0-9]+/.exec(appUrl); if (app != null) { if (typeof dataRes[app] !== "undefined") { if (dataRes[app].success) { if (dataRes[app].data.is_owned) { var eleLabel = getLabelCallback(eleApps[i]); eleLabel.classList.add("bh_owned"); countOwned++; } else { //console.log("App: not owned - http://store.steampowered.com/app/" + app + "/"); } } else { //console.log("App: not success - https://steamdb.info/app/" + app + "/"); } } } } } console.log("Apps: owned - " + countOwned); } // End onload }); } } else if (url.indexOf("store.steampowered.com") > -1) { if (url.indexOf("/widget/") > -1) { GM_addStyle( " .bh_owned { background-color: transparent !important; } " + " .bh_owned a { color: #71A034 !important; }" ); markOwned(".main_text a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement; }, null, "bh_owned"); } else if (url.indexOf("/app/") > -1) { GM_addStyle( " .bh_owned { " + " background-color: #6D8C1A !important; " + " padding: 0px 2px 0px 2px; " + " } " ); markOwned(".glance_details p > a[href*='store.steampowered.com/']" + ", .game_area_dlc_bubble a[href*='store.steampowered.com/']" , null, null, "bh_owned"); } else if (url.indexOf("/notinterested/") > -1) { GM_addStyle( " .bh_owned { " + " background-color: #6D8C1A !important; " + " padding: 5px 100px 5px 5px !important; " + " margin-left: -5px; margin-right: 50px; " + " } " ); markOwned(".ignoredapps > a[href*='store.steampowered.com/']" , null, null, "bh_owned"); } else if (url.indexOf("/search/") > -1) { GM_addStyle( " .bh_owned { " + " background-color: #6D8C1A66 !important; " + " } " ); markOwned(".search_r###lt_row[href*='store.steampowered.com/']" , null, null, "bh_owned"); } } else if (url.indexOf("steamcommunity.com") > -1) { GM_addStyle( " .bh_owned { background-color: #71A034 !important; " + " padding: 0px 2px 0px 2px; } " + " .bh_owned.blotter_userstatus_game { padding: 0px; border-color: #71A034; } " ); if (url.indexOf("/home") > -1) { var querySteamHome = ".blotter_gamepurchase_details a[href*='store.steampowered.com/']:not(.bh_owned) " + ", .blotter_author_block a[href*='store.steampowered.com/']:not(.bh_owned) " + ", .blotter_author_block a[href*='steamcommunity.com/app/']:not(.bh_owned) " + ", .blotter_daily_rollup_line a[href*='steamcommunity.com/app/']:not(.bh_owned) "; markOwned(querySteamHome, function(ele, type) { if (type === 1) { if (ele.classList.contains("blotter_userstats_game")) { ele.parentElement.classList.add("bh_owned"); } else { ele.classList.add("bh_owned"); } } }); var targetObMark = document.getElementById("blotter_content"); if (targetObMark) { var tmObMark = -1; var obMark = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { clearTimeout(tmObMark); tmObMark = setTimeout(function(querySteamHome) { markOwned(querySteamHome, function(ele, type) { if (type === 1 && !ele.classList.contains("blotter_userstats_game")) { ele.classList.add("bh_owned"); } }); }, 100, querySteamHome); }); }); var configObMark = { childList: true }; obMark.observe(targetObMark, configObMark); } } else if (url.indexOf("/announcements") > -1) { markOwned(".announcement_body a[href*='store.steampowered.com/']" , null, null, "bh_owned"); } } else if (url.indexOf("forums.steampowered.com") > -1) { GM_addStyle( " .bh_owned { background-color: #71A034 !important; " + " padding: 0px 2px 0px 2px;" + " } " ); markOwned("div[id^='post_message'] a[href*='store.steampowered.com/']" , null, null, "bh_owned"); } else if (url.indexOf("whosgamingnow.net") > -1) { if (url.indexOf("/discussion") > -1) { GM_addStyle( " .bh_owned { " + " padding: 0px 2px 0px 2px;" + " } " ); markOwned(".MessageList a[href*='store.steampowered.com/']" , null, null, "bh_owned"); } else if (url.indexOf("/redeem") > -1) { GM_addStyle( " .bh_owned { " + " border: 1px solid #FFF;" + " } " + " .bh_owned .BoxArt { " + " border: 0px !important;" + " } " ); markOwned(".GameInfo a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement.parentElement; }); } else if (url.indexOf("/giveaway") > -1) { GM_addStyle( " .bh_owned { " + " border: 5px solid #7CA156;" + " } " ); markOwned("img[src*='://cdn.akamai.steamstatic.com/steam/']" , null, null, "bh_owned"); } } else if (url.indexOf("steamground.com") > -1 && url.indexOf("/wholesale") > -1) { GM_addStyle( " .bh_owned { background-color: #48B24B !important; } " + " .bh_owned .wholesale-card_title { color: #373d41 !important; } " + " .bh_steam { display: none; } " ); var elesTitle = document.querySelectorAll(".wholesale-card_title"); if (elesTitle.length > 0) { GM_xmlhttpRequest( { method: "GET", url: "https://www.steamgifts.com/discussion/iy081/steamground-wholesale-build-a-bundle", onload: function(response) { var data = response.responseText; var eleContainer = document.createElement("div"); eleContainer.innerHTML = data; var eleComment = eleContainer.querySelector(".comment__description"); if (eleComment) { var elesGame = eleComment.querySelectorAll("table td:nth-child(1) a[href*='store.steampowered.com/']"); if (elesGame.length > 0) { var arrTitle = []; for (var i = 0; i < elesTitle.length; i++) { arrTitle.push(elesTitle[i].textContent.trim()); } for (var i = 0; i < elesGame.length; i++) { var isMatch = false; var game = elesGame[i].textContent.trim().toLowerCase(); for (var j = 0; j < elesTitle.length; j++) { var title = elesTitle[j].textContent.trim().toLowerCase(); if (game === title || (title.indexOf("|") > -1 && game === title.replace("|", ":")) || (game === "ball of light" && title === "ball of light (journey)") || (game === "its your last chance in new school" && title === "it is yоur last chance in new schооl") || (game === "shake your money simulator 2016" && title === "shake your money simulator") || (game === "spakoyno: back to the ussr 2.0" && title === "spakoyno back to the ussr 2.0") || (game === "or" && title === "or!")) { isMatch = true; arrTitle = arrTitle.filter(function(value) { return value !== elesTitle[j].textContent.trim() }); } if (isMatch) { var eleA = document.createElement("a"); eleA.classList.add("bh_steam"); eleA.href = elesGame[i].href; elesTitle[j].parentElement.parentElement.appendChild(eleA); break; } } if (!isMatch) { console.log("Not match: " + elesGame[i].href + " " + elesGame[i].textContent); } } if (arrTitle.length > 0) { console.log("Not match: " + arrTitle.length); for (var i = 0; i < arrTitle.length; i++) { console.log("Not match: " + arrTitle[i]); } } markOwned(".wholesale-card > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement; }, null, "bh_owned"); } } } // End onload }); } } else if (url.indexOf("bunchkeys.com") > -1) { GM_addStyle( " .bh_owned { border: #B5D12E 3px solid !important; " + " margin-left: -3px; margin-top: -3px; } " ); // Add mark button { var divButton = document.createElement("div"); divButton.classList.add("bh_button"); divButton.id = "bh_markOwned"; var eleA = document.createElement("a"); eleA.setAttribute("onclick", "return false;"); eleA.textContent = "Mark Owned"; divButton.appendChild(eleA); document.body.appendChild(divButton); divButton.addEventListener("click", function() { markOwned("a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement; }, null, "bh_owned"); }); } } else if (url.indexOf("sgtools.info") > -1) { GM_addStyle( " .bh_owned { background-color: #71A034 !important; } " ); if (url.indexOf("/lastbundled") > -1) { markOwned("#content > div > table > tbody > tr > td > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); } else if (url.indexOf("/deals") > -1) { markOwned(".deal_game_image > img[src*='cdn.akamai.steamstatic.com/steam/']", function(ele) { return ele.parentElement; }, null, "bh_owned"); } else if (url.indexOf("/whitelisted") > -1) { markOwned(".cmGame > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement; }, null, "bh_owned"); } } else if (url.indexOf("steamkeys.ovh") > -1) { markOwned("td > a[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement; }, null, "bh_owned"); } else if (url.indexOf("steamdb.info") > -1) { if (window !== window.parent) { return; } GM_addStyle( " .bh_owned, tr.bh_owned td { background-color: #DDF7D3 !important; } " + " .bh_owned_transparent { background-color: #bcf0a880 !important; } " ); markOwned(" \ #apps .app \ , #dlc .app \ , .container > .table .app \ , .sales-section .app \ , .page-search .app \ ", null, function(ele) { return ele.getAttribute("data-appid"); }, "bh_owned"); markOwned(" \ #subs .package \ , .sales-section .package \ , .page-search .package \ ", null, function(ele) { return "/steam/subs/" + ele.getAttribute("data-subid"); }, "bh_owned"); markOwned(".table-products .app" , null, function(ele) { return ele.getAttribute("data-appid"); }, "bh_owned_transparent"); markOwned(".app-history .appid" , function(ele) { return ele.parentElement; }, function(ele) { return ele.textContent.trim(); }, "bh_owned"); } window.addEventListener("beforeunload", function(e) { clearTimeoutAll(); clearIntervalAll(); }); } attachOnReady(main); })(); // End