Kongregate played

Caches recently played games.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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("|"));
	}
}