In SteamGifts, improve some features
// ==UserScript== // @name SteamGifts Helper // @namespace iFantz7E.SteamGiftsHelper // @version 1.71 // @description In SteamGifts, improve some features // @match *://www.steamgifts.com/* // @icon https://cdn.steamgifts.com/img/favicon.ico // @run-at document-start // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_getValue // @grant GM_setValue // @grant GM_listValues // @grant GM_deleteValue // @connect store.steampowered.com // @connect www.steamgifts.com // @connect www.sgtools.info // @connect steamdb.info // @license GPL-3.0-only // @copyright 2015, 7-elephant // @supportURL https://steamcommunity.com/id/7-elephant/ // @contributionURL https://www.paypal.me/iFantz7E // ==/UserScript== // License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html // Compatibility: Firefox 14+ from Mutation Observer // Since 16 Feb 2015 // https://greasyfork.org/scripts/8111-steamgifts-helper (function() { "use strict"; // jshint multistr:true function initStyle() { var imgB64SdbPartial = "data:image/svg+xml;base64,\ PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJN\ NjMuOSAwQzMwLjUgMCAzLjEgMTEuOSAwLjEgMjcuMWwzNS42IDYuN2MyLjktMC45IDYuMi0xLjMgOS42LTEuM2wxNi43LTEw\ Yy0wLjItMi41IDEuMy01LjEgNC43LTcuMiA0LjgtMy4xIDEyLjMtNC44IDE5LjktNC44IDUuMi0wLjEgMTAuNSAwLjcgMTUg\ Mi4yIDExLjIgMy44IDEzLjcgMTEuMSA1LjcgMTYuMy01LjEgMy4zLTEzLjMgNS0yMS40IDQuOGwtMjIgNy45Yy0wLjIgMS42\ LTEuMyAzLjEtMy40IDQuNS01LjkgMy44LTE3LjQgNC43LTI1LjYgMS45LTMuNi0xLjItNi0zLTctNC44TDIuNSAzOC40QzQu\ OCA0MiA4LjUgNDUuMyAxMy4zIDQ4LjIgNSA1MyAwIDU5IDAgNjUuNSAwIDcxLjkgNC44IDc3LjggMTIuOSA4Mi42IDQuOCA4\ Ny4zIDAgOTMuMiAwIDk5LjYgMCAxMTUuMyAyOC42IDEyOCA2NCAxMjggOTkuMyAxMjggMTI4IDExNS4zIDEyOCA5OS42IDEy\ OCA5My4yIDEyMy4yIDg3LjMgMTE1LjEgODIuNiAxMjMuMiA3Ny44IDEyOCA3MS45IDEyOCA2NS41IDEyOCA1OSAxMjMgNTIu\ OSAxMTQuNiA0OC4xIDEyMi45IDQzIDEyNy45IDM2LjcgMTI3LjkgMjkuOSAxMjcuOSAxMy40IDk5LjIgMCA2My45IDBabTIy\ LjggMTQuMmMtNS4yIDAuMS0xMC4yIDEuMi0xMy40IDMuMy01LjUgMy42LTMuOCA4LjUgMy44IDExLjEgNy42IDIuNiAxOC4x\ IDEuOCAyMy42LTEuOCA1LjUtMy42IDMuOC04LjUtMy44LTExLTMuMS0xLTYuNy0xLjUtMTAuMi0xLjV6bTAuMyAxLjdjNy40\ IDAgMTMuMyAyLjggMTMuMyA2LjIgMCAzLjQtNS45IDYuMi0xMy4zIDYuMi03LjQgMC0xMy4zLTIuOC0xMy4zLTYuMiAwLTMu\ NCA1LjktNi4yIDEzLjMtNi4yem0tNDEuNyAxOC41IDAgMGMtMS42IDAuMS0zLjEgMC4yLTQuNiAwLjRsOS4xIDEuN2ExMC44\ IDUgMCAxIDEtOC4xIDkuM2wtOC45LTEuN2MxIDAuOSAyLjQgMS43IDQuMyAyLjQgNi40IDIuMiAxNS40IDEuNSAyMC0xLjUg\ NC42LTMgMy4yLTcuMi0zLjItOS4zLTIuNi0wLjktNS43LTEuMy04LjYtMS4zem02My43IDE2LjYgMCA5LjNjMCAxMS0yMC4y\ IDE5LjktNDUgMTkuOS0yNC45IDAtNDUtOC45LTQ1LTE5LjlsMC05LjJjMTEuNSA1LjMgMjcuNCA4LjYgNDQuOSA4LjYgMTcu\ NiAwIDMzLjYtMy4zIDQ1LjItOC43em0wIDM0LjYgMCA4LjhjMCAxMS0yMC4yIDE5LjktNDUgMTkuOS0yNC45IDAtNDUtOC45\ LTQ1LTE5LjlsMC04LjhjMTEuNiA1LjEgMjcuNCA4LjIgNDUgOC4yIDE3LjYgMCAzMy41LTMuMSA0NS04LjJ6IiBmaWxsPSI"; GM_addStyle (" \ /* SGH Modify CSS */ \ header { position: fixed !important; top: 0px; left: 0px; right: 0px; z-index: 6001; } \ .global__image-outer-wrap--game-large img { width: 292px !important; height: 136px !important; } \ .global__image-outer-wrap--game-xlarge img { width: 500px; max-height: 215px; } \ .giveaway__row-outer-wrap { padding-left: 6px !important; padding-right: 6px !important; } \ .markdown .spoiler:not(:hover) a { color: #8693A7 !important; } \ .markdown .spoiler:not(:hover) { color: #8693A7 !important; } \ .page__outer-wrap { text-shadow: none !important; } \ .sidebar__navigation.bundles_section { width: 336px; max-width: 336px; } \ .sidebar__mpu { height: auto !important; } \ .comments a[href*='steamgifts.com/giveaway/'], .comments a[href^='/giveaway/'] \ , .page__description a[href*='steamgifts.com/giveaway/'], .page__description a[href^='/giveaway/'] { \ padding: 2px; background-color: #B2DBF2; } \ .comments a[href*='sgtools.info/giveaways/'], .page__description a[href*='sgtools.info/giveaways/'] { \ padding: 2px; background-color: #FFC1C1; } \ .comments a[href*='itstoohard.com/puzzle/'], .page__description a[href*='itstoohard.com/puzzle/'] \ , .comments a[href*='jigidi.com/'], .page__description a[href*='jigidi.com/'] { \ padding: 2px; background-color: #FBBD77; } \ .homepage_heading { border-radius: 4px; \ background-image: linear-gradient(#515763 0%, #2f3540 100%); \ background-image: -moz-linear-gradient(#515763 0%, #2f3540 100%); \ background-image: -webkit-linear-gradient(#515763 0%, #2f3540 100%); } \ *::-moz-selection { color: #E8EAEF; background-color: #5A7ED7; text-shadow: none; } \ *::selection { color: #E8EAEF; background-color: #5A7ED7; text-shadow: none; } \ .pagination + .widget-container { margin-top: 40px; } \ div[class^='sidebar__entry-'], div.sidebar__error { \ -webkit-touch-callout: none !important; \ -webkit-user-select: none !important; \ -khtml-user-select: none !important; \ -moz-user-select: none !important; \ -ms-user-select: none !important; \ user-select: none !important; } \ "); GM_addStyle (" \ /* SGH Main CSS */ \ .sgh_body { padding-top: 39px; } \ .sgh_hidden { display: none; } \ .sgh_page { border-top: 0px !important; padding-top: 8px !important; \ padding-bottom: 5px; } \ .sgh_page.sgh_page_border { \ box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.3) !important; \ border-bottom: 1px solid #D2D6E0; } \ .sgh_page:not(.sgh_page_border) { \ box-shadow: none !important; } \ .sgh_SGv2Dark .sgh_page.sgh_page_border { \ box-shadow: 0px 1px 0px #393936 !important; \ border-bottom: 1px solid #070707; } \ .sgh_rowShown.sgh_rowShown_inactive { display: none !important; } \ .sgh_rowHidden:not(.sgh_rowHidden_inactive):not(.sgh_rowOwned) { display: none !important; } \ .sgh_rowLast:not(.sgh_rowLast_inactive) { border-bottom: 0px !important; } \ /* .sgh_rowOwned:first-child, .sgh_rowNotInterested:first-child, .sgh_rowWished:first-child { */ \ /* border-top: 1px solid #D2D6E0; } */ \ .sgh_SGv2Dark .sgh_rowOwned:first-child, .sgh_SGv2Dark .sgh_rowNotInterested:first-child \ , .sgh_SGv2Dark .sgh_rowWished:first-child { \ border-top: 1px solid #050504; } \ .sgh_rowOwned, .sgh_rowNotInterested, .sgh_rowWished { \ border-left: 1px solid #D2D6E0 !important; \ border-right: 1px solid #D2D6E0 !important; \ padding-left: 5px !important; padding-right: 5px !important; \ transition: background 300ms ease-in 0s; } \ .sgh_SGv2Dark .sgh_rowOwned, .sgh_SGv2Dark .sgh_rowNotInterested, .sgh_SGv2Dark .sgh_rowWished { \ border-left: 0px !important; \ border-right: 0px !important; \ box-shadow: none !important; } \ .sgh_rowNotInterested { background-color: #F0E4E5; } \ .sgh_SGv2Dark .sgh_rowNotInterested { background-color: #70504F; } \ .sgh_rowWished { background-color: #D8E5F0; } \ .sgh_SGv2Dark .sgh_rowWished { background-color: #172A3B; } \ .sgh_rowOwned { background-color: #DFF0D8; } \ .sgh_SGv2Dark .sgh_rowOwned { background-color: #607D42; } \ /* .sgh_rowOwned:has(> .is-faded) { background-color: rgb(235, 241, 236) !important; } /* /* CSS4 */ \ .sgh_rowEnterNotInterested:not([style*='background-color:']) { \ background-color: #F0E8EA !important; \ transition: background 300ms ease-in 0s; } \ .sgh_SGv2Dark .sgh_rowEnterNotInterested:not([style*='background-color:']) { \ background-color: #571C1A !important; } \ .sgh_rowEnterWished:not([style*='background-color:']) { \ background-color: #D8E5F0 !important; \ transition: background 300ms ease-in 0s; } \ .sgh_SGv2Dark .sgh_rowEnterWished:not([style*='background-color:']) { \ background-color: #172A3B !important; } \ .sgh_rowEnterOwned:not([style*='background-color:']) { \ background-color: #DFF0D8 !important; \ transition: background 300ms ease-in 0s; } \ .sgh_SGv2Dark .sgh_rowEnterOwned:not([style*='background-color:']) { \ background-color: #607D42 !important; } \ .sgh_appNotInterested, .featured__outer-wrap .global__image-outer-wrap.sgh_appNotInterested { \ background-color: #F0D9D8 !important; \ transition: background 300ms ease-in 0s; } \ .sgh_appWished, .featured__outer-wrap .global__image-outer-wrap.sgh_appWished { \ background-color: #D8E5F0 !important; \ transition: background 300ms ease-in 0s; } \ .sgh_appOwned, .featured__outer-wrap .global__image-outer-wrap.sgh_appOwned { \ background-color: #9AC96B !important; \ transition: background 300ms ease-in 0s; } \ .sgh_linkNotInterested { background-color: #F9DBE3 !important; padding: 2px; \ transition: background 300ms ease-in 0s; } \ .sgh_linkWished { background-color: #C2E0F0 !important; padding: 2px; \ transition: background 300ms ease-in 0s; } \ .sgh_linkOwned { background-color: #D3E4C7 !important; padding: 2px; \ transition: background 300ms ease-in 0s; } \ .sgh_linkOwned.table_image_thumbnail { border: solid 3px #9AC96B; } \ .sgh_linkNotInterested.table_image_thumbnail { border: solid 3px #F9DBE3; } \ .sgh_linkWished.table_image_thumbnail { border: solid 3px #C2E0F0; } \ .sgh_noti { text-align: center; } \ .sgh_column_small { width: 90px; } \ .sgh_noTransition { transition: all 0s ease 0s !important; } \ .sgh_ga_shortcut_input { height: 100%; -moz-box-flex: 1; flex: 1 1 0%; \ line-height: 18px !important; padding: 0px !important; border: 0px none !important; } \ .sgh_ga_shortcut_link { display: none; } \ .sgh_gaOwned .fa, .sgh_gaOwned:visited .fa { \ vertical-align: text-bottom; color: #739650 !important; } \ .sgh_gaUnknown .fa, .sgh_gaUnknown:visited .fa { \ vertical-align: text-bottom; color: #968B50 !important; } \ .sgh_gaFiltered .fa, .sgh_gaFiltered:visited .fa { \ vertical-align: text-bottom; color: #888 !important; } \ .sgh_gaLvlRequired .fa, .sgh_gaLvlRequired:visited .fa { \ vertical-align: text-bottom; color: #B0255A !important; } \ .sgh_gaEnded .fa, .sgh_gaEnded:visited .fa { \ vertical-align: text-bottom; color: #6b7a8c !important; } \ .sgh_gaEntered .fa, .sgh_gaEntered:visited .fa { \ vertical-align: text-bottom; color: #4B72D4 !important; } \ .sgh_gaMissingBase .fa, .sgh_gaMissingBase:visited .fa { \ vertical-align: text-bottom; color: #4B72D4 !important; padding-left: 2px; } \ .sgh_gaNotFound .fa, .sgh_gaNotFound:visited .fa { \ vertical-align: text-bottom; color: #6b7a8c !important; } \ .markdown h1 .sgh_fa { font-size: 28px; } \ .markdown h2 .sgh_fa { font-size: 18px; } \ .markdown h3 .sgh_fa { font-size: 14px; } \ .sgh_pointer { cursor: pointer; } \ "); GM_addStyle (" \ /* SGH Icon CSS */ \ .sgh_icon_sdb { padding-left: 3px; margin-left: 2px; margin-top: 5px; } \ .sgh_icon_sdb_div { \ width: 14px; height: 14px; opacity: 0.35; display: inline-block; \ background-image: url(" + imgB64SdbPartial + "jNDY1NjcwIi8+PC9zdmc+); } \ .table__column__heading .sgh_icon_sdb_div { vertical-align: text-bottom; margin-bottom: 1px; } \ .sgh_SGv2Dark .sgh_icon_sdb_div { \ opacity: 0.55; \ background-image: url(" + imgB64SdbPartial + "jQTBBMEEwIi8+PC9zdmc+); } \ .sgh_icon_sdb_div.sidebar__navigation__item__count { \ opacity: 0.9; \ background-image: url(" + imgB64SdbPartial + "jNkI3QThDIi8+PC9zdmc+); } \ .sgh_SGv2Dark .sgh_icon_sdb_div.sidebar__navigation__item__count { \ opacity: 0.9; \ background-image: url(" + imgB64SdbPartial + "jN0M5MDlDIi8+PC9zdmc+); } \ .sgh_icon_sdb_sec { margin-top: 0px; vertical-align: text-top; display: inline-block; } \ "); GM_addStyle (" \ /* SGH SteamDB box */ \ .sgh_sdbBox { border: 1px solid #D2D6E0; max-width: 334px; max-height: 360px; \ margin-bottom: 35px; overflow: auto; } \ .sgh_sdbBox > .table { width: 410px; border: 0; border-collapse: separate; \ border-color: #ddd; \ font-size: 13px; background-color: #fff; border-spacing: 0; color: #333; } \ .sgh_sdbBox > .table tr:hover { \ background-color: #f5f5f5; } \ .sgh_sdbBox > .table th { vertical-align: bottom; text-transform: uppercase; \ color: #7f7f7f; border-bottom: 1px solid #ddd; background-color: #f5f5f5; \ font-weight: 700; font-size: 11px; } \ .sgh_sdbBox > .table tr:first-child th { \ border-top: 0; } \ .sgh_sdbBox > .table td, .sgh_sdbBox > .table th { \ padding: 8px; line-height: 20px; text-align: left; \ border-top: 1px solid #ddd; border-left: 1px solid #ddd; } \ .sgh_sdbBox > .table td:nth-child(1), .sgh_sdbBox > .table th:nth-child(1) { \ width: 46px !important; border-left: 0; } \ .sgh_sdbBox > .table td:nth-child(2), .sgh_sdbBox > .table th:nth-child(2) { \ width: 40px !important; } \ .sgh_sdbBox > .table td:nth-child(4), .sgh_sdbBox > .table th:nth-child(4) { \ width: 60px !important; } \ .sgh_sdbBox > .table td:nth-child(5), .sgh_sdbBox > .table th:nth-child(5) { \ display: none; } \ .sgh_sdbBox a { color: #0072c6; } \ .sgh_sdbBox .fa { font-size: 16px; } \ .sgh_sdbBox .owned { background-color: #DDF7D3 !important; } \ "); } 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 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) url = location.search; name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"); var r###lts = regex.exec(url); return (r###lts === null) ? "" : decodeURIComponent(r###lts[1].replace(/\+/g, " ")); } var isVisible = (function() { var stateKey; var eventKey; var keys = { hidden: "visibilitychange", webkitHidden: "webkitvisibilitychange", mozHidden: "mozvisibilitychange", msHidden: "msvisibilitychange" }; for (stateKey in keys) { if (stateKey in document) { eventKey = keys[stateKey]; break; } } return function(c) { if (c) { document.addEventListener(eventKey, c); } return !document[stateKey]; } })(); function addKey(eleListener, eleClick, keyCodes, keyName, keyTitleMode, keyModifierName, checkModifierCallback) { /* eleClick: element, query keyCodes: code, name, array keyTitleMode: 0: do nothing 1: append value 2: add title if not exist 4: override title 8: append textContent 16: append textContent of firstElementChild keyModifierName: Ctrl, Ctrl+Shift, Alt */ keyCodes = keyCodes || [0]; keyName = keyName || ""; keyTitleMode = keyTitleMode || 0; keyModifierName = keyModifierName || ""; if (typeof checkModifierCallback !== "function") { checkModifierCallback = function(ev) { return ev.ctrlKey && ev.shiftKey && ev.altKey; }; } if (typeof eleClick === "string") { keyTitleMode = 0; } if (!Array.isArray(keyCodes)) { keyCodes = [keyCodes]; } if (eleListener && eleClick) { // apply title var keyTitle = keyModifierName ? keyModifierName + "+" + keyName : ""; if (keyTitle !== "" && keyTitleMode !== 0) { if ((keyTitleMode & 1) === 1) { // 1: append value if (typeof eleClick.value !== "undefined") { eleClick.value += " (" + keyTitle + ")"; } } if ((keyTitleMode & 2) === 2) { // 2: add title if not exist if (!eleClick.title) { eleClick.title = keyTitle; } } if ((keyTitleMode & 4) === 4) { // 4: override title eleClick.title = keyTitle; } if ((keyTitleMode & 8) === 8) { // 8: append textContent eleClick.textContent += " (" + keyTitle + ")"; } if ((keyTitleMode & 16) === 16) { // 16: append textContent of firstElementChild if (eleClick.firstElementChild) { eleClick.firstElementChild.textContent += " (" + keyTitle + ")"; } } } eleListener.addEventListener("keydown", function (ev) { if (checkModifierCallback(ev)) { var isSameKey = false; for (var i = 0; i < keyCodes.length; i++) { var keyCode = keyCodes[i]; if (typeof keyCode === "number") { isSameKey = (ev.keyCode === keyCode); } else { // Firefox 32+ isSameKey = (typeof ev.code !== "undefined" && ev.code === keyCode) } if (isSameKey) { break; } } if (isSameKey) { ev.preventDefault(); var eleClickCur = null; if (typeof eleClick === "string") { eleClickCur = document.querySelector(eleClick); } else { eleClickCur = eleClick; } if (eleClickCur) { eleClickCur.focus(); eleClickCur.click(); } return false; } } }, true); } } function addKeyCtrl(eleListener, eleClick, keyCode, keyName, keyTitleMode) { addKey(eleListener, eleClick, keyCode, keyName, keyTitleMode, "Ctrl", function(ev) { return ev.ctrlKey && !ev.shiftKey && !ev.altKey; }); } 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 randNum(min, max) { return Math.round(Math.random() * (max - min) + min); } function normalizeArray(arr) { arr = arr.filter(function(elem, index, self) { return index === self.indexOf(elem); }); return arr; } function normalizeArray2D(arr) { arr = arr.filter(function(elem, index, self) { for (var i = 0; i < self.length; i++) { if (self[i][0] === elem[0]) { return index === i; } } return false; }); return arr; } function getGaId(url) { var rgxSite = /^https?:\/\/((www\.)?steamgifts\.com\/(giveaway|happy-holidays)|www\.sgtools\.info\/giveaways)\//i; if (rgxSite.test(url)) { return url.replace(rgxSite, "").split("/")[0]; } return ""; } 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 applyIcon(gaUrl, elesGa, className, icon, titleStatus, titleGame) { var gaIdCur = getGaId(gaUrl); for (var i = 0; i < elesGa.length; i++) { if (elesGa[i].dataset.sghGaId === gaIdCur) { if (className && !elesGa[i].classList.contains(className)) { elesGa[i].classList.add(className); if (icon || titleStatus) { var ele = document.createElement("i"); if (icon) { ele.setAttribute("class", "sgh_fa fa fa-fw " + icon); } if (titleGame) { if (elesGa[i].hasAttribute("title")) { if (titleStatus) { ele.setAttribute("title", titleGame + " - " + titleStatus); } else { ele.setAttribute("title", titleGame); } } } else if (titleStatus) { if (elesGa[i].hasAttribute("title")) { ele.setAttribute("title", titleStatus); } else { elesGa[i].setAttribute("title", titleStatus); } } elesGa[i].appendChild(ele); } } if (titleGame && !elesGa[i].hasAttribute("title")) { if (titleStatus) { elesGa[i].setAttribute("title", titleGame + " - " + titleStatus); } else { elesGa[i].setAttribute("title", titleGame); } } } } } function main() { var url = document.documentURI; var title = document.title; if (document.querySelector("header")) { GM_addStyle(" \ /* SGH Modify CSS */ \ header { position: fixed; top: 0px; left: 0px; right: 0px; z-index: 6001; } \ body { padding-top: 39px; } \ "); } var urlSteam = "https://store.steampowered.com/"; var urlSdb = "https://steamdb.info/"; var detectorContentTemplate = ' \n\ <a class="sidebar__navigation__item__link" %HREF%> \n\ <div class="sidebar__navigation__item__name">%NAME%</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">%COUNT%</div> \n\ </a> '; // Clean http { setTimeout(function() { var urlHttp = "http://www.steamgifts.com/"; var urlHttps = "https://www.steamgifts.com/"; var elesA = document.querySelectorAll("a[href^='http://www.steamgifts.com/']"); for (var i = 0; i < elesA.length; i++) { var url = elesA[i].getAttribute("href"); if (url.indexOf(urlHttp) === 0) { url = url.replace(urlHttp, urlHttps); elesA[i].setAttribute("href", url); } } }, 10); } // Add SteamDB links { var eleGas = document.querySelectorAll(".giveaway__icon[href*='://store.steampowered.com/'] \ , .table__column__secondary-link[href*='://store.steampowered.com/']"); for (var i = 0; i < eleGas.length; i++) { var isSteam = false; var urlNew = eleGas[i].getAttribute("href").replace(urlSteam, urlSdb); if (urlNew.indexOf("/sub/") > -1) { urlNew = urlNew + "apps/#apps"; isSteam = true; } else if (urlNew.indexOf("/app/") > -1) { urlNew = urlNew + "subs/"; isSteam = true; } if (isSteam) { var eleA = document.createElement("a"); eleA.classList.add("sgh_icon_sdb"); eleA.setAttribute("href", urlNew); eleA.setAttribute("target", "_blank"); eleA.innerHTML = '<div class="sgh_icon_sdb_div"></div>'; if (!eleGas[i].classList.contains("giveaway__icon")) { eleA.classList.add("sgh_icon_sdb_sec"); } insertAfterElement(eleA, eleGas[i]); } } } // Reset cache before marking if (url.indexOf("/account/settings/profile") > -1 || url.indexOf("/giveaways/won") > -1) { if (GM_getValue(name_config_general_mark_owned_game) === 1) { resetProfileCacheTimestamp(); } } // Reset cache when pressing F5 if (GM_getValue(name_config_general_mark_owned_game) === 1) { document.addEventListener("keydown", function (e) { if (e.keyCode === 116 || e.code === "F5") { resetProfileCacheTimestamp(); window.location.reload(); e.preventDefault(); return false; } }, true); } // Correct GA links { var rgxMarker = /[^a-z0-9]/ig; var elesGa = document.querySelectorAll("a[href*='steamgifts.com/giveaway/'], a[href^='/giveaway/']"); for (var i = 0; i < elesGa.length; i++) { var isEdited = false; var strsHref = elesGa[i].href.split("/"); if (strsHref.length >= 5) { if (rgxMarker.test(strsHref[4]) && strsHref[4].length > 5) { strsHref[4] = strsHref[4].replace(rgxMarker, ""); isEdited = true; } if (strsHref.length == 5) { strsHref.push(""); isEdited = true; } } if (isEdited) { elesGa[i].href = strsHref.join("/"); } } } // Hilight owned games and dlcs if (GM_getValue(name_config_general_mark_owned_game) === 1) { markOwned(":not(.table__column__heading) > .giveaway__icon[href*='store.steampowered.com/']", function(ele) { return ele.parentElement.parentElement.parentElement.parentElement; }, null, "sgh_rowOwned", "sgh_rowNotInterested", "sgh_rowWished"); } // Mark owned GA if (GM_getValue(name_config_general_mark_owned_giveaway) === 1) { var elesGa = document.querySelectorAll(" \ .comments a[href*='steamgifts.com/giveaway/'], .comments a[href^='/giveaway/'] \ , .page__description a[href*='steamgifts.com/giveaway/'], .page__description a[href^='/giveaway/'] \ , .comments a[href*='sgtools.info/giveaways/'], .page__description a[href*='sgtools.info/giveaways/'] \ , .giveaway_box_list a[href^='/happy-holidays/'] "); if (elesGa.length > 0) { var markGaFromJson = function(dataResSteam) { if (!dataResSteam) { //console.log("markGaFromJson: empty"); return; } 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 rgxId = /[0-9]+/; var rgxApp = /:\/\/store\.steampowered\.com\/app\/[0-9]+/i; var rgxSub = /:\/\/store\.steampowered\.com\/sub\/[0-9]+/i; var rgxEnded = /Ended [0-9]+ [a-z]+ ago/i; var elesGa = document.querySelectorAll(" \ .comments a[href*='steamgifts.com/giveaway/'] \ , .comments a[href^='/giveaway/'] \ , .page__description a[href*='steamgifts.com/giveaway/'] \ , .page__description a[href^='/giveaway/'] \ , .comments a[href*='sgtools.info/giveaways/'] \ , .page__description a[href*='sgtools.info/giveaways/'] \ , .giveaway_box_list a[href^='/happy-holidays/'] "); var gaCur = 0; var tmId = setInterval(function() { if (gaCur >= elesGa.length) { clearInterval(tmId); } else { var dataHref = elesGa[gaCur].href; if (dataHref) { var gaId = getGaId(dataHref); elesGa[gaCur].dataset.sghGaId = gaId; GM_xmlhttpRequest( { method: "GET", url: dataHref, onload: function(response) { var isOwned = false; var isFound = true; var isHidden = false; var isLvlRequired = false; var isRegionRestricted = false; var isEntered = false; var textStatus = "Exists in Account"; var textGame = ""; var parser = new DOMParser(); var dataRes = parser.parseFromString(response.responseText, "text/html"); if (response.finalUrl.indexOf("/happy-holidays/") > -1) { var eleStatus = dataRes.querySelector(".giveaway_box_notification"); if (eleStatus) { if (eleStatus.textContent.indexOf("since the game already exists in your account") > -1) { isOwned = true; } } if (isOwned) { var gaIdCur = getGaId(response.finalUrl); var className = "sgh_appOwned"; for (var i = 0; i < elesGa.length; i++) { if (elesGa[i].dataset.sghGaId === gaIdCur) { if (className && !elesGa[i].classList.contains(className)) { elesGa[i].classList.add(className); elesGa[i].title = "Owned"; } } } } } else if (response.finalUrl === "https://www.steamgifts.com/") { textStatus = "Not found" console.log("GA: not found - " + dataHref); applyIcon(dataHref, elesGa , "sgh_gaNotFound", "fa-search-minus", textStatus, textGame); } else { var eleGame = dataRes.querySelector(".featured__heading__medium"); if (eleGame) { textGame = eleGame.textContent.trim(); var elePoint = dataRes.querySelector(".featured__heading__small"); if (elePoint) { if (elePoint.nextElementSibling && elePoint.nextElementSibling.classList.contains("featured__heading__small")) { // Copies and Points elePoint = elePoint.nextElementSibling; } textGame += " " + elePoint.textContent.trim(); } } var eleExist = dataRes.querySelector(".sidebar__error"); if (eleExist) { textStatus = eleExist.textContent.trim(); if (textStatus === "Exists in Account") { isOwned = true; } else if (textStatus.indexOf("Level") > -1) { isLvlRequired = true; } else if (textStatus.indexOf("Region") > -1) { isRegionRestricted = true; } } if (!isOwned) { var eleA = dataRes.querySelector(".global__image-outer-wrap[href*='store.steampowered.com/']"); if (eleA) { var attrHref = eleA.href; var id = rgxId.exec(attrHref); if (id) { var valId = parseInt(id); if (rgxApp.test(attrHref)) { if (dataResSteam["rgOwnedApps"].indexOf(valId) > -1) { isOwned = true; } else { //console.log("App: not owned - https://store.steampowered.com/app/" + id + "/"); } } else if (rgxSub.test(attrHref)) { if (dataResSteam["rgOwnedPackages"].indexOf(valId) > -1) { isOwned = true; } else { //console.log("Sub: not owned - https://store.steampowered.com/sub/" + id + "/"); } } } } else { var eleName = dataRes.querySelector(".featured__heading__medium"); if (!eleName) { isFound = false; } } if (dataRes.querySelector(".featured__container") && !dataRes.querySelector(".featured__giveaway__hide")) { isHidden = true; } } if (isOwned) { textStatus = "Exists in Account"; applyIcon(response.finalUrl, elesGa , "sgh_gaOwned", "fa-briefcase", textStatus, textGame); } else if (isHidden) { if (dataRes.querySelector(".sidebar__entry-delete:not(.is-hidden)")) { // Entered applyIcon(response.finalUrl , elesGa, "sgh_gaEntered", "fa-check-circle", textStatus + " - Entered", textGame); } else { console.log("GA: filtered - " + response.finalUrl); applyIcon(response.finalUrl, elesGa , "sgh_gaFiltered", "fa-eye-slash", "Your filtered game", textGame); } } else if (isLvlRequired) { console.log("GA: lvl required - " + response.finalUrl); applyIcon(response.finalUrl, elesGa , "sgh_gaLvlRequired", "fa-level-up", textStatus, textGame); } else if (isRegionRestricted) { console.log("GA: region restricted - " + response.finalUrl); applyIcon(response.finalUrl, elesGa , "sgh_gaRegionRestricted", "fa-exclamation-circle", textStatus, textGame); } else if (isFound) { textStatus = ""; var eleRemain = dataRes.querySelector(".featured__column"); if (eleRemain) { textStatus = eleRemain.textContent.trim(); } if (rgxEnded.test(textStatus)) { // Ended applyIcon(response.finalUrl , elesGa, "sgh_gaEnded", "fa-calendar-times-o", textStatus, textGame); } else { console.log("GA: not owned - " + response.finalUrl); if (dataRes.querySelector(".sidebar__entry-delete:not(.is-hidden)")) { // Entered applyIcon(response.finalUrl , elesGa, "sgh_gaEntered", "fa-check-circle", textStatus + " - Entered", textGame); } else { var eleErr = dataRes.querySelector(".sidebar__error.is-disabled"); if (eleErr && eleErr.textContent.trim() === "Missing Base Game") { // DLC applyIcon(response.finalUrl , elesGa, "sgh_gaMissingBase", "fa-cubes", textStatus + " - Missing Base Game", textGame); } else { // Not owned applyIcon(response.finalUrl , elesGa, "sgh_gaNotOwned", "", textStatus, textGame); } } } } else { console.log("GA: unknown - " + response.finalUrl); textStatus = "Unknown information"; var iconStatus = "fa-question-circle"; var eleMsg = dataRes.querySelector(".table__row-outer-wrap:nth-child(2) .table__column--width-fill"); if (eleMsg) { var textRaw = eleMsg.textContent.trim(); if (textRaw.indexOf("creator's whitelist") > -1) { textStatus = "Whitelist only"; iconStatus = "fa-heart"; } else if (textRaw.indexOf("required Steam groups") > -1) { textStatus = "Steam groups only"; } else if (textRaw.indexOf("following region") > -1) { textStatus = textRaw.replace( "This giveaway is restricted to the following region", "Region restricted"); } else if (textRaw.indexOf("blacklisted the giveaway creator") > -1) { textStatus = "You have blacklisted GA creator"; } else if (textRaw.indexOf("blacklisted by the giveaway creator") > -1) { textStatus = "You have been blacklisted by GA creator"; iconStatus = "fa-ban"; } else if (textRaw.indexOf("Deleted ") === 0) { textStatus = textRaw; iconStatus = "fa-trash"; } else { textStatus = textRaw; } } else { var eleDes = dataRes.querySelector("body > div > .description"); if (eleDes) { var textRaw = eleDes.textContent.trim(); if (textRaw.indexOf("Page not found.") > -1) { textStatus = "Page not found"; } else { textStatus = textRaw; } } } applyIcon(response.finalUrl, elesGa , "sgh_gaUnknown", iconStatus, textStatus, textGame); } } } // End onload }); } } gaCur++ }, 200); } } // Force mark from cache { setTimeoutCustom(function() { // Delay after script ran var profileJson = GM_getValue(name_profile_json, 0); markGaFromJson(profileJson); }, 300); } if (isProfileCacheExpired()) { GM_xmlhttpRequest( { method: "GET", url: "https://store.steampowered.com/dynamicstore/userdata/?t=" + getUnixTimestamp(), onload: function(response) { console.log("markOwnedGa: userdata " + response.responseText.length + " bytes"); var dataRes = JSON.parse(response.responseText); setProfileCache(dataRes); markGaFromJson(dataRes); } // End onload }); } } } var eleMaintain = document.querySelector("body > div > .description"); if (eleMaintain) { var text = eleMaintain.textContent; if (/(maintenance|database)/i.test(text)) { console.log("autorefresh: maintenance in 3m"); setTimeoutCustom(function() { reload(); }, 180000); } } // Paging on top if (!/\/(giveaway|discussion|trade)\//i.test(url)) { var eleHead = document.querySelector(".page__heading"); var elePage = document.querySelector(".pagination:not(.sgh_page)"); if (eleHead && elePage) { var elePageNew = elePage.cloneNode(true); elePageNew.classList.add("sgh_page"); insertAfterElement(elePageNew, eleHead); } } if (url.indexOf("/giveaway/") > -1) { setTimeoutCustom(function() { var eleContainer = document.querySelector(".page__heading, body > div > .description"); if (!eleContainer) { if (window === window.parent) { console.log("autorefresh: no content"); reload(); } } }, 10000); var eleSearch = document.querySelector(".sidebar__search-container"); if (eleSearch) { var eleDttHead = document.createElement("h3"); eleDttHead.classList.add("sidebar__heading"); eleDttHead.classList.add("sgh_detector_header"); eleDttHead.textContent = " Detector "; eleDttHead.style.display = "none"; insertAfterElement(eleDttHead, eleSearch); var eleDttNav = document.createElement("ul"); eleDttNav.classList.add("sidebar__navigation"); eleDttNav.classList.add("sgh_detector_nav"); eleDttNav.style.display = "none"; insertAfterElement(eleDttNav, eleDttHead); var eleRttHead = document.createElement("h3"); eleRttHead.classList.add("sidebar__heading"); eleRttHead.classList.add("sgh_information_header"); eleRttHead.textContent = " Information "; eleRttHead.style.display = "none"; insertAfterElement(eleRttHead, eleDttNav); var eleRttNav = document.createElement("ul"); eleRttNav.classList.add("sidebar__navigation"); eleRttNav.classList.add("sgh_information_nav"); eleRttNav.style.display = "none"; insertAfterElement(eleRttNav, eleRttHead); } var warnOwned = function() { /*setTimeoutCustom(function() { var divDel = document.querySelector(".sidebar__entry-delete"); if (divDel) { if (!divDel.classList.contains("is-hidden") || !document.querySelector(".featured__giveaway__hide")) { if (GM_getValue(name_config_ga_autoenter) === 1) { // Auto remove entry when owned divDel.click(); } } } }, 3000);*/ var eleNav = document.querySelector(".sgh_detector_nav"); if (eleNav) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = ' \n\ <a class="sidebar__navigation__item__link" > \n\ <div class="sidebar__navigation__item__name">Warning</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Exists in Account</div> \n\ </a> '; ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } }; // Hilight owned if (GM_getValue(name_config_general_mark_owned_game) === 1) { if (!isVisible()) { var eleApp = document.querySelector(".global__image-outer-wrap[href*='store.steampowered.com/']"); if (eleApp) { eleApp.classList.add("sgh_noTransition"); } } markOwned(".global__image-outer-wrap[href*='store.steampowered.com/']", function(eleTarget, markType) { if (markType === 1) { warnOwned(); } return eleTarget; }, null, "sgh_appOwned", "sgh_appNotInterested", "sgh_appWished"); markOwned(".page__description a[href*='store.steampowered.com/'], \ .page__description a[href*='steamdb.info/'], \ .comments a[href*='store.steampowered.com/'], \ .comments a[href*='steamdb.info/']" , null, null, "sgh_linkOwned", "sgh_linkNotInterested", "sgh_linkWished"); } // Enter GA if (url.indexOf("/entries") < 0 && url.indexOf("#") < 0) { var isIdle = function() { var eleText = document.querySelector("textarea[name='description']"); return (!eleText || eleText.value === "") && !document.querySelector(".sgh_config.sgh_config_active"); }; if (document.querySelector(".featured__giveaway__hide")) { // Not in filtered var divIns = document.querySelector(".sidebar__entry-insert"); if (divIns) { divIns.addEventListener("click", function() { // After click "Enter Giveaway" setTimeoutCustom(function() { var divLoad = document.querySelector(".sidebar__entry-loading:not(.is-hidden)"); if (divLoad) { // Long loading console.log("autorefresh: long loading"); setTimeoutCustom(function() { if(isIdle()) { reload(); } }, 1000); } else { var divErr = document.querySelector(".sidebar__error.is-disabled"); if (divErr) { if (divErr.textContent.trim() === "Not Enough Points") { // "Not Enough Points" console.log("autorefresh: not enough points"); setTimeoutCustom(function() { if(isIdle()) { reload(); } }, 1000); } else { console.log("autorefresh: error entered"); setTimeoutCustom(function() { if(isIdle()) { reload(); } }, 1000); } } } }, 5000); }); /*if (!divIns.classList.contains("is-hidden")) { setTimeoutCustom(function() { if (!document.querySelector(".sgh_appOwned")) { var divIns = document.querySelector(".sidebar__entry-insert"); if (divIns) { if (!divIns.classList.contains("is-hidden")) { if (GM_getValue(name_config_ga_autoenter) === 1) { divIns.click(); } } } } }, 2000); }*/ } else { var divErr = document.querySelector(".sidebar__error.is-disabled"); if (divErr) { if (divErr.textContent.trim() === "Not Enough Points") { // "Not Enough Points" when page is loaded setTimeoutCustom(function() { if (!document.querySelector(".sgh_appOwned")) { // wait for checking owned console.log("autorefresh: not enough points in 55s"); setTimeoutCustom(function() { if(isIdle()) { reload(); } }, 55000); } }, 5000); divErr.classList.add("sgh_pointer"); divErr.setAttribute("title", "Refresh"); divErr.addEventListener("click", reload); } } } } } // Show points in title if (GM_getValue(name_config_ga_title) === 1) { // Show points if not owned // Add checked after entered // Add empty box if can enter var isOwned = false; var divErr = document.querySelector(".sidebar__error.is-disabled"); if (divErr) { if (divErr.textContent.trim() === "Exists in Account") { isOwned = true; } } else { var divEntry = document.querySelector(".sidebar__entry-insert, .sidebar__entry-delete"); if (!divEntry) { // Ended isOwned = true; } } if (!isOwned) { var point = ""; var elePoint = document.querySelector(".featured__heading__small"); if (elePoint) { if (elePoint.nextElementSibling && elePoint.nextElementSibling.classList.contains("featured__heading__small")) { // Copies and Points elePoint = elePoint.nextElementSibling; } var execPoint = /[0-9]+P/.exec(elePoint.textContent); if (execPoint) { point = execPoint[0] + " "; document.title = point + title; } } var addCheckedTitle = function() { var iconCheck = "☑️"; // ✔ ☑ ☑️ var iconBox = "☐"; // ⎕ ☐ var eleDel = document.querySelector(".sidebar__entry-delete"); if (eleDel) { if (!eleDel.classList.contains("is-hidden")) { // Entered document.title = iconCheck + point + title; } else { var eleIns = document.querySelector(".sidebar__entry-insert:not(.is-hidden)"); if (eleIns) { // Can enter document.title = iconBox + point + title; } else { var eleLoad = document.querySelector(".sidebar__entry-loading:not(.is-hidden)"); if (eleLoad) { // Loading document.title = iconBox + point + title; } else { // Can't enter document.title = point + title; } } } } else { var eleErr = document.querySelector(".sidebar__error.is-disabled"); if (eleErr) { // Not Enough Points document.title = point + title; } } }; addCheckedTitle(); var eleDel = document.querySelector(".sidebar__entry-delete"); if (eleDel) { var muTarget_form = eleDel.parentElement; if (muTarget_form.tagName === "FORM") { var muOb_form = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { //console.log(mutation.type + " " + mutation.target.getAttribute("class")); //if (mutation.type === "attributes" && mutation.target.tagName === "DIV") { addCheckedTitle(); } }); }); var muCf_form = { childList: true, subtree: true, attributes: true, attributeFilter: ["class"] }; muOb_form.observe(muTarget_form, muCf_form); } } } } // Add SteamDB link { var eleCover = document.querySelector(".global__image-outer-wrap[href*='://store.steampowered.com/']"); if (eleCover) { var urlNew = eleCover.getAttribute("href").replace(urlSteam, urlSdb); if (urlNew.indexOf("/sub/") > -1) { urlNew = urlNew + "apps/#apps"; } else { urlNew = urlNew + "subs/"; } var eleNav = null; var eleNavParent = null; var eleHeaders = document.querySelectorAll(".sidebar__heading"); for (var i = 0; i < eleHeaders.length; i++) { eleNavParent = eleHeaders[i].parentElement; if (eleHeaders[i].textContent.trim() === "Stores") { eleNav = eleHeaders[i].nextElementSibling; break; } } if (eleNavParent && !eleNav) { var eleH3 = document.createElement("h3"); eleH3.classList.add("sidebar__heading"); eleH3.textContent = "Stores"; eleNavParent.appendChild(eleH3); eleNav = document.createElement("ul"); eleNav.classList.add("sidebar__navigation"); eleNavParent.appendChild(eleNav); } if (eleNav && eleNav.classList.contains("sidebar__navigation")) { var eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.innerHTML = ' \n\ <a class="sidebar__navigation__item__link" href="' + urlNew + '" rel="nofollow" target="_blank"> \n\ <div class="sidebar__navigation__item__name">SteamDB</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count sgh_icon_sdb_div"></div> \n\ </a> '; eleNav.appendChild(eleNew); } // Add compatible with SG Add IsThereAnyDeal Data if (eleNav) { setTimeoutCustom(function(eleNav) { if (eleNav) { var eleIad = document.querySelector(".isthereanydeal_link"); if (eleIad) { insertAfterElement(eleIad.parentElement, eleNav.lastElementChild); } } }, 100, eleNav); } // Add SteamDB box if (GM_getValue(name_config_ga_sdb) === 1) { var eleSide = document.querySelector(".sidebar"); if (eleSide) { if (urlNew.indexOf("/sub/") > -1) { var eleDiv = document.createElement("div"); eleDiv.classList.add("sgh_sdbBox"); eleDiv.classList.add("sgh_hidden"); eleSide.appendChild(eleDiv); GM_xmlhttpRequest( { method: "GET", url: urlNew, onload: function(response) { var dataRes = (new DOMParser()).parseFromString(response.responseText, "text/html"); var eleTable = dataRes.querySelector("#apps > .table"); if (eleTable) { var eleTh = eleTable.querySelector("th:nth-child(2)"); if (eleTh) { eleTh.textContent = "Type"; } var elesA = eleTable.querySelectorAll("a"); for (var i = 0; i < elesA.length; i++) { var href = elesA[i].getAttribute("href"); if (href.indexOf("/app/") === 0) { elesA[i].setAttribute("href", urlSdb + href.substr(1)); } else { var index = href.indexOf("?utm_source="); if (index > -1) { elesA[i].setAttribute("href", href.substr(0, index)); } } elesA[i].setAttribute("target", "_blank"); } var elesSpan = eleTable.querySelectorAll("span.octicon-globe"); for (var i = 0; i < elesSpan.length; i++) { elesSpan[i].classList.add("fa"); elesSpan[i].classList.add("fa-globe"); } eleDiv.appendChild(eleTable); eleDiv.classList.remove("sgh_hidden"); } if (GM_getValue(name_config_general_mark_owned_game) === 1) { markOwned(".sgh_sdbBox .table .app", null, function(ele) { return ele.getAttribute("data-appid"); }, "owned", null, null, function(appCount, subCount, appOwned, subOwned) { if (appCount > 0) { var eleNav = document.querySelector(".sgh_information_nav"); if (eleNav) { var ele = document.querySelector(".sgh_information_nav_owned"); if (!ele) { ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); ele.classList.add("sgh_information_nav_owned"); } var content = detectorContentTemplate; content = content.replace("%NAME%", "App Owned"); content = content.replace("%COUNT%", appOwned + " / " + appCount); content = content.replace("%HREF%", ""); ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } if (appCount === appOwned) { var eleApp = document.querySelector( ".global__image-outer-wrap[href*='store.steampowered.com/']"); if (eleApp && !eleApp.classList.contains("sgh_appOwned")) { eleApp.classList.add("sgh_appOwned"); warnOwned(); } } } }); } } // End onload }); } } } } } // Open image { if (false) { setTimeoutCustom(function() { var eleImgs = document.querySelectorAll(".comment__toggle-attached"); for (var i = 0; i < eleImgs.length; i++) { eleImgs[i].click(); } }, 1000); } } // Train detector { var trainUrls = []; var eleDes = document.querySelector(".page__description"); if (eleDes) { var parentGaId = getGaId(url); var eleAs = eleDes.parentElement.querySelectorAll("a[href*='/giveaway/']"); for (var i = 0; i < eleAs.length; i++) { var href = eleAs[i].href; var gaId = getGaId(href); if (gaId !== parentGaId) { var arr = [gaId, href, eleAs[i].textContent.trim().toLowerCase(), eleAs[i]]; trainUrls.push(arr); } } var des = ""; if (trainUrls.length === 0) { var des = eleDes.textContent.trim().replace(/[^a-z0-9]/ig,""); } { var elesEm = eleDes.querySelectorAll("em"); if (elesEm.length === 5) { var des = ""; for (var i = 0; i < elesEm.length; i++) { des += elesEm[i].textContent.trim(); } } } if (des.length === 5 && !/(enjoy|flash)/i.test(des)) { var arr = [des, "https://www.steamgifts.com/giveaway/" + des + "/", "hidden", null]; trainUrls.push(arr); var eleNew = document.createElement("a"); eleNew.setAttribute("href", arr[0]); eleNew.setAttribute("title", "Auto Generated"); eleNew.textContent = " Hidden: " + des; var eleMark = eleDes.querySelector(".markdown > p"); if (eleMark) { eleMark.appendChild(document.createElement("br")); eleMark.appendChild(document.createElement("br")); eleMark.appendChild(eleNew); } } } trainUrls = normalizeArray2D(trainUrls); if (trainUrls.length > 0) { var rgxBack = /(back|prev|last|past|before|<|◄|⬱|←|⏮|⏪|«|⇦|⬅|↩|⇠|↤|⤶|🔽|◀️|👈)/i; var rgxNext = /(next|>|↪|⇢|↦|⤷|🔼|\+|▶️|👉)/i; var rgxNotNum = /[^0-9]/g; var trainUrl = ""; var eleNext = null; var elePrev = null; if (trainUrls.length === 1) { if (!rgxBack.test(trainUrls[0][2]) || rgxNext.test(trainUrls[0][2])) { trainUrl = trainUrls[0][1]; eleNext = trainUrls[0][3]; } } else if (trainUrls.length === 2) { if (rgxBack.test(trainUrls[1][2])) { trainUrl = trainUrls[0][1]; eleNext = trainUrls[0][3]; elePrev = trainUrls[1][3]; } else if (rgxBack.test(trainUrls[0][2])) { trainUrl = trainUrls[1][1]; eleNext = trainUrls[1][3]; elePrev = trainUrls[0][3]; } else { if (trainUrls[0][3] && trainUrls[0][3].previousSibling) { var text = trainUrls[0][3].previousSibling; if (text.nodeType === 3) { if (rgxBack.test(text.textContent)) { trainUrl = trainUrls[1][1]; eleNext = trainUrls[1][3]; elePrev = trainUrls[0][3]; } } } } if (!trainUrl) { if (rgxNext.test(trainUrls[1][2]) && !rgxNext.test(trainUrls[0][2])) { trainUrl = trainUrls[1][1]; eleNext = trainUrls[1][3]; elePrev = trainUrls[0][3]; } else if (rgxNext.test(trainUrls[0][2]) && !rgxNext.test(trainUrls[1][2])) { trainUrl = trainUrls[0][1]; eleNext = trainUrls[0][3]; elePrev = trainUrls[1][3]; } } if (!trainUrl) { var num1 = trainUrls[0][2].replace(rgxNotNum, ""); var num2 = trainUrls[1][2].replace(rgxNotNum, ""); if (num1 && num2) { if (num1 - num2 === 2) { trainUrl = trainUrls[0][1]; eleNext = trainUrls[0][3]; elePrev = trainUrls[1][3]; } else if (num1 - num2 === -2) { trainUrl = trainUrls[1][1]; eleNext = trainUrls[1][3]; elePrev = trainUrls[0][3]; } } } } var eleNav = document.querySelector(".sgh_detector_nav"); if (eleNav) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = ' \n\ <a class="sidebar__navigation__item__link" %HREF%> \n\ <div class="sidebar__navigation__item__name">Train</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">%COUNT%</div> \n\ </a> '; if (trainUrl !== "") { content = content.replace("%HREF%", 'href="' + trainUrl + '"'); } else { content = content.replace("%HREF%", ""); } if (trainUrls.length === 1 && trainUrl === "") { content = content.replace("%COUNT%", trainUrls.length + " End"); } else { content = content.replace("%COUNT%", trainUrls.length); } ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } if (trainUrl !== "") { console.log("Train: " + trainUrl); var isSelf = false; var eleUser = document.querySelector(".nav__avatar-outer-wrap"); if (eleUser) { var eleCreator = document.querySelector(".featured__columns .global__image-outer-wrap--avatar-small"); if (eleCreator) { if (eleUser.getAttribute("href") === eleCreator.getAttribute("href")) { isSelf = true; } } } if (!isSelf) { setTimeoutCustom(function(trainUrl) { var isRide = false; var eleOwned = document.querySelector(".sgh_appOwned"); if (eleOwned) { if (document.querySelector(".sidebar__error, .sidebar__entry-delete.is-hidden")) { // Skip owned isRide = true; } else { var eleTime = document.querySelector("div.featured__column:nth-child(1)"); if (eleTime && eleTime.textContent.indexOf("Begins in") > -1) { // Skip future isRide = true; } } } else { var divErr = document.querySelector(".sidebar__error.is-disabled"); if (divErr) { if (divErr.textContent.trim() === "Exists in Account") { // Skip exists isRide = true; } } } if (!isRide && document.querySelector(".featured__container") && !document.querySelector(".featured__giveaway__hide") && !document.querySelector(".sidebar__error[href^='/?login']")) { // Skip filtered isRide = true; } if (isRide) { if (GM_getValue(name_config_ga_train_rider) === 1 && !document.querySelector(".sgh_config.sgh_config_active")) { window.location = trainUrl; } } }, 3000, trainUrl); } if (eleNext) { eleNext.classList.add("sgh_train_next"); } if (elePrev) { elePrev.classList.add("sgh_train_prev"); } addKeyCtrl(document, eleNext, ["BracketRight", 221, 171]); // ] addKeyCtrl(document, elePrev, ["BracketLeft", 219]); // [ } } } // Warning detector { var eleDes = document.querySelector(".page__description"); if (eleDes) { var des = eleDes.textContent.trim(); if (/(warn| not | only |n't |dont |doesnt )/i.test(des)) { var eleNav = document.querySelector(".sgh_detector_nav"); if (eleNav) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = ' \n\ <a class="sidebar__navigation__item__link"> \n\ <div class="sidebar__navigation__item__name">Warning</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Read Description</div> \n\ </a> '; ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } } } } // Filtered detector { var eleDes = document.querySelector(".featured__giveaway__hide"); if (!eleDes && !document.querySelector(".sidebar__error[href^='/?login']")) { var eleNav = document.querySelector(".sgh_detector_nav"); if (eleNav) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = ' \n\ <a class="sidebar__navigation__item__link"> \n\ <div class="sidebar__navigation__item__name">Warning</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Filtered Game</div> \n\ </a> '; ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } } } // Information detector { var eleNav = document.querySelector(".sgh_information_nav"); if (eleNav) { var eleWhl = document.querySelector(".featured__column--whitelist"); if (eleWhl) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Restriction"); content = content.replace("%COUNT%", eleWhl.textContent.trim()); content = content.replace("%HREF%", ""); ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } var eleIvt = document.querySelector(".featured__column--invite-only"); if (eleIvt) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Restriction"); content = content.replace("%COUNT%", eleIvt.textContent.trim()); content = content.replace("%HREF%", ""); ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } var eleRgn = document.querySelector(".featured__column--region-restricted"); if (eleRgn) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Region"); content = content.replace("%COUNT%", "Restricted"); content = content.replace("%HREF%", eleRgn.href ? ('href="' + eleRgn.href + '"') : ""); ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } var eleGrp = document.querySelector(".featured__column--group"); if (eleGrp) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Group"); content = content.replace("%COUNT%", eleGrp.textContent.replace("Gifts for ", "").trim()); content = content.replace("%HREF%", 'href="' + eleGrp.getAttribute("href") + '"'); ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } var eleLvl = document.querySelector(".featured__column--contributor-level"); if (eleLvl) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Level"); content = content.replace("%COUNT%", eleLvl.textContent.replace("Level ", "").trim()); content = content.replace("%HREF%", ""); ele.innerHTML = content; eleNav.style.display = ""; eleNav.previousElementSibling.style.display = ""; eleNav.appendChild(ele); } } } // Show average { var rgxCopy = /[0-9,]+ Copies/; var eleHead = document.querySelector(".featured__heading__small"); if (eleHead) { var arrCopy = rgxCopy.exec(eleHead.textContent); if (arrCopy) { var copyStr = arrCopy[0].replace(" Copies", ""); var copy = parseInt(copyStr.replace(/,/g, "")) || 1; var eleEntry = document.querySelector(".live__entry-count"); if (eleEntry) { var entryStr = eleEntry.textContent; var entry = parseInt(entryStr.replace(/,/g, "")) || 0; var avg = (Math.round(entry / copy) || 1).toLocaleString("en-US"); var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Average Entries"); content = content.replace("%COUNT%", avg); content = content.replace("%HREF%", ""); ele.innerHTML = content; insertAfterElement(ele, eleEntry.parentElement.parentElement); } } } } // Bigger buttons { if (GM_getValue(name_config_ga_bigger) === 1) { GM_addStyle (" \ .sidebar__entry-insert, .sidebar__entry-delete, \ .sidebar__entry-loading, .sidebar__error { \ line-height: 64px; } \ "); } } } if (url === "https://www.steamgifts.com/" || url === "https://www.steamgifts.com" || url.indexOf("steamgifts.com/?") > -1 || url.indexOf("steamgifts.com?") > -1 || url.indexOf("/giveaways/search") > -1) { var isInactive = getQueryByName("q") !== "" || getQueryByName("sub") !== "" || getQueryByName("app") !== "" || GM_getValue(name_config_home_hide_entered) === 0; var eleLast = null; var eles = document.querySelectorAll(".giveaway__row-inner-wrap"); for (var i = 0; i < eles.length; i++) { if (eles[i].classList.contains("is-faded")) { eles[i].parentElement.classList.add("sgh_rowHidden"); if (isInactive) { eles[i].parentElement.classList.add("sgh_rowHidden_inactive"); } } else { eles[i].parentElement.classList.add("sgh_rowShown"); eleLast = eles[i]; } } if (eleLast) { eleLast.parentElement.classList.add("sgh_rowLast"); } // Toggle entered rows var eleSetting = document.querySelector(".page__heading a[href='/account/settings/giveaways']"); if (eleSetting) { var expandTitle = "Toggle Entered Rows: "; var eleExpand = document.createElement("a"); eleExpand.setAttribute("href", ""); eleExpand.setAttribute("onclick", "return false;"); eleExpand.setAttribute("data-mode", isInactive ? "hide" : "show"); eleExpand.innerHTML = '<i class="fa fa-expand"></i>'; eleExpand.title = expandTitle + (isInactive ? "Show" : "Hide"); insertBeforeElement(eleExpand, eleSetting); eleExpand.addEventListener("click", function(ev) { var ele = ev.target; if (ele.tagName === "I") { ele = ele.parentElement; } console.log(ele.dataset.mode); if (ele.dataset.mode === "hide") { ele.title = expandTitle + "Hide"; var elesRowShown = document.querySelectorAll( ":not(.pinned-giveaways__inner-wrap) > .sgh_rowShown.sgh_rowShown_inactive"); for (var i = 0; i < elesRowShown.length; i++) { elesRowShown[i].classList.remove("sgh_rowShown_inactive"); } var elesRowHidden = document.querySelectorAll( ":not(.pinned-giveaways__inner-wrap) > .sgh_rowHidden.sgh_rowHidden_inactive"); for (var i = 0; i < elesRowHidden.length; i++) { elesRowHidden[i].classList.remove("sgh_rowHidden_inactive"); } var eleRowLast = document.querySelector( ":not(.pinned-giveaways__inner-wrap) > .sgh_rowLast.sgh_rowLast_inactive"); if (eleRowLast) { eleRowLast.classList.remove("sgh_rowLast_inactive"); } ele.dataset.mode = "show"; } else if (ele.dataset.mode === "show") { ele.title = expandTitle + "Show"; var elesRowHidden = document.querySelectorAll( ":not(.pinned-giveaways__inner-wrap) > .sgh_rowHidden"); for (var i = 0; i < elesRowHidden.length; i++) { elesRowHidden[i].classList.add("sgh_rowHidden_inactive"); } var eleRowLast = document.querySelector( ":not(.pinned-giveaways__inner-wrap) > .sgh_rowLast"); if (eleRowLast) { eleRowLast.classList.add("sgh_rowLast_inactive"); } ele.dataset.mode = "invert"; } else // invert { ele.title = expandTitle + "Invert"; var elesRowShown = document.querySelectorAll( ":not(.pinned-giveaways__inner-wrap) > .sgh_rowShown"); for (var i = 0; i < elesRowShown.length; i++) { elesRowShown[i].classList.add("sgh_rowShown_inactive"); } ele.dataset.mode = "hide"; } /*var eleWidget = document.querySelector(".page__heading"); if (eleWidget) { eleWidget.scrollIntoView(); window.scrollBy(0, -50); }*/ }); } var elePageCopy = document.querySelector(".sgh_page"); if (elePageCopy) { elePageCopy.classList.add("sgh_page_border"); } var eleSearchNew = document.querySelector(".sidebar__navigation__item__link[href='/giveaways/search?type=new']"); if (eleSearchNew) { var eleNav = eleSearchNew.parentElement.parentElement; var eleNew; var eleHead; var eleUl; eleHead = document.createElement("h3"); eleHead.classList.add("sidebar__heading"); eleHead.textContent = "Filters"; insertAfterElement(eleHead, eleNav); eleUl = document.createElement("ul"); eleUl.classList.add("sidebar__navigation"); insertAfterElement(eleUl, eleHead); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_region_1"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?region_restricted=true"> \n\ <div class="sidebar__navigation__item__name">Region</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Restricted</div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_level_1"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?level_min=1"> \n\ <div class="sidebar__navigation__item__name">Level</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Min 1</div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_copy_2"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?copy_min=2"> \n\ <div class="sidebar__navigation__item__name">Copy</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Min 2</div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_point_0"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?point_max=0"> \n\ <div class="sidebar__navigation__item__name">Point</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Max 0</div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_entry_100"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?entry_max=100"> \n\ <div class="sidebar__navigation__item__name">Entry</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Max 100</div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_entry_500"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?entry_max=500"> \n\ <div class="sidebar__navigation__item__name">Entry</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Max 500</div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_entry_1000"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?entry_max=1000"> \n\ <div class="sidebar__navigation__item__name">Entry</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Max 1000</div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.classList.add("sgh_entry_min_1000"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/giveaways/search?entry_min=1000&copy_max=1"> \n\ <div class="sidebar__navigation__item__name">Entry</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ <div class="sidebar__navigation__item__count">Over 1000</div> \n\ </a>'; eleUl.appendChild(eleNew); eleHead = document.createElement("h3"); eleHead.classList.add("sidebar__heading"); eleHead.textContent = "Discussions"; insertAfterElement(eleHead, eleUl); eleUl = document.createElement("ul"); eleUl.classList.add("sidebar__navigation"); insertAfterElement(eleUl, eleHead); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/discussions/search?q=train&h=end" target="_blank"> \n\ <div class="sidebar__navigation__item__name">Trains</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ </a>'; eleUl.appendChild(eleNew); eleNew = document.createElement("li"); eleNew.classList.add("sidebar__navigation__item"); eleNew.innerHTML = '<a class="sidebar__navigation__item__link" href="/discussions/deals" target="_blank"> \n\ <div class="sidebar__navigation__item__name">Deals</div> \n\ <div class="sidebar__navigation__item__underline"></div> \n\ </a>'; eleUl.appendChild(eleNew); var qCopyMin = getQueryByName("copy_min"); var qEntryMax = getQueryByName("entry_max"); var qEntryMin = getQueryByName("entry_min"); var qRegion = getQueryByName("region_restricted"); var qLevelMin = getQueryByName("level_min"); var qPointMax = getQueryByName("point_max"); if (qCopyMin === "2" || qEntryMax === "100" || qEntryMax === "500" || qEntryMax === "1000" || qEntryMin === "1000"|| qRegion === "true" || qLevelMin === "1" || qPointMax === "0") { var eleSelected = document.querySelector(".sidebar__navigation__item.is-selected .fa-caret-right"); if (eleSelected) { eleSelected.parentElement.parentElement.classList.remove("is-selected"); eleSelected.parentElement.removeChild(eleSelected); var sEntry = ""; if (qCopyMin === "2") { sEntry = ".sgh_copy_2"; } else if (qRegion === "true") { sEntry = ".sgh_region_1"; } else if (qLevelMin === "1") { sEntry = ".sgh_level_1"; } else if (qPointMax === "0") { sEntry = ".sgh_point_0"; } else if (qEntryMin === "1000") { sEntry = ".sgh_entry_min_" + qEntryMin; } else { sEntry = ".sgh_entry_" + qEntryMax; } var eleEntry = document.querySelector(sEntry); if (eleEntry) { eleEntry.classList.add("is-selected"); var eleI = document.createElement("i"); eleI.classList.add("fa"); eleI.classList.add("fa-caret-right"); insertBeforeElement(eleI, eleEntry.firstElementChild.firstElementChild); } } } } // Move poll when voted { var elePoll = document.querySelector("div.homepage_heading"); if (elePoll && elePoll.textContent.trim() === "Community Poll" && elePoll.parentElement.querySelector(".poll--enable-r###lts")) { var eleParent = elePoll.parentElement.parentElement; insertAfterElement(eleParent, eleParent.nextElementSibling); } } } if (url.indexOf("/giveaways/search") > -1) { if (getQueryByName("page") !== "") { var eleWidget = document.querySelector(".page__heading"); if (eleWidget) { if (document.querySelectorAll(".giveaway__row-outer-wrap:not(.sgh_rowHidden)").length > 2) { setTimeoutCustom(function() { eleWidget.scrollIntoView(); window.scrollBy(0, -50); }, 300); } } } } if (url.indexOf("/user/") > -1) { var eleLevel = document.querySelector("div.featured__table__column:nth-child(2) \ > div:nth-child(4) > div:nth-child(2) > span:nth-child(1)"); if (eleLevel) { var tooltip = eleLevel.getAttribute("data-ui-tooltip"); var json = JSON.parse(tooltip); if (json && json.rows[0].columns[0].name === "Contributor Level") { document.title = title + " - " + json.rows[0].columns[1].name; } } } if (url.indexOf("/account/settings/giveaways/filters") > -1) { if (GM_getValue(name_config_general_mark_owned_game) === 1) { markOwned(".table__column__secondary-link[href*='store.steampowered.com/']", function(eleTarget) { return eleTarget.parentElement.parentElement .parentElement.parentElement; }, null, "sgh_rowEnterOwned", "sgh_rowEnterNotInterested", "sgh_rowEnterWished"); } } if (url.indexOf("/giveaways/created") > -1 || url.indexOf("/giveaways/entered") > -1 || url.indexOf("/giveaways/wishlist") > -1 || url.indexOf("/giveaways/won") > -1 || url.indexOf("/account/steam/games") > -1 || url.indexOf("/account/steam/wishlist") > -1 || url.indexOf("/bundle-games") > -1 ) { if (GM_getValue(name_config_general_mark_owned_game) === 1) { markOwned(".global__image-inner-wrap", function(eleTarget) { return eleTarget.parentElement.parentElement.parentElement.parentElement; }, function(eleTarget) { return eleTarget.style.backgroundImage; }, "sgh_rowEnterOwned", "sgh_rowEnterNotInterested", "sgh_rowEnterWished"); markOwned(".table_image_thumbnail", function(eleTarget) { return eleTarget.parentElement.parentElement.parentElement; }, function(eleTarget) { return eleTarget.style.backgroundImage; }, "sgh_rowEnterOwned", "sgh_rowEnterNotInterested", "sgh_rowEnterWished"); } if (url.indexOf("/giveaways/entered") > -1) { // Show average { var rgxCopy = /[0-9,]+ Copies/; var elesHead = document.querySelectorAll(".table__column__heading"); for (var i = 0; i < elesHead.length; i++) { var arrCopy = rgxCopy.exec(elesHead[i].textContent); if (arrCopy) { var copyStr = arrCopy[0].replace(" Copies", ""); var copy = parseInt(copyStr.replace(/,/g, "")) || 1; var eleEntry = elesHead[i].parentElement.parentElement.parentElement .lastElementChild.previousElementSibling.previousElementSibling; var entryStr = eleEntry.textContent; var entry = parseInt(entryStr.replace(/,/g, "")) || 0; eleEntry.innerHTML = entryStr + " <br/> Avg: " + (Math.round(entry / copy) || 1).toLocaleString("en-US"); } } } } else if (url.indexOf("/giveaways/won") > -1) { var elesIcon = document.querySelectorAll(".icon_to_clipboard"); for (var i = 0; i < elesIcon.length; i++) { elesIcon[i].addEventListener("click", function(ev) { GM_setClipboard(ev.target.getAttribute("data-clipboard-text")); }); } var eleHead = document.querySelector(".widget-container .page__heading__breadcrumbs"); if (eleHead) { var eleA = document.createElement("a"); eleA.setAttribute("href", "https://store.steampowered.com/account/registerkey"); eleA.innerHTML = '<i class="fa fa-key"></i>'; eleA.title = "Activate product key on Steam"; eleA.setAttribute("target", "_blank"); insertAfterElement(eleA, eleHead); } } } // Deprecated if (url.indexOf("/sales/") > -1) { if (GM_getValue(name_config_general_mark_owned_game) === 1) { markOwned(".global__image-inner-wrap", function(eleTarget) { return eleTarget.parentElement.parentElement .parentElement.parentElement; }, function(eleTarget) { return eleTarget.style.backgroundImage; }, "sgh_rowEnterOwned", "sgh_rowEnterNotInterested", "sgh_rowEnterWished"); } } if (url.indexOf("/discussion/") > -1 || url.indexOf("/trade/") > -1) { if (GM_getValue(name_config_general_mark_owned_game) === 1) { markOwned("a[href*='store.steampowered.com/'], a[href*='steamdb.info/']", function(eleTarget, markType) { var isRow = false; var eleLabel = eleTarget.parentElement.parentElement; if (eleLabel.tagName !== "TR") { eleLabel = eleLabel.parentElement; } if (eleLabel.tagName !== "TR") { eleLabel = eleLabel.parentElement; } if (eleLabel.tagName === "TR") { isRow = true; if (markType === 1) { eleLabel.classList.add("sgh_rowEnterOwned"); } else if (markType === 2) { eleLabel.classList.add("sgh_rowEnterNotInterested"); } else if (markType === 3) { eleLabel.classList.add("sgh_rowEnterWished"); } } if (!isRow) { if (markType === 1) { eleTarget.classList.add("sgh_linkOwned"); } else if (markType === 2) { eleTarget.classList.add("sgh_linkNotInterested"); } else if (markType === 3) { eleTarget.classList.add("sgh_linkWished"); } } }, null, "", "", ""); } var eleContent = document.querySelector(".comment__display-state"); if (eleContent) { // Show hidden GA { var hidden = ""; var elesHidden = eleContent.querySelectorAll("strong"); if (elesHidden.length === 5) { for (var i = 0; i < elesHidden.length; i++) { hidden += elesHidden[i].textContent.trim(); } } if (hidden.length === 5) { var eleNew = document.createElement("a"); eleNew.setAttribute("href", "https://www.steamgifts.com/giveaway/" + hidden + "/"); eleNew.setAttribute("title", "Auto Generated"); eleNew.textContent = " Hidden: " + hidden; var elePLast = eleContent.querySelector(".comment__description > p:last-child"); if (elePLast) { var elePNew = document.createElement("p"); elePNew.appendChild(eleNew); insertAfterElement(elePNew, elePLast) } } } // Detect GA { var elesA = eleContent.querySelectorAll("a"); for (var i = 0; i < elesA.length; i++) { if (elesA[i].getAttribute("href").length === 5) { elesA[i].setAttribute("href", "https://www.steamgifts.com/giveaway/" + elesA[i].getAttribute("href") + "/"); } } var elesGa = eleContent.querySelectorAll("a[href*='steamgifts.com/giveaway/'], a[href^='/giveaway/']"); var elesTl = eleContent.querySelectorAll("a[href*='sgtools.info/giveaways/']"); var elesPz = eleContent.querySelectorAll("a[href*='itstoohard.com/puzzle/'], a[href*='jigidi.com/']"); function countUrl(eles) { var urls = []; for (var i = 0; i < eles.length; i++) { urls.push(eles[i].getAttribute("href")); } urls = normalizeArray(urls); return urls.length; } var countGa = countUrl(elesGa); var countTl = countUrl(elesTl); var countPz = countUrl(elesPz); if (countPz + countTl + countGa > 0) { var eleSide = document.querySelector(".sidebar__search-container"); if (eleSide) { var eleH = document.createElement("h3"); eleH.classList.add("sidebar__heading"); eleH.classList.add("sgh_detector_header"); eleH.textContent = " Detector "; insertAfterElement(eleH, eleSide); var eleNav = document.createElement("ul"); eleNav.classList.add("sidebar__navigation"); eleNav.classList.add("sgh_detector_nav"); insertAfterElement(eleNav, eleH); if (countGa > 0) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Giveaway"); content = content.replace("%COUNT%", countGa); if (countGa === 1) { content = content.replace("%HREF%", 'href="' + elesGa[0].getAttribute("href") + '"'); } else { content = content.replace("%HREF%", ""); } ele.innerHTML = content; eleNav.appendChild(ele); } if (countTl > 0) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "SGTools"); content = content.replace("%COUNT%", countTl); if (countTl === 1) { content = content.replace("%HREF%", 'href="' + elesTl[0].getAttribute("href") + '"'); } else { content = content.replace("%HREF%", ""); } ele.innerHTML = content; eleNav.appendChild(ele); } if (countPz > 0) { var ele = document.createElement("li"); ele.classList.add("sidebar__navigation__item"); var content = detectorContentTemplate; content = content.replace("%NAME%", "Puzzle"); content = content.replace("%COUNT%", countPz); if (countPz === 1) { content = content.replace("%HREF%", 'href="' + elesPz[0].getAttribute("href") + '"'); } else { content = content.replace("%HREF%", ""); } ele.innerHTML = content; eleNav.appendChild(ele); } } } } } // Add GA shortcut if (url.indexOf("/discussion/") > -1) { var eleSide = document.querySelector(".sidebar"); if (eleSide) { var eleForm = document.createElement("form"); eleForm.classList.add("sgh_ga_shortcut_form"); eleForm.setAttribute("onsubmit", "return false;"); var eleDiv = document.createElement("div"); eleDiv.classList.add("sidebar__search-container"); eleForm.appendChild(eleDiv); var eleInput = document.createElement("input"); eleInput.classList.add("sgh_ga_shortcut_input"); eleInput.setAttribute("type", "text"); eleInput.setAttribute("placeholder", "Insert GA ID here..."); eleInput.setAttribute("value", ""); eleDiv.appendChild(eleInput); eleInput.addEventListener("keyup", function(e) { e.target.value = e.target.value.replace(/[^a-z0-9]/ig, ""); if (e.keyCode === 13) { var eleLink = document.querySelector(".sgh_ga_shortcut_link"); if (eleLink) { var val = e.target.value; if (val.length === 5) { eleA.setAttribute("href", "https://www.steamgifts.com/giveaway/" + val + "/"); eleA.click(); } } } }); var eleA = document.createElement("a"); eleA.classList.add("sgh_ga_shortcut_link"); eleA.setAttribute("target", "_blank"); eleA.setAttribute("href", ""); eleDiv.appendChild(eleA); var eleI = document.createElement("i"); eleI.classList.add("fa"); eleI.classList.add("fa-gift"); eleDiv.appendChild(eleI); eleSide.appendChild(eleForm); } } // Change GA code to url { var rgxGa = /(https:\/\/www\.steamgifts\.com\/giveaway\/|https?:\/\/www\.sgtools\.info\/giveaways\/)[^ )}]+/ig; var elesCode = document.querySelectorAll(".comment__description > pre > code, .comment__description > p > code"); for (var i = 0; i < elesCode.length; i++) { var resGa = elesCode[i].textContent.match(rgxGa); if (resGa) { var gaIdArr = []; var elesAGa = elesCode[i].parentElement.parentElement.querySelectorAll(" \ a[href*='steamgifts.com/giveaway/'] \ , a[href^='/giveaway/'] \ , a[href*='sgtools.info/giveaways/'] "); for (var j = 0; j < elesAGa.length; j++) { gaIdArr.push(getGaId(elesAGa[j].href)); } gaIdArr = normalizeArray(gaIdArr); var elePre = null; var countShow = 0; for (var j = 0; j < resGa.length; j++) { var urlGa = resGa[j]; var gaId = getGaId(urlGa); if (gaId.length > 0) { if (!elePre) { elePre = document.createElement("pre"); insertAfterElement(elePre, elesCode[i].parentElement); } var eleA = document.createElement("a"); eleA.setAttribute("href", urlGa); eleA.textContent = urlGa; elePre.appendChild(eleA); elePre.appendChild(document.createElement("br")); if (gaIdArr.indexOf(gaId) > -1) { eleA.classList.add("sgh_hidden"); eleA.nextElementSibling.classList.add("sgh_hidden"); } else { countShow++; } } } if (countShow < 1) { elePre.classList.add("sgh_hidden"); } } } } } if (url.indexOf("/discussions/search") > -1) { if (getQueryByName("h") === "end") { var rgxEnd = /[^a-z](ended|expired|finished|over)[^a-z]/i; var elesHead = document.querySelectorAll(".table__column__heading"); for (var i = 0; i < elesHead.length; i++) { if (rgxEnd.test(" " + elesHead[i].textContent + " ")) { elesHead[i].parentElement.parentElement.parentElement.parentElement.classList.add("sgh_rowHidden"); } } } } // Hide owned GA if (GM_getValue(name_config_general_mark_owned_giveaway) === 1) { if (url.indexOf("/giveaway/") > -1 || url.indexOf("/discussion/") > -1) { var eleHead = document.querySelector(".widget-container .page__heading__breadcrumbs"); var eleHide = document.createElement("a"); eleHide.setAttribute("href", ""); eleHide.setAttribute("onclick", "return false;"); eleHide.setAttribute("data-mode", "hide"); eleHide.innerHTML = '<i class="fa fa-expand"></i>'; eleHide.title = "Toggle Hide Owned GA"; insertAfterElement(eleHide, eleHead); eleHide.addEventListener("click", function(ev) { var ele = ev.target; if (ele.tagName === "I") { ele = ele.parentElement; } var eleStyle = document.querySelector("#sgh_style_hide_owned_ga"); if (!eleStyle) { eleStyle = document.createElement("style"); eleStyle.id = "sgh_style_hide_owned_ga"; eleStyle.setAttribute("type", "text/css"); document.head.appendChild(eleStyle); } if (ele.dataset.mode === "hide") { eleStyle.textContent = " .sgh_gaOwned { visibility: hidden; } "; ele.dataset.mode = "show"; } else { eleStyle.textContent = ""; ele.dataset.mode = "hide"; } }); } } var eleLogout = document.querySelector(".nav__row.js__logout"); if (eleLogout) { var eleRight = document.querySelector(".nav__right-container > .nav__button-container"); if (eleRight) { var eleEnt = document.createElement("div"); eleEnt.setAttribute("class", "nav__button-container nav__button-container--notification") eleEnt.innerHTML = '<a title="Giveaways Entered" class="nav__button" \n\ href="/giveaways/entered"><i class="fa fa-tag"></i></a>'; insertBeforeElement(eleEnt, eleRight); } } var divBtn = document.querySelectorAll(".nav__button-container--inactive"); for (var i = 0; i < divBtn.length; i++) { divBtn[i].classList.remove("nav__button-container--inactive"); } // Move Ads { var eleAdsSide = document.querySelector(".sidebar__mpu"); if (eleAdsSide) { eleAdsSide.parentElement.appendChild(eleAdsSide); } var elePat = document.querySelector("a[href*='://www.patreon.com/steamgifts']"); if (elePat) { elePat.parentElement.parentElement.appendChild(elePat.parentElement); } var eleHb = document.querySelector(".humble_block"); if (eleHb) { eleHb.parentElement.parentElement.appendChild(eleHb.parentElement); } var eleAdsBar = document.querySelector("div:not(.sidebar__mpu) > div[id^='div-gpt-ad-']"); if (eleAdsBar) { eleAdsBar.parentElement.parentElement.appendChild(eleAdsBar.parentElement); } } setTimeout(function() { if (window === window.parent) { document.body.classList.add("sgh_body"); if (document.querySelector(".SGv2-Dark-button:not(.light)")) { document.body.classList.add("sgh_SGv2Dark"); } } }, 100); window.addEventListener("beforeunload", function(e) { clearTimeoutAll(); clearIntervalAll(); }); } var name_config_sgh_welcome = "sgh_config_sgh_welcome"; var name_config_sgh_active = "sgh_config_sgh_active"; var name_config_general_mark_owned_game = "sgh_config_general_mark_owned_game"; var name_config_general_mark_owned_giveaway = "sgh_config_general_mark_owned_giveaway"; var name_config_home_hide_entered = "sgh_config_home_hide_entered"; //var name_config_ga_autoenter = "sgh_config_ga_autoenter"; var name_config_ga_title = "sgh_config_ga_title"; var name_config_ga_train_rider = "sgh_config_ga_train_rider"; var name_config_ga_bigger = "sgh_config_ga_bigger"; var name_config_ga_sdb = "sgh_config_ga_sdb"; var name_profile_json = "sgh_profile_json"; var name_profile_time = "sgh_profile_time"; function initAllConfig() { // Short-circuit evaluation GM_getValue(name_config_sgh_welcome, -1) === -1 && GM_setValue(name_config_sgh_welcome, 0); GM_getValue(name_config_sgh_active, -1) === -1 && GM_setValue(name_config_sgh_active, 1); GM_getValue(name_config_general_mark_owned_game, -1) === -1 && GM_setValue(name_config_general_mark_owned_game, 1); GM_getValue(name_config_general_mark_owned_giveaway, -1) === -1 && GM_setValue(name_config_general_mark_owned_giveaway, 1); GM_getValue(name_config_home_hide_entered, -1) === -1 && GM_setValue(name_config_home_hide_entered, 1); //GM_getValue(name_config_ga_autoenter, -1) === -1 && GM_setValue(name_config_ga_autoenter, 0); GM_getValue(name_config_ga_title, -1) === -1 && GM_setValue(name_config_ga_title, 1); GM_getValue(name_config_ga_train_rider, -1) === -1 && GM_setValue(name_config_ga_train_rider, 1); GM_getValue(name_config_ga_bigger, -1) === -1 && GM_setValue(name_config_ga_bigger, 0); GM_getValue(name_config_ga_sdb, -1) === -1 && GM_setValue(name_config_ga_sdb, 1); } function updateConfigAll() { updateConfigBool(name_config_sgh_active); updateConfigBool(name_config_general_mark_owned_game); updateConfigBool(name_config_general_mark_owned_giveaway); updateConfigBool(name_config_home_hide_entered); //updateConfigBool(name_config_ga_autoenter); updateConfigBool(name_config_ga_title); updateConfigBool(name_config_ga_train_rider); updateConfigBool(name_config_ga_bigger); updateConfigBool(name_config_ga_sdb); } function clearAllConfig() { var keep = []; var config = GM_listValues(); debug("clearAllConfig: " + config.length); for (var i = 0; i < config.length; i++) { if (keep.indexOf(config[i]) < 0) { GM_deleteValue(config[i]); } } } function getConfigQuery(name) { return ".sgh_config input[name='" + name + "']"; } function createConfigBool(number, heading, name, enabled, description) { enabled = (typeof enabled === "undefined") ? GM_getValue(name) : enabled; enabled = (enabled === 1 || enabled === true); description = (typeof description === "string") ? description : ""; var content = ' \n\ <div class="form__row"> \n\ <div class="form__heading"> \n\ <div class="form__heading__number">' + number + '.</div> \n\ <div class="form__heading__text">' + heading + '</div> \n\ </div> \n\ <div class="form__row__indent"> \n\ <div>' + description + '</div> \n\ <div> \n\ <input name="' + name + '" value="'+ (enabled ? 1 : 0) +'" type="hidden"> \n\ <div data-checkbox-value="1" class="form__checkbox \n\ ' + (enabled ? "is-selected" : "is-disabled") + '"> \n\ <i class="form__checkbox__default fa fa-circle-o"></i> \n\ <i class="form__checkbox__hover fa fa-circle"></i> \n\ <i class="form__checkbox__selected fa fa-check-circle"></i> Yes \n\ </div> \n\ <div data-checkbox-value="0" class="form__checkbox \n\ ' + (!enabled ? "is-selected" : "is-disabled") + '"> \n\ <i class="form__checkbox__default fa fa-circle-o"></i> \n\ <i class="form__checkbox__hover fa fa-circle"></i> \n\ <i class="form__checkbox__selected fa fa-check-circle"></i> No \n\ </div> \n\ </div> \n\ </div> \n\ </div> \n\ '; return content; } function updateConfigBool(name, enabled) { enabled = (typeof enabled === "undefined") ? GM_getValue(name) : enabled; enabled = (enabled === 1 || enabled === true); var eleInput = document.querySelector(getConfigQuery(name)); if (eleInput) { eleInput.value = (enabled ? 1 : 0); eleInput.nextElementSibling.classList.add(enabled ? "is-selected" : "is-disabled"); eleInput.nextElementSibling.classList.remove(!enabled ? "is-selected" : "is-disabled"); eleInput.nextElementSibling.nextElementSibling .classList.add(!enabled ? "is-selected" : "is-disabled"); eleInput.nextElementSibling.nextElementSibling .classList.remove(enabled ? "is-selected" : "is-disabled"); } } function mainConfig() { GM_addStyle (" \ /* SGH Config CSS */ \ .sgh_config { opacity: 0; visibility: hidden; position: fixed; z-index: 9997; \ transition: visibility 0.3s, opacity 0.3s; } \ .sgh_config.sgh_config_active { opacity: 1; visibility: visible; } \ .sgh_config_bg { display: block; background-color: #3C424D; position: fixed; \ top: 0px; bottom: 0px; left: 0px; right: 0px; opacity: 0.85; z-index: 9998; } \ .sgh_config_detail { display: block; opacity: 1; z-index: 9999; \ position: fixed; top: 20px; bottom: 20px; width: 600px; left: 50%; margin-left: -300px; \ padding: 20px 20px; background-color: #f0f2f5; border-radius: 4px; \ text-align: center; text-shadow: 1px 1px rgba(255,255,255,0.94); } \ .sgh_SGv2Dark .sgh_config_detail { background-color: #181816; text-shadow: none; } \ .sgh_config .popup__description { font-weight: 300; font-size: 12px; \ max-width: 400px; margin: 0 auto; overflow: auto; \ position: absolute; left: 0px; right: 0px; top: 86px; bottom: 50px; } \ .sgh_config .popup__actions { margin: 0 auto; \ position: absolute; left: 0px; right: 0px; bottom: 0px; height: 40px; } \ .sgh_config .label { cursor: pointer; } \ .sgh_config input[type='checkbox'] { width: auto; } \ .sgh_config .form__row__indent { text-align: left; } \ .sgh_config .form__checkbox { border-bottom: 1px dotted #d2d6e0; \ display: inline-block; min-width: 70px; margin-right: 10px; } \ .sgh_config .popup__actions > :not(first-child) { margin-left: 15px; } \ .sgh_config .popup__actions > * { margin-right: 0px; } \ .sgh_SGv2Dark .sgh_config .form__rows { margin-top: 0px; padding-top: 8px !important; } \ .sgh_SGv2Dark .sgh_config .form__rows > div { min-width: auto !important; } \ "); var eleOptionHeader = null; var eleLogout = document.querySelector(".nav__row.js__logout"); if (eleLogout) { eleOptionHeader = document.createElement("a"); eleOptionHeader.classList.add("nav__row"); eleOptionHeader.setAttribute("href", ""); eleOptionHeader.innerHTML = ' \n\ <i class="icon-grey fa fa-fw fa-cogs"></i> \n\ <div class="nav__row__summary"> \n\ <p class="nav__row__summary__name">SteamGifts Helper</p> \n\ <p class="nav__row__summary__description">Customize your options.</p> \n\ </div> '; insertAfterElement(eleOptionHeader, eleLogout); } else { var divRight = document.querySelector(".nav__right-container > .nav__button-container"); if (divRight) { eleOptionHeader = document.createElement("div"); eleOptionHeader.setAttribute("class", "nav__button-container nav__button-container--notification") eleOptionHeader.innerHTML = '<a title="SteamGifts Helper - Customize your options." class="nav__button" \n\ href=""><i class="fa fa-cogs"></i></a>'; insertBeforeElement(eleOptionHeader, divRight); } } if (eleOptionHeader) { eleOptionHeader.addEventListener("click", function(e) { e.preventDefault(); var eleOption = document.querySelector(".sgh_config"); if (eleOption) { updateConfigAll(); eleOption.classList.add("sgh_config_active"); } }); var eleOption = document.createElement("div"); eleOption.classList.add("sgh_config"); document.body.appendChild(eleOption); var eleOptionBg = document.createElement("div"); eleOptionBg.classList.add("sgh_config_bg"); eleOption.appendChild(eleOptionBg); eleOptionBg.addEventListener("click", function(e) { var eleOption = document.querySelector(".sgh_config"); if (eleOption) { eleOption.classList.remove("sgh_config_active"); } }); var eleOptionOption = document.createElement("div"); eleOptionOption.classList.add("sgh_config_detail"); eleOption.appendChild(eleOptionOption); var numOption = 0; eleOptionOption.innerHTML = ' \n\ <p class="popup__heading"> \n\ <span class="popup__heading__bold">Welcome to SteamGifts Helper</span> \n\ <br> \n\ Here you can customize your options. \n\ </p> \n\ <div class="popup__description"> \n\ <div class="form__rows"> \n\ <div class="page__heading"><div class="page__heading__breadcrumbs">General</div></div> <div> \n' + createConfigBool(++numOption, "Enable SteamGifts Helper?" , name_config_sgh_active, false) + createConfigBool(++numOption, "Mark owned Steam games?" , name_config_general_mark_owned_game, false) + createConfigBool(++numOption, "Mark owned giveways?" , name_config_general_mark_owned_giveaway, false) + ' </div> \n\ <div class="page__heading"><div class="page__heading__breadcrumbs">Home Pages</div></div> <div> \n' + ((numOption = 0) || " ") + createConfigBool(++numOption, "Hide entered giveaways?" , name_config_home_hide_entered, false) + ' </div> \n\ <div class="page__heading"><div class="page__heading__breadcrumbs">Giveaway Pages</div></div> <div> \n' + ((numOption = 0) || " ") /*+ createConfigBool(++numOption, "Enable auto enter giveaways?" , name_config_ga_autoenter, false)*/ + createConfigBool(++numOption, "Show points in giveaway titles?" , name_config_ga_title, false) + createConfigBool(++numOption, "Enable train rider?" , name_config_ga_train_rider, false, "Use Ctrl+] and Ctrl+[ to go next and previous wagons.") + createConfigBool(++numOption, "Enable bigger entry buttons?" , name_config_ga_bigger, false) + createConfigBool(++numOption, "Show SteamDB box for Steam subs?" , name_config_ga_sdb, false) + ' </div> \n\ </div> \n\ </div> \n\ <div class="popup__actions"> \n\ Please refresh pages after changed your options. \n\ <span class="b-refresh">Refresh</span> \n\ <span class="b-close">Close</span> \n\ </div> \n\ '; var eleOptionRefresh = document.querySelector(".sgh_config .b-refresh"); if (eleOptionRefresh) { eleOptionRefresh.addEventListener("click", function(e) { reload(); }); } var eleOptionClose = document.querySelector(".sgh_config .b-close"); if (eleOptionClose) { eleOptionClose.addEventListener("click", function(e) { var eleOption = document.querySelector(".sgh_config"); if (eleOption) { eleOption.classList.remove("sgh_config_active"); } }); } // Welcome { if (GM_getValue(name_config_sgh_welcome) !== 1) { GM_setValue(name_config_sgh_welcome, 1); updateConfigAll(); eleOption.classList.add("sgh_config_active"); } } // Config observer { var muTarget_config = document.querySelector(".sgh_config"); if (muTarget_config) { var muOb_config = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.type === "attributes" && mutation.target.tagName === "INPUT") { var eleInput = mutation.target; var nameInput = eleInput.getAttribute("name"); var enabled = (eleInput.value === "1") ? 1 : 0; if (GM_getValue(nameInput) !== enabled) { GM_setValue(nameInput, enabled); } } }); }); var muCf_config = { childList: true, subtree: true, attributes: true, attributeFilter: ["value"] }; muOb_config.observe(muTarget_config, muCf_config); } } } } //clearAllConfig(); if (GM_getValue(name_config_ga_sdb, -1) === -1) { initAllConfig(); // Force show config when new config added //GM_setValue(name_config_sgh_welcome, 0); } if (GM_getValue(name_config_sgh_active) === 1) { if (window !== window.parent) return; attachOnReady(initStyle); attachOnReady(main); } attachOnReady(mainConfig); })(); // End