Kongregate played

Caches recently played games.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name          Kongregate played
// @description   Caches recently played games.
// @include       http://www.kongregate.com/*
// @version 0.0.1.20160306133707
// @namespace https://greasyfork.org/users/32649
// ==/UserScript==

if(typeof GM_setValue  == "undefined") {

	function GM_setValue(name, value) {
		localStorage.setItem(name, value);
	}

	function GM_getValue(name, defaultValue) {
		var value = localStorage.getItem(name);
		if(value) return value;
		else return defaultValue;
	}

	function GM_deleteValue(name) {
		localStorage.removeItem(name);
	}

}

if(location.toString().split("?")[0].split("#")[0] == "http://www.kongregate.com/accounts/"+unsafeWindow.active_user.username())
setTimeout(show, 0);
if(/^http:\/\/www\.kongregate.com\/games\/[a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+$/.test(location.toString()))
setTimeout(save, 5000);

function show() {

	var games = GM_getValue("kongregateRecentlyPlayedList", "null");
	var preferences = JSON.parse(GM_getValue("kongregateRecentlyPlayedPreferences", "{\"maxGames\":18,\"minRating\":2.75,\"registerUnrated\":false,\"autoLoad\":true}"));
	if(games == "null") return;
	var gamesList = games.split("|");
	var currentGame, firstOfPage;
	var pages = Math.floor((gamesList.length-1)/6)+1, settings, clearButton;
	var pagesList = [], currentSelectedPage = -1, currentPagePlaceHolder;
	
	var globalGamesHolder = document.getElementById("secondary");
	var insertBeforePoint = document.getElementById("cards");
	var mainGamesHolder = document.createElement("div");
	var gamesHolder = document.createElement("div");
	var recentlyPlayedTitle = document.createElement("h2");
	var recentlyPlayedPages = document.createElement("h3");

	function addGameToProfileList(name, target, imageURL, first) {
		var container_L0 = document.createElement("dl");
		container_L0.setAttribute("class", "favgame"+(first?" first":""));
		var container_L1 = document.createElement("dt");
		container_L0.appendChild(container_L1);
		var imageLink = document.createElement("a");
		imageLink.setAttribute("href", "http://www.kongregate.com/games/"+target);
		container_L1.appendChild(imageLink);
		var image = document.createElement("img");
		image.setAttribute("src", "http://cdn"+imageURL.charAt(0)+".kongregate.com/game_icons/"+imageURL.substring(1));
		image.setAttribute("alt", "Play "+name);
		image.setAttribute("width", 93);
		image.setAttribute("height", 74);
		imageLink.appendChild(image);
		var container_link = document.createElement("dd");
		container_L0.appendChild(container_link);
		var textLink = document.createElement("a");
		textLink.innerHTML = name;
		textLink.setAttribute("href", "http://www.kongregate.com/games/"+target);
		container_link.appendChild(textLink);
		gamesHolder.appendChild(container_L0);
	}
	
	function loadPage(pageIndex) {

		while(gamesHolder.childNodes.length)
		gamesHolder.removeChild(gamesHolder.childNodes[0]);

		flagSelectedPage(pageIndex, (pageIndex+1).toString());

		firstOfPage = true;
		for(var i=pageIndex*6;i<pageIndex*6+6&&i<gamesList.length;i++) {
			currentGame = gamesList[gamesList.length-i-1].split(";");
			addGameToProfileList(currentGame[2], currentGame[0], currentGame[1], firstOfPage);
			firstOfPage = false;
		}
	}
	
	function flagSelectedPage(pageIndex, flagText) {
		if(currentSelectedPage != -1) {
			recentlyPlayedPages.insertBefore(pagesList[currentSelectedPage], currentPagePlaceHolder);
			recentlyPlayedPages.removeChild(currentPagePlaceHolder);
		}
		recentlyPlayedPages.insertBefore(currentPagePlaceHolder = document.createTextNode(flagText), pagesList[pageIndex]);
		recentlyPlayedPages.removeChild(pagesList[pageIndex]);	
		currentSelectedPage = pageIndex;
	}
	
	function addItem(name) {
		var open_text = document.createTextNode(" (");
		var link = document.createElement("a");
		var close_text = document.createTextNode(")");
		link.innerHTML = name;
		link.setAttribute("href", "javascript:void(0);");
		recentlyPlayedPages.appendChild(open_text);
		recentlyPlayedPages.appendChild(link);
		recentlyPlayedPages.appendChild(close_text);
		pagesList.push(link);
		return link;
	}

	function addPage(index) {
		var link = addItem((index+1).toString());
		link.addEventListener("click", function(event) {loadPage(index)}, false);
	}

	function loadSettings(event) {
		var GM_preferences = GM_getValue("kongregateRecentlyPlayedPreferences", "{\"maxGames\":18,\"minRating\":2.75,\"registerUnrated\":false,\"autoLoad\":true}");
		var settings_input = unsafeWindow.prompt("This is a JSON reflection of the changeable variables:", GM_preferences);
		if(settings_input == null) return;
		settings_input.replace(/ /g, "");
		if(/^\{"maxGames":[0-9]+,"minRating":(([1-3](\.[0-9]{1,2})?)|(4(\.[0-4][0-9]?|\.50?))),"registerUnrated":(true|false),"autoLoad":(true|false)\}$/.test(settings_input)) {
			GM_setValue("kongregateRecentlyPlayedPreferences", settings_input);
			alert("Settings have been overwritten.");
		} else {
			alert("Invalid syntax.");
		}
	}

	for(var i=0;i<pages;i++)
	addPage(i);

	settings = addItem("Settings");
	settings.addEventListener("click", loadSettings, false);

	clearButton = addItem("Clear");
	clearButton.addEventListener("click", function(event) {
		if(!window.confirm("Are you sure you want to clear your recently played games history?")) return;
		GM_deleteValue("kongregateRecentlyPlayedList");
		globalGamesHolder.removeChild(mainGamesHolder);
		if(window.confirm("Do you want to clear the settings too? Reset them to default?"))
		GM_deleteValue("kongregateRecentlyPlayedPreferences");
	}, false);

	recentlyPlayedTitle.innerHTML = "Recently played";
	mainGamesHolder.appendChild(recentlyPlayedTitle);
	mainGamesHolder.appendChild(recentlyPlayedPages);
	gamesHolder.setAttribute("class", "games wrapper");
	mainGamesHolder.appendChild(gamesHolder);
	globalGamesHolder.insertBefore(mainGamesHolder, insertBeforePoint);

	if(preferences.autoLoad) loadPage(0);
}

function save() {

	var url = location.toString();
	var urlPart = url.match(/^http:\/\/www\.kongregate\.com\/games\/([a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+)/)[1];

	var metas = document.getElementsByTagName("meta"), icon;
	for(var i=0;i<metas.length;i++)
	if(metas[i].getAttribute("property") == "og:image") {
		icon = metas[i].getAttribute("content");
		break;
	}
	var iconPart = icon.match(/^http:\/\/cdn([0-9])\.kongregate\.com\/game_icons\/([0-9]{4}\/[0-9]{4}\/.+?\.(png|jpg|gif))/);
	iconPart = iconPart[1] + iconPart[2];

	var gameTitle = document.getElementById("gamepage_header").innerHTML.match(/<\/span>\W*([^\n\r]*)/)[1];

	var rating = document.getElementById("game_ratings_size").innerHTML.toString().match(/[1-5]\.[0-9]{2}/) || "0.00";
	var preferences = JSON.parse(GM_getValue("kongregateRecentlyPlayedPreferences", "{\"maxGames\":18,\"minRating\":2.75,\"registerUnrated\":false,\"autoLoad\":true}"));
	if(parseFloat(rating) >= preferences.minRating || (rating == "0.00" && preferences.registerUnrated)) {
		var games = GM_getValue("kongregateRecentlyPlayedList", "null");
		var games_list = games.split("|");
		var results = urlPart+";"+iconPart+";"+gameTitle;
		for(i=0;i<games_list.length;i++)
		if(games_list[i].match(urlPart) || games_list[i] == "null") {
			games_list.splice(i,1);
			break;
		}
		games_list.push(results);
		if(games_list.length>preferences.maxGames)
		games_list.splice(0,games_list.length-preferences.maxGames);
		GM_setValue("kongregateRecentlyPlayedList", games_list.join("|"));
	}
}