// ==UserScript==
// @name steamgifts.com improved game filter
// @description Makes hiding giveaways for specific games much quicker and easier
// @namespace Barefoot Monkey
// @include https://www.steamgifts.com/
// @include https://www.steamgifts.com/giveaways/search?*
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js
// @version 2.1.2
// @grant GM_setValue
// @grant GM_getValue
// @noframes
// ==/UserScript==
var version = '2.1.2'
var OLD_VERSION_KEY = 'previous version'
$('<style>')
.text(
'.BarefootMonkey-popup-bg {'
+' background: #3C424D;'
+' position: fixed;'
+' top: 0;'
+' bottom: 0;'
+' left: 0;'
+' right: 0;'
+' opacity: 0.85;'
+' z-index: 9988;'
+' cursor: pointer;'
+'}'
+'.BarefootMonkey-popup ul {'
+' list-style: inside;'
+'}'
+'.BarefootMonkey-popup p {'
+' margin: 0.7em 0;'
+' text-align: justify;'
+'}'
+'.BarefootMonkey-popup h1 i {'
+' font-size: 0.5em;'
+' font-weight: bold;'
+'}'
+'.BarefootMonkey-popup a {'
+' color: #4B72D4;'
+' font-weight: bold;'
+'}'
+'.BarefootMonkey-popup em {'
+' font-style: italic;'
+'}'
+'.BarefootMonkey-popup h1 {'
+' font-size: 1.5em;'
+' margin: 0px 0px 0.5em;'
+' border-bottom: 1px solid #6B7A8C;'
+' padding-bottom: 0.5em;'
+'}'
+'.BarefootMonkey-popup key, .BarefootMonkey-popup b {'
+' font-weight: bold;'
+'}'
+'.BarefootMonkey-popup {'
+' background: #F0F2F5 none repeat scroll 0% 0%;'
+' z-index: 9999;'
+' position: fixed;'
+' left: calc(50vw - 18em);'
+' top: 20vh;'
+' border-radius: 4px;'
+' color: #6B7A8C;'
+' font: 300 17px "Open Sans",sans-serif;'
+' padding: 1em;'
+' width: 36em;'
+' max-height: calc(80vh - 3em);'
+' overflow: auto;'
+'}'
)
.appendTo(document.head)
function cmpVersion(a, b) {
var i, cmp, len, re = /(\.0)+[^\.]*$/;
a = (a + '').replace(re, '').split('.');
b = (b + '').replace(re, '').split('.');
len = Math.min(a.length, b.length);
for( i = 0; i < len; i++ ) {
cmp = parseInt(a[i], 10) - parseInt(b[i], 10);
if( cmp !== 0 ) {
return cmp;
}
}
return a.length - b.length;
}
function close_popup() {
GM_setValue(OLD_VERSION_KEY, version)
$('.BarefootMonkey-popup-bg, .BarefootMonkey-popup').fadeOut(500, function() { $(this).remove() })
}
function open_popup() {
var bg = $('<div class="BarefootMonkey-popup-bg">')
.hide()
.appendTo(document.body)
.click(close_popup)
var popup = $('<aside class="BarefootMonkey-popup">')
.hide()
.html('<h1>improved game filter <i>steamgifts.com userscript, version '+version+'</i></h1>'
+"<p>This script replaces steamgifts.com's default \"Hide Game\" interface with one that's a bit more practical.</p>"
+"<p>Click on the <i class=\"giveaway__icon giveaway__hide fa fa-eye-slash\"></i> icon next to the name of a game you want to hide and the game will be hidden without asking you for confirmation.</p>"
+"<p>Skipping the confirmation makes hiding games quicker, but increases the chance that you accidentally hide the wrong game. To solve that problem, <b>improved game filter</b> doesn't actually remove games from the page as soon as you hide them - it merely adds a visual indication that they're hidden. That way you can see what games you've just hidden and undo any accidents by clicking on the <i class=\"giveaway__icon giveaway__hide fa fa-eye-slash\"></i> icons again to undo hiding them.</p>"
+"<p>If you have any comments or questions about the <b>improved game filter</b> userscript then feel free to <a href=\"http://www.steamgifts.com/discussion/c1xhr/userscript-improved-game-filter\">join this discussion</a>.</p>"
+"<h1>recent changes</h1>"
+"<ul>"
+"<li>Fixed regression in previous update, which affected users running this script through Tampermonkey on Chrome.</li>"
+"<li>General site compatiblity update. You may have noticed the noticed the regular \"hide game\" popups appearing recently despite having improved game filter installed. Version 2.1 fixes this issue.</li>"
+"</ul>"
)
.appendTo(document.body)
$('.BarefootMonkey-popup-bg, .BarefootMonkey-popup').fadeIn(500)
}
var old_version = GM_getValue(OLD_VERSION_KEY)
if (old_version == null || cmpVersion(old_version, version) < 0) {
open_popup()
}
$('<style>')
.text(
'@keyframes rotate-right-60px {'
+' from {'
+' background-position: 0px 0;'
+' }'
+' to {'
+' background-position: 300px 0;'
+' }'
+'}'
+'@keyframes rotate-left-60px {'
+' from {'
+' background-position: 0px 0;'
+' }'
+' to {'
+' background-position: -300px 0;'
+' }'
+'}'
+'.giveaway__row-outer-wrap {'
+' transition: opacity 1s linear;'
+'}'
+'.BarefootMonkey-hidden {'
+' opacity: 0.6;'
+' background: repeating-linear-gradient(45deg, transparent 0px, transparent 10px, #ccc, 10px, #ccc 12px, transparent 12px), repeating-linear-gradient(-45deg, transparent 0px, transparent 10px, #ccc, 10px, #ccc 12px, transparent 12px);'
+'}'
+'.BarefootMonkey-hiding, .BarefootMonkey-unhiding {'
+' opacity: 0.6;'
+' animation-duration: 12s;'
+' animation-iteration-count: infinite;'
+' animation-timing-function: linear;'
+'}'
+'.BarefootMonkey-hiding {'
+' animation-name: rotate-right-60px;'
+' background: repeating-linear-gradient(45deg, transparent 0px, transparent 10px, #ccc, 10px, #ccc 12px);'
+'}'
+'.BarefootMonkey-unhiding {'
+' animation-name: rotate-left-60px;'
+' background: repeating-linear-gradient(-45deg, transparent 0px, transparent 10px, #ccc, 10px, #ccc 12px);'
+'}'
)
.appendTo(document.head)
function update_filter(id, token, action, url, prior_class, progress_class, complete_class) {
$('.giveaway__row-outer-wrap[data-game-id='+id+']')
.addClass(progress_class)
.removeClass('BarefootMonkey-error')
.removeClass(prior_class)
$.ajax({
url: url,
method: 'POST',
context: {id: id, progress_class: progress_class, complete_class: complete_class},
data: {
'xsrf_token':token,
'game_id':id,
'do': action
},
'error': function() {
$('.giveaway__icon.giveaway__hide[data-popup="popup--hide-games"][data-game-id='+this.id+']')
.closest('.giveaway__row-outer-wrap')
.removeClass(this.progress_class)
.addClass('BarefootMonkey-error')
},
'success': function() {
$('.giveaway__row-outer-wrap[data-game-id='+this.id+']')
.removeClass(this.progress_class)
.addClass(this.complete_class)
}
})
}
function callback(event) {
var closest = $(this).closest('.giveaway__row-outer-wrap[data-game-id]')
if (closest.length > 0) {
// get id and token
var id = closest.data('game-id')
var token = $('.popup--hide-games form input[name="xsrf_token"]').val()
// hide or unhide the game
if (id && token) {
if (closest.hasClass('BarefootMonkey-hidden')) {
update_filter(id, token, 'remove_filter', '/ajax.php', 'BarefootMonkey-hidden', 'BarefootMonkey-unhiding', null)
} else if (!closest.hasClass('BarefootMonkey-unhiding') && !closest.hasClass('BarefootMonkey-hiding')) {
update_filter(id, token, 'hide_giveaways_by_game_id', '/ajax.php', null, 'BarefootMonkey-hiding', 'BarefootMonkey-hidden')
}
}
}
event.stopPropagation()
}
setTimeout(function() {
// remove existing click handlers
unsafeWindow.$('.giveaway__icon.giveaway__hide').off('click')
// handle clicking on hide button
$('.giveaway__icon.giveaway__hide')
.removeClass('trigger-popup')
.click(callback)
// observe DOM tree mutations to improve compatibility with endless scrolling userscripts
var container = document.querySelector('.page__outer-wrap>.page__inner-wrap>.widget-container>.sidebar+div')
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var added = mutation.addedNodes
for (var i = 0; i < mutation.addedNodes.length; i += 1) {
var node = $(mutation.addedNodes[i])
node.find('.giveaway__icon.giveaway__hide')
.off()
.click(callback)
}
});
});
observer.observe(container, {childList:true});
}, 10)