Developer Subscriber

Subscribe to developers by playlisting games

// ==UserScript==
// @name           Developer Subscriber
// @namespace      tag://kongregate
// @description    Subscribe to developers by playlisting games
// @author         UnknownGuardian
// @version        1.0.1
// @date           03.22.2013
// @include        http://www.kongregate.com*
// ==/UserScript==  

function main() {
	
	var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);
	console.log("wat");
	function init() {
		console.log("I love developers init");


		var url = dom.location.href;
		url = url.substr(url.indexOf(".com/") + ".com/".length);

		var directory;
		if(url.indexOf("/") != -1)
			directory = url.substring(0,url.indexOf("/"));
		else
			directory = url;

		directory = directory.split("?")[0];
		console.log("directory: " + directory);

		if(directory == "games")
		{
			//add buttons to subscribe
			addSubscribeButton();
		}
		else if(directory == "my_playlist" || directory == "play_laters")
		{
			//show all devs subscribed to
			showAllSubscriptions();
		}
		else if(directory == "accounts")
		{
			//show profile button
			addProfileSubscribeButton();
		}


		var lastCheck = getLastDateChecked();
		var today = new Date();
		if(lastCheck == "" || (today.getTime() - new Date(lastCheck).getTime())/(1000*60*60) > 12)
		{
			pullLastGamesFromDevelopers();
		}
	}

	function pullLastGamesFromDevelopers()
	{
		Cookie.set('DevSubscribeLastCheck', "" + new Date(), 100000000,'/');
		console.log("Pulling games from all devs");
		var list = getAllSubscribed();
		list.each(function(item){
			new Ajax.Request("http://www.kongregate.com/accounts/" + item, {
								  method:'get',
								  onComplete: function(transport){
								  	console.log("Pulled list from developer" + item);
								  	handleDevProfilePage(item, transport.responseText);
								  	//alert('Yay' + transport.responseText + 'asdasd');
								  	//return false;
								   }
								});
		});
	}

	function handleDevProfilePage(developer, text)
	{
		if(text.indexOf("pod_head_header") != 0 )
		{
			var start = text.indexOf("pod_game_header") + "pod_game_header".length + 18;
			var subtext = text.substr(start,250);
			var end = subtext.indexOf('" class="')
			var gameURL = subtext.substring(0,end);
			console.log("got game url at " + gameURL);
			text = text.substring(start + end + 50);

			if(gameURL == "")
				return;

			var lastGameRead = getLastGameSavedFromDev(developer);
			var gameName = gameURL.substring(gameURL.lastIndexOf("/"))+1;
			if(lastGameRead == "")
			{
				Cookie.set("sub_last_" + developer, gameName, 100000000,'/');
				console.log("we didn't have any last saved, so lets just store what exists")
				
			}
			else if(lastGameRead != gameName)
			{
				//set to last game pulled
				Cookie.set("s_l_" + developer, gameName, 100000000,'/');
				//POST to http://www.kongregate.com/play_laters
				new Ajax.Request(gameURL + "/metrics.json", {
								  method:'get',
								  onComplete: function(transport){
								  	addToPlayList(transport.responseText);

								  	//alert('Yay' + transport.responseText + 'asdasd');
								  	//return false;
								   }
								});
				
			}
		}
	}

	function addToPlayList(text)
	{
		var id = text.substring(text.indexOf("?game_id=") + "?game_id=".length);
		id = id.substring(0,id.indexOf('"')-1)
		new Ajax.Request("http://www.kongregate.com/play_laters", {
								  method:'post',
								   parameters: {
								   	"game_id":id
								   },
								  onComplete: function(transport){
								  	console.log("Success adding " + id + " to play list");
								   }
								});
	}

	function showAllSubscriptions()
	{
		console.log("showing all subscriptions");
		var table = '<div class="category_listing"><div class="category_listing_header"><div class="sort_filter mrm"><span class="plm">Subscriptions</span></div><div class="clear"></div></div><div class="category_games_listing hasLayout"><div class="large_sub_pod_column_one"><div class="sub_listing" style="font-size:12px;background-color: #FFFFFF;"id="sub_browser_game_row_1"></div></div><div class="clear"></div></div></div><div><div class="clear"></div><br />';
		var target = $$(".adspacer").length == 0? $$(".category_listing")[0] : $$(".adspacer")[0];
		target.insert({after:table});
		console.log("showing all subscriptions kinda");

		var list = getAllSubscribed();

		//case insensitive sort
		list.sort(
			  function(a, b) {
			    if (a.toLowerCase() < b.toLowerCase()) return -1;
			    if (a.toLowerCase() > b.toLowerCase()) return 1;
			    return 0;
			  }
			);


		list.each(function(item){
			console.log("Adding item " + item);

			var container = new Element("div", {"style":"display:block;"});


			var linkElement = new Element("a", {"style":"min-width:200px; float:left; padding-top:2px; padding-bottom:2px;", "href":"http://www.kongregate.com/accounts/" + item});
			linkElement.update(item);
			var subElement = new Element("a",{"href":"#", "style":"min-width:500px;color:#888;float:left;padding-left: 4px;padding-top:2px; padding-bottom:2px;"});
			subElement.update("Unsubscribe");
			subElement.id = "unsubscribe_" + item;
			subElement.onclick = unsubscribeToADev;


			container.insert(linkElement);
			container.insert(subElement);

			$("sub_browser_game_row_1").insert(container)
		});
	}

	function addProfileSubscribeButton()
	{
		//use something generic that is on profiles to prevent other pages from passing this possibly.
		if($$("#games_by_user_pod").length == 0)
			return;

		var subElement = new Element("a",{"href":"#", "style":"color:#888;padding-left: 4px;"});
		var devname = dom.location.href.substring(dom.location.href.indexOf(".com/accounts/") + ".com/accounts/".length);
		if(!isDevSubscribedTo(devname))
		{
			subElement.update("Subscribe");
			subElement.id = "subscribe_" + devname;
			subElement.onclick = subscribeToADev;
		}
		else
		{
			subElement.update("Unsubscribe");
			subElement.id = "unsubscribe_" + devname;
			subElement.onclick = unsubscribeToADev;
		}

		$$("#games_by_user_pod")[0].down().down().down().insert(subElement);
	}

	function addSubscribeButton() {
		//change css
		var rulesText = ".game_details_outer .game_dev { float: none;}";
			rulesText += ".game_details_outer {padding-bottom:5px;}"
			rulesText += ".game_details_outer .game_detail {padding-bottom:5px;}"
		var head = document.getElementsByTagName('head')[0],
			style = document.createElement('style'),
			rules = document.createTextNode(rulesText);
		style.type = 'text/css';
		if(style.styleSheet)
		    style.styleSheet.cssText = rules.nodeValue;
		else style.appendChild(rules);
			head.appendChild(style);
		

		//add links
		var btn = '<a><span class="kong_ico" aria-hidden="true">b </span>Subscribe</a>';
		var devs = $$(".game_dev");
		devs.each(function(item){
			var devurl = item.down().href;
			var devname = devurl.substring(devurl.lastIndexOf("/")+1);

			var subElement = new Element("a",{"href":"#", "style":"color:#888;padding-left: 4px;"});
			if(!isDevSubscribedTo(devname))
			{
				subElement.update("Subscribe");
				subElement.id = "subscribe_" + devname;
				subElement.onclick = subscribeToADev;
			}
			else
			{
				subElement.update("Unsubscribe");
				subElement.id = "unsubscribe_" + devname;
				subElement.onclick = unsubscribeToADev;
			}
			item.insert(subElement);
		});
	}

	function subscribeToADev(e)
	{
		e.preventDefault();

		var list = getAllSubscribed();
		var dev = this.id.substring("subscribe_".length)
		list.push(dev)
		
		var savelist = list.join(",");
		Cookie.set('DevSubscribeList', savelist, 100000000,'/');

		this.id= "unsubscribe_" + dev;
		this.update("Unsubscribe");
		this.onclick = unsubscribeToADev;

		return false;
	}

	function unsubscribeToADev(e)
	{
		e.preventDefault();

		var list = getAllSubscribed();
		var dev = this.id.substring("unsubscribe_".length)
		if(list.indexOf(dev) != -1)
		{
			list.splice(list.indexOf(dev),1);
		}

		var savelist = list.join(",");
		Cookie.set('DevSubscribeList', savelist, 100000000,'/');

		this.id= "subscribe_" + dev;
		this.update("Subscribe");
		this.onclick = subscribeToADev;
		
		return false;
	}

	function isDevSubscribedTo(devName)
	{
		var list = getAllSubscribed();
		if(list.indexOf(devName) == -1)
			return false;
		return true;
	}

	function getAllSubscribed() {
		var list = Cookie.get("DevSubscribeList");
		if(list == null) 
			return [];
		return list.split(",");
	}

	function getLastDateChecked() {
		var time = Cookie.get("DevSubscribeLastCheck");
		if(time == null) 
			time = new Date(0);
		return time;
	}

	function getLastGameSavedFromDev(developer) {
		var game = Cookie.get("s_l_" + developer);
		if(game == null) 
			game = "";
		return game;
	}
	
	init();
}

// This injects our script onto the page.
// Borrowed from: http://stackoverflow.com/a/2303228
var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);