- // ==UserScript==
- // @name Steam Badge Viewer
- // @namespace http://tampermonkey.net/
- // @version 1.0.0
- // @description try to take over the world!
- // @icon http://www.steamcardexchange.net/include/design/img/favicon_blue.png
- // @author Bisumaruko
- // @match http://www.steamcardexchange.net/*
- // @grant GM_xmlhttpRequest
- // @grant GM_addStyle
- // ==/UserScript==
-
- /* global $, GM_xmlhttpRequest, confirm */
-
- (function($) {
- 'use strict';
-
- //load data
- var ignoredGames = JSON.parse(localStorage.getItem('SBV_ignored_games') || '[]');
- var cache = JSON.parse(localStorage.getItem('SBV_cache') || '{}');
- var urls = [];
- var apps = [];
-
- //construct functions
- const init = function() {
- $('#content-area')
- .text('')
- .html(`
- <div class="content-box">
- <div class="content-box-topbar-large">
- <span class="left"><h1 class="empty">BADGE</h1></span>
- </div>
- <a href="index.php?showcase-filter-ac" class="showcase-navigation-link">A - C</a>
- <a href="index.php?showcase-filter-df" class="showcase-navigation-link">D - F</a>
- <a href="index.php?showcase-filter-gi" class="showcase-navigation-link">G - I</a>
- <a href="index.php?showcase-filter-jl" class="showcase-navigation-link">J - L</a>
- <a href="index.php?showcase-filter-mo" class="showcase-navigation-link">M - O</a>
- <a href="index.php?showcase-filter-pr" class="showcase-navigation-link">P - R</a>
- <a href="index.php?showcase-filter-su" class="showcase-navigation-link">S - U</a>
- <a href="index.php?showcase-filter-vx" class="showcase-navigation-link">V - X</a>
- <a href="index.php?showcase-filter-yz" class="showcase-navigation-link">Y - Z</a>
- <a href="index.php?showcase-filter-09" class="showcase-navigation-link">0 - 9</a>
- <a href="index.php?showcase-filter-recadded" class="showcase-navigation-link recent">Recently<br>Added</a>
- <a href="index.php?showcase-filter-all" class="showcase-navigation-link">All</a>
- </div>
- `);
-
- $('.showcase-navigation-link').click(function(e) {
- e.preventDefault();
-
- message('Loading...');
-
- if (!e.target.href.includes('filter')) return;
-
- urls = [];
- apps = [];
-
- if (e.target.href.includes('filter-all')) {
- ['ac', 'df', 'gi', 'jl', 'mo', 'pr', 'su', 'vx', 'yz', '09'].forEach(filter => {
- urls.push('http://www.steamcardexchange.net/index.php?showcase-filter-' + filter);
- });
- } else urls.push(e.target.href);
-
- fetchFilter();
- });
- //append clear cache button
- $('<a/>', {
- 'text': 'Clear Cache',
- 'style': 'float: right; margin-right: 20px;'
- })
- .on('click', function() {
- if (confirm('Are you sure to delete cache data?')) {
- localStorage.removeItem('SBV_cache');
- cache = [];
- }
- })
- .appendTo('.content-box-topbar-large');
- //append clear ignored games button
- $('<a/>', {
- 'text': 'Clear Ignored Games',
- 'style': 'float: right; margin-right: 20px;'
- })
- .on('click', function() {
- if (confirm('Are you sure to delete ignored games?')) {
- localStorage.removeItem('SBV_ignored_games');
- ignoredGames = [];
- }
- })
- .appendTo('.content-box-topbar-large');
- };
- const fetchFilter = function() {
- let url = urls.shift();
-
- if (url) {
- GM_xmlhttpRequest({
- method: 'GET',
- url: url,
- onload: function(res) {
- if (res.status === 200) {
- $('<div/>', {
- 'html': res.responseText
- })
- .find('.showcase-game-item > a')
- .each(function() {
- apps.push({
- id: parseInt(this.href.split('-').pop()),
- title: $(this).find('img').attr('alt'),
- imgURL: $(this).find('img').attr('data-original'),
- url: this.href
- });
- });
- }
-
- fetchFilter();
- }
- });
- } else { //Finished fetching filters
- if (!apps.length) return message('Fetching failed, please try again later.');
-
- $('.SBV_message').remove();
- $('.showcase-game-item').remove();
- processGame();
- }
- };
- const processGame = function() {
- let app = apps.shift();
- if (!app) return;
-
- while (ignoredGames.includes(app.id)) {
- app = apps.shift();
- }
-
- let badges = cache[app.id];
- let interval = 0;
-
- if (Array.isArray(badges)) appendGame(app, badges);
- else {
- fetchGame(app, appendGame);
- interval = 1000;
- }
-
- setTimeout(processGame, interval);
- };
- const appendGame = function(app, badges) {
- let gameItem = $(`
- <div class="showcase-game-item">
- <div class="game-image-background"></div>
- <a title="Click to get game details" href="index.php?gamepage-appid-${app.id}">
- <img class="game-image lazy" src="${app.imgURL}">
- </a>
- <div class="game-title">
- <h2 class="empty">
- <a href="http://store.steampowered.com/app/${app.id}/">${app.title}</a>
- </h2>
- <a><span>☓</span></a>
- </div>
- <div class="game-info"></div>
- </div>
- `);
-
- if (badges !== null) {
- if (badges.length) {
- appendBadges(gameItem.find('.game-info'), app, badges);
- } else {
- gameItem.find('.game-info').text('This game does not have badges.');
- }
- } else {
- gameItem.find('.game-info').text('Fetching failed, click to reload');
- gameItem.click(function() {
- let info = $(this).find('.game-info');
-
- info.text('Reloading...');
- fetchGame(app, function(_app, _badges) {
- info.text('');
- appendBadges(info, _app, _badges);
- });
- });
- }
-
- gameItem.find('.game-title > a')
- .attr('title', 'Hide this game')
- .css({
- 'float': 'right',
- 'margin-right': '20px'
- })
- .click(function() {
- ignoredGames.push(app.id);
- localStorage.setItem('SBV_ignored_games', JSON.stringify(ignoredGames));
- gameItem.remove();
- });
-
- $('#content-area > .content-box').append(gameItem);
- };
- const fetchGame = function(app, callback) {
- GM_xmlhttpRequest({
- method: 'GET',
- url: app.url,
- onload: function(res) {
- let badges = null;
-
- if (res.status === 200) {
- badges = [];
- let temp = $(res.responseText);
-
- temp
- .find('#foilbadges .element-image')
- .each(function() {
- badges[0] = {
- name: $(this).attr('alt'),
- imgURL: $(this).attr('src').split('/').pop()
- };
- });
-
- temp
- .find('#badges .element-image')
- .each(function() {
- let level = parseInt($(this).next().next().text().trim().slice(6, 7));
- if (isNaN(level)) return true;
-
- badges[level] = {
- name: $(this).attr('alt'),
- imgURL: $(this).attr('src').split('/').pop()
- };
- });
-
- cache[app.id] = badges;
- localStorage.setItem('SBV_cache', JSON.stringify(cache));
- }
-
- callback(app, badges);
- }
- });
- };
- const appendBadges = function(target, app, badges) {
- let container = $('<div class="SBV_container"></div>');
-
- badges.forEach((badge, index) => {
- if (!badge) return;
-
- let text = index === 0 ? 'Foil' : 'Level ' + index;
- let link = 'http://steamcommunity.com/my/gamecards/' + app.id + '/' + (index === 0 ? '?border=1' : '');
-
- $('<div/>', {
- 'html': `
- <img title="${badge.name}" src="http://cdn.akamai.steamstatic.com/steamcommunity/public/images/items/${app.id}/${badge.imgURL}" >
- <a href="${link}">${text}</a>`
- })
- .appendTo(container);
- });
-
- target.append(container);
- };
- const message = function(msgText) {
- $('#content-area > .content-box').append(`
- <div class="showcase-game-item SBV_message">
- <span>${msgText}</span>
- </div>
- `);
- };
-
- //append style
- $('#navbar-menu').css({
- 'width': 'initial',
- 'right': '0px'
- });
- $('#logout').css({
- 'position': 'fixed',
- 'right': '8px'
- });
-
- GM_addStyle(`
- .SBV_container, .SBV_container > div {
- height: 70px;
- box-sizing: border-box;
- text-align: center;
- }
- .SBV_container > div {
- width: 111px;
- display: inline-block;
- }
- .SBV_container img {
- height: 54px;
- display: block;
- margin: auto;
- }
- `);
-
- //append button
- $('#navbar-menu').append('<div class="navbar-menu-item" id="SBV"><a class="item-link">BADGE</a></div>');
-
- //attach event
- $('#SBV').click(function() {
- $(document.body).css('background-image', 'none');
- init();
- });
-
- })(jQuery);