// ==UserScript==
// @name Barter.vg, Thumbnail
// @namespace http://tampermonkey.net/
// @version 0.5.6
// @description always show thumbnail of game
// @author You
// @match https://barter.vg/*
// @grant none
// @run-at document-end
// @nowrap
// ==/UserScript==
(function() {
var STORAGE_KEY = "BarterToSteamThumbnailMaps";
var inBundle = location.pathname.indexOf("/bundles/") == 0;
var inGiveways = location.pathname.indexOf("/giveways/") == 0;
var inBrowse = location.pathname.indexOf("/browse/") == 0;
var inWishlist = location.pathname.indexOf("/w/") > 0;
var inTradable = location.pathname.indexOf("/t/") > 0;
var inBlacklist = location.pathname.indexOf("/b/") > 0;
var inScrachpad = location.pathname.indexOf("/c/") > 0;
var inLibrary = location.pathname.indexOf("/l/") > 0;
var inOffer = location.pathname.indexOf("/o/") > 0;
var inInfo = location.pathname.indexOf("/i/") == 0;
var inTraded = location.pathname.indexOf("/d/") > 0;
var inFulfilled = location.pathname.indexOf("/f/") > 0;
var isMatching = location.pathname.indexOf("/m/") > 0;
var isEditing = location.pathname.indexOf("/e/") > 0;
var isTurnOffImage = false;
var isTurnOffElement = document.querySelector(".platform a[href*='?filter=']");
if (isTurnOffElement) {
isTurnOffImage = isTurnOffElement.href.split(",")[3].indexOf("1") == 0;
}
console.log({
w: inWishlist,
t: inTradable,
b: inBlacklist,
c: inScrachpad,
e: isEditing,
isTurnOffImage: isTurnOffImage
});
var lazyLoading = [];
var thumbnailsMap = {};
var map = localStorage[STORAGE_KEY];
if (map) {
thumbnailsMap = JSON.parse(map);
}
// find in parant elements
function closest(el, selector) {
if (!document.documentElement.contains(el)) return null;
do {
if (el.matches(selector)) return el;
el = el.parentElement || el.parentNode;
} while (el !== null && el.nodeType === 1);
return null;
}
function makeThumbUrl(sid) {
return "https://steamcdn-a.akamaihd.net/steam/apps/" + sid + "/capsule_184x69.jpg";
}
function makeHeaderUrl (sid) {
return "https://steamcdn-a.akamaihd.net/steam/subs/" + sid + "/header_586x192.jpg";
}
function tMatching(e, bid, isSub) {
var li = e.parentNode;
var sid = thumbnailsMap[bid];
if (sid) {
var background = "url(" + makeThumbUrl(sid) + ")";
if (isSub) {
background = "url(" + makeHeaderUrl(sid) + "), " + background;
}
var bg = document.createElement("div");
bg.setAttribute("isMutching", "");
bg.style.backgroundImage = "url(--var-noimage)";
li.insertBefore(bg, e.nextSibling);
lazyLoading.push({
element: bg,
backgroundImage: background + ", url(--var-noimage)",
rect: bg.getBoundingClientRect()
});
return;
}
var mm = document.querySelector("#mutualMatches");
if (!mm) return;
var m = mm.querySelectorAll(".listH a, .listW a");
for (var j = 0; j < m.length; j++) {
var a = m[j];
var bid = a.href.match(/\d+/g)[0];
if (thumbnailsMap[bid]) continue;
var sid = thumbnailsMap[bid];
var mbg = document.createElement("div");
mbg.setAttribute("isMutching", "");
mbg.style.backgroundImage = "url(--var-noimage)";
a.appendChild(mbg);
lazyLoading.push({
element: mbg,
backgroundImage: "url(" + makeThumbUrl(sid) + "), url(" + makeHeaderUrl(sid) + "), url(--var-noimage)",
rect: mbg.getBoundingClientRect()
});
}
}
function tElse(e, sid, isSub) {
if (e.href.indexOf("#") >= 0) return;
var tr = closest(e, "tr");
if (!tr) return;
var td = tr.querySelector("td");
if (!td) return;
if (inBundle) {
tr.setAttribute("inBundle", "");
td.setAttribute("inBundle", "");
} else {
tr.setAttribute("isTurnOff", "");
td.setAttribute("isTurnOff", "");
}
var background = "url(" + makeThumbUrl(sid) + ")";
if (isSub) {
background = "url(" + makeHeaderUrl(sid) + "), " + background;
}
if (isSub && tr.className.indexOf("included") >= 0) {
var e = tr.nextSibling;
if (e) {
var next = e.querySelector("[href*='/sub/']") || e.querySelector("[href*='/app/']");
if (next) {
background += ", url(" + makeThumbUrl(next.href.match(/\d+/)[0]) + ")";
}
}
}
td.style.backgroundImage = "var(--url-noimage)";
lazyLoading.push({
element: td,
backgroundImage: background + ", var(--url-noimage)",
rect: td.getBoundingClientRect()
});
var bid = tr.querySelector("a[href^='https://barter.vg/i/']").href.match(/\d+/g)[0];
thumbnailsMap[bid] = sid;
}
function tOffer(e, eid, isSub) {
// console.log(e);
if (e.href.indexOf("#") >= 0) return;
var tr = closest(e, "tr");
if (!tr) return;
var td = tr.querySelector("td");
if (!td) return;
var background = "url(" + makeThumbUrl(eid) + ")";
if (isSub) {
background = "url(" + makeHeaderUrl(eid) + "), " + background;
}
var bg = document.createElement("div");
bg.setAttribute("inOffer", "");
// bg.style.backgroundImage = "var(--url-noimage)";
td.appendChild(bg);
lazyLoading.push({
element: bg,
backgroundImage: background + ", var(--url-noimage)",
parent: closest(e, "div")
});
}
var scrollTimer = 0;
function onScroll(ev) {
if (scrollTimer > 0) return;
scrollTimer = setTimeout(function () {
var item, scrollTop, clientHeight, itemTop, preloadingMargin;
for (var i = 0; i < lazyLoading.length; i++) {
item = lazyLoading[i];
if (inOffer) {
if (ev.target != item.parent) continue;
scrollTop = ev.target.getBoundingClientRect().top;
clientHeight = ev.target.clientHeight;
itemTop = item.element.getBoundingClientRect().top;
preloadingMargin = 100;
} else {
scrollTop = 0;
clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
itemTop = item.element.getBoundingClientRect().top;
preloadingMargin = 500;
}
if (scrollTop - preloadingMargin < itemTop && itemTop < scrollTop + clientHeight + preloadingMargin) {
//if (itemTop < scrollTop + preloadingMargin) {
item.element.style.backgroundImage = item.backgroundImage;
// console.log(item.element.parentNode.innerText, scrollTop, clientHeight, itemTop);
lazyLoading.splice(i, 1);
i--;
}
}
scrollTimer = 0;
}, 50);
}
function main () {
if (inInfo) {
// save thumbnail map
var bid = location.pathname.split("/")[2];
var sid = document.querySelector(".platform a").href.split("/")[4];
thumbnailsMap[bid] = sid;
}
var items;
if (inBrowse) {
items = document.querySelectorAll(".collection tr [href^='https://steamcommunity.com/my/gamecards/']");
} else if (isMatching) {
items = document.querySelectorAll(".matchcol li a[href^='https://barter.vg/i/']");
} else {
items = document.querySelectorAll(".collection tr [href^='https://store.steampowered.com/app/'], .collection tr [href^='https://store.steampowered.com/sub/']");
}
// console.log("items", items);
for (var i = 0; i < items.length; i++) {
var e = items[i];
var eid = e.href.match(/\d+/g)[0];
var isSubs = e.href.indexOf("/sub/") >= 0;
if (inOffer) {
tOffer(e, eid, isSubs);
} else if (inTradable || inWishlist || inBlacklist || inScrachpad || inBundle || inLibrary) {
if (isMatching) {
tMatching(e, eid, isSubs);
} else {
tElse(e, eid, isSubs);
}
} else if (inBrowse) {
tElse(e, eid, isSubs);
} else if (inTraded || inFulfilled) {
tElse(e, eid, isSubs);
}
}
if (inOffer) {
document.querySelectorAll(".collection").forEach(function (el) {
closest(el, "div").addEventListener("scroll", onScroll);
});
} else {
window.addEventListener("scroll", onScroll);
}
// onScroll.call();
window.scrollTo(0, document.documentElement.scrollTop || document.body.scrollTop);
localStorage[STORAGE_KEY] = JSON.stringify(thumbnailsMap);
var style = document.createElement("style");
style.innerHTML = (function () {/*
:root { --url-noimage: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABFCAIAAAB2XbtXAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAACtUlEQVR4Xu3U0XHCMBCEYVqhFkqhEwqhD8qgFSrIhjs0x8mQDc5M/PB/T5IsS0K3eHcDDAQFFoICC0GBhaDAQlBgISiwEBRYCAosBAUWggILQYGFoMBCUGAhKLAQFFgICiwEBRaCAgtBgYWgwEJQYCEosBAUWAgKLAQFFoICC0GBhaDAssWgXC6X3a4fTIPH4zE7d+fzWdPC4XDIUVu++UxrxtPT6bTf76M9LA6KBseLMz3N1cv6Qb8oHxSLW/y7jQZFhVdVsn/XgqJ2vVBN1hVn55e01/V6zc6DFtS4Ns3+nUYkOw+aE5OzX+iRTlXDoWO3X9G22KyNBiWuvtZPg+OK1Z7/dnql1sDXNgparS0Yp5r31Ry9vhgUpWReuSaDoKwSJWm3r8FRNjUWP/WffVReBUVb1EcRiDkocUhNbkf6DtrzR3FGUFYZmaj3WIOias2llc/u/U1QJIqtCRGIFpSYE+2YMCwu2xCUVVomolEHX305orrZsb0JihpxgNYdajh0vLpOm7lIr+i3VC1t27H1oIwK/VdQtKm2HlWv5ddb40iiaXorO0uRiihIDvFFWalmQuLGa1U0MpdWPrv390HRI00YCajl12BW/qE+XVxW6hyCskoLSnRrUNRY/HKoVNn6jfdBkTqhlrm2Qy28VpBoVwTlz7SgiEpVB9Wei6SqtLdMPwalGvvOh5Q2qODOKxOUPzPXQNet+62DKmS9cXU/+5zIZ0F5VeN6Kq2gU9VpatdzEpRV5qCIRtpglCGo2DlqyzefjXC8D0oEN0YaHVLvZucul75r59TkfPAsH2/JFs+EDSIosBAUWAgKLAQFFoICC0GBhaDAQlBgISiwEBRYCAosBAUWggILQYGFoMBCUGAhKLAQFFgICiwEBRaCAgtBgYWgwEJQYCEosBAUWAgKDLfbFwWyh3Z/cFGwAAAAAElFTkSuQmCC); }
.mh a, .mw a { display: inline-block; position: relative; }
.matchcol li { position: relative; }
.matchcol .showMoreArea { margin-top: 2px; }
.collection tr { position: relative; }
.collection td { z-index: 2; }
[isMutching] { position: absolute; width: 190px; left: 150px; top: 0; bottom: 0; z-index: -10;
opacity: 0.5; background: left center no-repeat; background-size: cover; height: 2em; }
td[inBundle] { width: 184px; background-repeat: no-repeat !important; }
td[inBundle]+td { padding-left: 8px; }
td[isTurnOff] { background-position: 2px center !important; background-repeat: no-repeat !important; padding-left: 190px; background-size: 184px auto !important; }
div[inOffer] { position: absolute; width: 150px; right: 100px; top: 1px; bottom: 0; z-index: 1; pointer-events: none;
opacity: 0.5; background: left center no-repeat; background-size: cover !important; }
.collection th a:visited, .matchcol a:visited { color: #00f !important; }
#listEdit { z-index: 100; }"
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
document.querySelector("head").appendChild(style);
}
main();
// console.log("running thumbnail"); // Your code here...
})();