Wall Manager Sidekick (Pot Farm)

Assists Wall Manager with Pot Farm posts

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name           Wall Manager Sidekick (Pot Farm)
// @namespace      Wall Manager Sidekick (Pot Farm)
// @description    Assists Wall Manager with Pot Farm posts
// @exclude        *apps.facebook.com/mypotfarm/*
// @include        http*://thepotfarmgame.com/*
// @include        http*://www.thepotfarmgame.com/*
// @include        http*://www.facebook.com/pages/FB-Wall-Manager/*
// @license        http://creativecommons.org/licenses/by-nc-nd/3.0/us/
// @version        0.0.5
// @copyright      Itshadow
// ==/UserScript==  
(function() {
// @require        http://sizzlemctwizzle.com/updater.php?id=119887&days=1

	// Modified by Merricksdad 12/13/2013
	// *include secure browsing addresses (now required on most facebook servers)
	// *removed sizzle's updater reference
	// *replaced trackback address of appcenter to reqs page
	
	// Update date: 11-03-12 @ 01:55PM
	var version = "0.0.4";// Update date: 05-10-13 @ 04:20PM
	var thisAppID = "272810543124";
	var defaultTO=null;

	function $(ID,root) {return (root||document).getElementById(ID);}

	String.prototype.startsWith = function(s) {return (this.match("^"+s)==s)};

	String.prototype.endsWith = function(s) {return (this.match(s+"$")==s)};

	String.prototype.find = function(s) {return (this.indexOf(s) != -1);};

	String.prototype.contains = function(s) {return (this.indexOf(s) != -1);};

	String.prototype.noSpaces = function(s) {return (this.replace(/\s+/g,''));};

	String.prototype.upperWords = function(s) {return (this+'').replace(/^(.)|\s(.)/g, function($1){return $1.toUpperCase();});};

	Array.prototype.swap = function (x,y) {var b = this[x];this[x] = this[y];this[y] = b;return this;};

	Array.prototype.inArray = function(value) {for(var i=this.length-1; i>=0; i--) {if(this[i]==value) return true;} return false;};

	String.prototype.safeContent = function(src){
		return src.replace(new RegExp("(<!--.*?(?=-->)-->)|(<[ \n\r]*style[^>]*>.*?<[ \n\r]*/style[^>]*>)|(<[ \n\r]*script[^>]*>.*?<[ \n\r]*/script[^>]*>)|(<(?:.|\s)*?>)", 'gi'),'');
	}

	//sorts an array in such a way as to prevent
	//finding pea before peanut, or pea before english pea, and then effectively swapping their order
	//now also finds ash in cashew and places ash after cashew
	Array.prototype.fixOrder = function(){
		if (this.length>1) for (var i=this.length-1;i>0;i--) {
			for (var i2=i-1;i2>0;i2--){
				if (this[i].toLowerCase().contains(this[i2].toLowerCase())){
					var b=this[i];
					this[i]=this[i2];
					this[i2]=b;
					b=null;
				}
			}
		}
		return this;
	};

	//reconstruct an array, turning it into definitions using a prefix
	Array.prototype.toDefinitions = function(prefix){
		if (this) for (var i=0;(this[i]);i++) this[i]=prefix+this[i].noSpaces().toLowerCase();
		return this;
	};

	//returns the merge of any number of JSON objects
	//pass JSON objects as comma separated parameters
	//var newJSON = mergeJSON(a,b,c...n)
	//note: overwrites preexisting entries from earlier passed objects
	function mergeJSON () {
		var ret = {};
		for (var a=0,len=arguments.length;a<len;a++) for (var v in arguments[a]) ret[v] = arguments[a][v];
      		return ret;
	};

	//short form for evaluate
	//returns a snapshot object
	function selectNodes(xPath,params){
		params=(params||{});
		return (params['doc']||document).evaluate(xPath,(params['node']||document),null,(params['type']||6),null);
	};

	//short form for evaluate with single node return
	//returns the actual node, not the snapshot
	function selectSingleNode(xPath,params){
		params=params||{}; params['type']=9;
		return selectNodes(xPath,params).singleNodeValue;
	};

	//clicks an object using the mouse
	//does not run default actions like opening links
	function click(e) {
		if(!e && typeof e=='string') e=document.getElementById(e);
		if(!e) return;
		var evObj = e.ownerDocument.createEvent('MouseEvents');
		evObj.initMouseEvent("click",true,true,e.ownerDocument.defaultView,0,0,0,0,0,false,false,false,false,0,null);
		e.dispatchEvent(evObj);
	};

	// Created by avg, modified by JoeSimmons. shortcut to create an element
	function createElement(a,b,c) {
		if(a=="text") {return document.createTextNode(b);}
		var ret=document.createElement(a.toLowerCase());
		if(b) for(var prop in b) if(prop.indexOf("on")==0) ret.addEventListener(prop.substring(2),b[prop],false);
		else if(",style,accesskey,id,name,src,href,which,rel,action,method,value,data-ft".indexOf(","+prop.toLowerCase())!=-1) ret.setAttribute(prop.toLowerCase(), b[prop]);
		else ret[prop]=b[prop];
		if(c) c.forEach(function(e) { ret.appendChild(e); });
		return ret;
	};

	//sidekick ability to pass information via hash parameter
	function setHashParam(p,v){
		var h = unsafeWindow.top.location.hash;
		var params = h.split('&');
		var found=false;
		if (params.length) for (var x=0;x<params.length && !found;x++){
			var p1 = params[x].split('=')[0];
			var v1 = params[x].split('=')[1];
			if (p1 == p) {
				params[x]=p+'='+v;
				found=true;
			}
		}
		if (!found) params[params.length]=p+'='+v;
		h=params.join('&');
		unsafeWindow.top.location.hash = h;
	};

	function sendMessage(s){
		//top.location.href = 'http*://apps.facebook.com/?#status=' + s;
		top.location.href = 'http*://www.facebook.com/reqs.php?#status=' + s;
		return;
	};

	function dock(){
		//check that dock exists
		var door=$('wmDock');
		if (!door) {
			//cannot find dock
			window.setTimeout(dock, 1000);
			return;
		} 

		//check that the dock does not already have us listed
		var doorMark=$('wmDoor_app272810543124');
		if (doorMark) return; //already posted to door

		var attachment={
			appID:'272810543124',
			synAppID:['222727414408240'],
			addFilters:[{
					appID:'222727414408240',
					name:'Blaze Runner',
					icon:'http*://profile.ak.fbcdn.net/hprofile-ak-snc4/277133_222727414408240_8023392_q.jpg'
			}],

			alias:'PF',
			hrefKey:'ktf', //such as sendkey
			name:'Pot Farm', //how you want it to display
			thumbsSource:'www.thepotfarmgame.com',
			flags:{httpsTrouble:true,requiresTwo:false,skipResponse:false,alterLink:true},
			icon:"http*://photos-h.ak.fbcdn.net/photos-ak-snc1/v43/84/272810543124/app_2_272810543124_3370.gif",
			desc:"Pot Farm Sidekick ("+version+") w/ Blade Runner support",

			/*alterLink:{
				find:"(www\.thepotfarmgame\.com|apps\.facebook\.com/mypotfarm)",
				isRegex:true,
				replace:'thepotfarmgame.com/potfarm',
			},*/
			alterLink:{
				find:"(www\.thepotfarmgame\.com)",
				isRegex:true,
				replace:'apps.facebook.com/mypotfarm',
			},

			accText: {

//MOOCH ITEMS
_surpriseseed:"Surprise Seed",
_mysteryseed:"Mystery Seed",
_raremysteryseed:"Rare Mystery Seed",
_themeplant:"Theme Plant",
_4xthemeplant:"4x Theme Plant",
_9xthemeplant:"9x Theme Plant",
_1xnonthemeplant:"1x Non-Theme Plant",
_4xnonthemeplant:"4x Non-Theme Plant",
_9xnonthemeplant:"9x Non-Theme Plant",
_1xplant:"1x Plant",
_4xplant:"4x Plant",
_9xplant:"9x Plant",
_20xplant:"20x Plant",
_cultists:"Cultists",
_guano:"Guano",
_product:"Product",
_hashmix:"Hash Mix",
_bankersbud:"Bankers Bud",
_doctor:"The Doctor",
_variable:"Variable seed",
_puffpuff:"Puff Puff Pass",
_potheads:"Pot Heads",
//MOOCH ITEMS
			},
			tests: [
				{link:"Get a Surprise Seed!", ret:"_surpriseseed"},
				{link:"Get a Mystery Seed!", ret:"_mysteryseed"},
				{link:"Get a RARE Mystery Seed!", ret:"_raremysteryseed"},
				{link:"Get Theme Plant!", ret:"_themeplant"},
				{link:"Get cultists!", ret:"_cultists"},
				{link:"Get 4x Theme Plant!", ret:"_4xthemeplant"},
				{link:"Get 9x Theme Plant!", ret:"_9xthemeplant"},
				{link:"Get 1x Non-Theme Plant!", ret:"_1xnonthemeplant"},
				{link:"Get 4x Non-Theme Plant!", ret:"_4xnonthemeplant"},
				{link:"Get 9x Non-Theme Plant!", ret:"_9xnonthemeplant"},
				{link:"Get 1x Plant!", ret:"_1xplant"},
				{link:"Get 4x Plant!", ret:"_4xplant"},
				{link:"Get 9x Plant!", ret:"_9xplant"},
				{link:"Get 20x Plant!", ret:"_20xplant"},
				{link:"Get some Guano!", ret:"_guano"},
				{link:"Grab a Product!", ret:"_product"},
				{link:"Get Hash Mix!", ret:"_hashmix"},
				{link:"Get Banker's Bud!", ret:"_bankersbud"},
				{link:"Get The Doctor!", ret:"_doctor"},
				{link:"Get a Variable Seed!", ret:"_variable"},
				{link:"Get a Puff Puff Pass!", ret:"_puffpuff"},
				{link:"Get some Pot Heads!", ret:"_potheads"},

//MOOCH ITEMS
			],

			menu: {
				SSsection_main:{type:"section",label:"Pot Farm Feed Options ("+version+")",kids:{
//MOOCH ITEMS
					SSseeds:{type:"separator",label:"Seeds",kids:{
						seedstab0:{type:'tab',label:"Rewards",kids:{
							mseedsBlock:{type:'optionblock',label:"Gifts:",kids:{
								_surpriseseed:{type:"checkbox",label:"Surprise Seed"},
								_mysteryseed:{type:"checkbox",label:"Mystery Seed"},
								_raremysteryseed:{type:"checkbox",label:"Rare Mystery Seed"},
								_themeplant:{type:"checkbox",label:"Theme Plant"},
								_4xthemeplant:{type:"checkbox",label:"4x Theme Plant"},
								_9xthemeplant:{type:"checkbox",label:"9x Theme Plant"},
								_1xnonthemeplant:{type:"checkbox",label:"1x Non-Theme Plant"},
								_4xnonthemeplant:{type:"checkbox",label:"4x Non-Theme Plant"},
								_9xnonthemeplant:{type:"checkbox",label:"9x Non-Theme Plant"},
								_1xplant:{type:"checkbox",label:"1x Plant"},
								_4xplant:{type:"checkbox",label:"4x Plant"},
								_9xplant:{type:"checkbox",label:"9x Plant"},
								_20xplant:{type:"checkbox",label:"20x Plant"},
								_cultists:{type:"checkbox",label:"Cultists"},
								_guano:{type:"checkbox",label:"Guano"},
								_product:{type:"checkbox",label:"Product"},
								_hashmix:{type:"checkbox",label:"Hash Mix"},
								_bankersbud:{type:"checkbox",label:"Bankers Bud"},
								_doctor:{type:"checkbox",label:"The Doctor"},
								_variable:{type:"checkbox",label:"Variable Seed"},
								_puffpuff:{type:"checkbox",label:"Puff Puff Pass"},
								_potheads:{type:"checkbox",label:"Pot Heads"},
							}},
						}},
					}},
				}},
			}
		};

		attString=JSON.stringify(attachment);
		door.appendChild(createElement('div',{id:'wmDoor_app'+thisAppID,'data-ft':attString}));
		attachment=null;attString=null;
		window.setTimeout(function(){click(door);},1000);
	};

	//main script function
	function run(){
		var href = window.location.href;
		var text = document.documentElement.textContent;
		text = text.safeContent(text);
		var thisLoc; (thisLoc=(location.protocol+"//"+location.host+location.pathname).split("/")).pop(); thisLoc=thisLoc.join("/");

		//*************************************************************************************
		//***** this section must be tailored to fit your specific needs                  *****
		//***** below is a list of searches for text pertaining to various messages       *****
		//***** the list below is not generic and targets Empires and Allies specifically *****
		//***** you will need to find the specific texts for the game you selected        *****
		//*************************************************************************************
		//***** The WM script can recieve and act on the following statusCode values:     *****
		/*
			  1: Acceptance, no stipulations
			  0: Unknown return, use this only if your script encounters unplanned results and can still communicate a result
			 -1: Failure, generic
			 -2: Failure, none left
			 -3: Over Gift Limit failure
			 -4: Over Gift Limit, still allows sending gift, marked as accepted
			 -5: Identified server error
			 -6: Already got, failure marked as accepted
			 -7: Identified server down for repairs
			 -8: Problem finding a required action link
			 -9: reserved for WM functions
			-10: reserved for WM functions
			-11: Identified as expired
			-12: Post source is not a neighbor and neighbor status is required. Future WM version will auto-add neighbor if possible.

			//additional codes may now exist, please check the wiki support site for information
		*/
		//*************************************************************************************

		if (window.location.host=='www.facebook.com') {
			dock();
			return;
		}
		else if (href.startsWith(thisLoc+'/gifts.php')) {
			// Catch and stop the script on the gift page, it contains all the test strings
			// used in this script and can return a false positive, or a "Something is wrong with the link"
			// responce
			return false; 
		}
		else if (text.match(/invalid|wrong/gi)) {
			// Generic "This is an invalid link, Please Contact the Devs" link...
			// Something is wrong with the link
			sendMessage('-5');
			return;
		}
		else if (href.startsWith(thisLoc+'/claimViralReward.php')) {
			if (text.find('You totally scored')) {
				sendMessage('1');
				return;
			}
			else if (text.find('more than once')) {
				sendMessage('-6');
				return;
			}
			else if (text.find('reached today')) {
				sendMessage('-3');
				return;
			}
			else if (text.find('all been claimed')) {
				sendMessage('-2');
				return;
			}
			else if (text.find('same link')) {
				sendMessage('-1');
				return;
			}
		}
		//https://apps.facebook.com/mypotfarm/maintenance.php
		else if (href.startsWith(thisLoc+'/maintenance.php')) {
			sendMessage('-7');
			return;
		}
	}
	//start the script
	window.setTimeout(run,500);

})(); // anonymous function wrapper end