OGame: Moon Spy and Recycler

OGame: directly spy a moon and send recyclers from galaxy view

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name OGame: Moon Spy and Recycler
// @namespace https://greasyfork.org/users/4668-black-cat
// @description OGame: directly spy a moon and send recyclers from galaxy view
// @version 5.4
// @creator Black Cat
// @include http://*.ogame.gameforge.com/game/index.php?page=galaxy*
// @require https://greasyfork.org/scripts/4442-ogame-localization/code/OGame:%20Localization.js
// @run-at document-end
// ==/UserScript==

var strFunc = (function(){
	var language = document.querySelector("meta[name=ogame-language]").getAttribute("content");
	var messages = {
		"600_1": "Send espionage probe to:",
		"600_2": "Send recycler to:",
		"601": "An error has occurred",
		"602": "Error, there is no moon",
		"603": "Error, player can't be approached because of newbie protection",
		"604": "Player is too strong to be attacked",
		"605": "Error, player is in vacation mode",
		"606": "No fleets can be sent from vacation mode!",
		"610": "Error, not enough ships available, send maximum number:",
		"611": "Error, no ships available",
		"612": "Error, no free fleet slots available",
		"613": "Error, you don't have enough deuterium",
		"614": "Error, there is no planet there",
		"615": "Error, not enough cargo capacity",
		"616": "Multi-alarm",
		"617": "Admin or GM",
		"618": "Attack ban until 01.01.1970 01:00:00"
	};
	switch (language) {
		case "de":
			messages["600_1"] = "Sende Spionagesonden nach:";
			messages["600_2"] = "Sende Recycler nach:";
			messages["601"] = "Ein Fehler ist aufgetreten.";
			messages["611"] = "Fehler, keine Schiffe vorhanden";
			messages["612"] = "Fehler, keine freien Flottenslots";
			messages["613"] = "Fehler, du hast nicht genug Deuterium.";
			messages["615"] = "Fehler, die Ladekapazität reicht nicht aus.";
			break;
		case "es":
			messages["600_1"] = "Enviar sonda de espionaje a:";
			messages["600_2"] = "Enviar reciclador a:";
			messages["601"] = "Ha ocurrido un error";
			messages["611"] = "Error, no hay naves disponibles";
			messages["612"] = "Error, no hay espacio para más flotas";
			messages["613"] = "Error, no tienes suficiente deuterio";
			messages["615"] = "Error, no hay suficiente espacio de carga";
			break;
		case "fr":
			messages["600_1"] = "Expédier des sondes d'espionnage vers:";
			messages["600_2"] = "Expédier des recycleurs vers:";
			messages["601"] = "Une erreur s'est produite";
			messages["611"] = "Erreur! pas de vaisseaux disponibles";
			messages["612"] = "Erreur! pas de slots de flotte libre";
			messages["613"] = "Erreur! pas assez de deutérium disponible";
			messages["615"] = "Erreur! La capacité de chargement n'est pas suffisante";
			break;
		default:
			break;
	}

	var sendFleet = function() {
		var step = 0;
		var shipSent = 0;
		var recyclerSent = 0;
		var probeSent = 0;
		var recyclerValue = 0;
		var probeValue = 0;
		var slotUsed = 0;
		var slotTotal = 0;
		this.data;
		var that = this;

		this.canStart = function() {
			return (shipsendingDone == 1);
		}

		this.reset = function() {
			shipsendingDone = 1;
			step = 0;
			shipSent = 0;
			recyclerSent = 0;
			probeSent = 0;
			delete this.data;
		}

		var displayOk = function() {
			slotUsed++;
			recyclerValue -= recyclerSent;
			probeValue -= probeSent;
			var missileValue = document.getElementById("missileValue").textContent;
			var type = 0;
			if (that.data.mission == 6) {
				type = 1;
			} else if (that.data.mission == 8) {
				type = 2;
			}
			var response = {
				message:messages["600_"+type],
				type:type,
				slots:slotUsed,
				probes:probeValue,
				recyclers:recyclerValue,
				missiles:missileValue,
				shipsSent:shipSent,
				coordinates:{galaxy:that.data.galaxy, system:that.data.system, position:that.data.position},
				planetType:that.data.type,
				success:true
			};
			displayMiniFleetMessage(response);
		}

		var displayKo = function(code) {
			if (!code) {
				code = "601";
			}
			var response = {
				message:messages[code],
				coordinates:{galaxy:that.data.galaxy, system:that.data.system, position:that.data.position},
				success:false
			};
			displayMiniFleetMessage(response);
		}

		this.process = function(html,id) {
			if (shipsendingDone == 1) return;
			step++;
			var page;
			var method = "POST";
			var pData = {};
			switch (step) {
				case 1:
					page = document.querySelector("#menuTable a[href*='fleet1']").href;
					method = "GET";
					break;
				case 2:
					if (id != "fleet1") {
						displayKo();
						this.reset();
						return;
					}
					var fleets = $(html).find("#slots span.advice").eq(0).text();
					/(\d*)\/(\d*)/.exec(fleets);
					slotUsed = parseInt(RegExp.$1);
					slotTotal = parseInt(RegExp.$2);
					recyclerValue = parseInt($(html).find("#button209 span.level").eq(0).text().replace(/\D/g, ""));
					if (isNaN(recyclerValue)) recyclerValue = 0;
					probeValue = parseInt($(html).find("#button210 span.level").eq(0).text().replace(/\D/g, ""));
					if (isNaN(probeValue)) probeValue = 0;
					$("#slotUsed").html(tsdpkt(slotUsed));
					setShips("probeValue", tsdpkt(probeValue));
					setShips("recyclerValue", tsdpkt(recyclerValue));
					if ((this.data.mission == 6 && probeValue == 0)
							|| (this.data.mission == 8 && recyclerValue == 0)) {
						displayKo("611");
						this.reset();
						return;
					} else if (slotUsed == slotTotal) {
						displayKo("612");
						this.reset();
						return;
					}
					var form = $(html).find("form[name='shipsChosen']");
					page = form.attr("action");
					form.find("input,select").each(function(){
						if (this.name) pData[this.name] = this.value;
					});
					for (var i in this.data) {
						if (/^am\d{3}$/.test(i)) {
							pData[i] = this.data[i];
						}
					}
					break;
				case 3:
					if (id != "fleet2") {
						displayKo();
						this.reset();
						return;
					}
					var form = $(html).find("form[name='details']");
					page = form.attr("action");
					form.find("input,select").each(function(){
						if (this.name) pData[this.name] = this.value;
						if (/^am\d{3}$/.test(this.name)) {
							shipSent += parseInt(this.value);
							if (this.name == "am209") {
								recyclerSent = parseInt(this.value);
							} else if (this.name == "am210") {
								probeSent = parseInt(this.value);
							}
						}
					});
					pData.galaxy = this.data.galaxy;
					pData.system = this.data.system;
					pData.position = this.data.position;
					pData.type = this.data.type;
					break;
				case 4:
					if (id != "fleet3") {
						displayKo();
						this.reset();
						return;
					}
					var consumption = parseInt($(html).find("#consumption").text().replace(/\D/g, ""));
					var deuterium = parseInt($(html).find("#resources_deuterium").text().replace(/\D/g, ""));
					if (consumption > deuterium) {
						displayKo("613");
						this.reset();
						return;
					}
					var maxresources = parseInt($(html).find("#maxresources").text().replace(/[^0-9-]/g, ""));
					if (maxresources < 0) {
						displayKo("615");
						this.reset();
						return;
					}
					var form = $(html).find("form[name='sendForm']");
					page = form.attr("action");
					form.find("input,select").each(function(){
						if (this.name) pData[this.name] = this.value;
					});
					pData.mission = this.data.mission;
					break;
				default:
					if (id == "movement") {
						displayOk();
					} else {
						displayKo();
					}
					this.reset();
					return;
					break;
			}
			$.ajax({
				dataType:"html",
				url:page,
				data:pData,
				type:method,
				timeout:5000,
				success: function (html) {
					/<body id="([^"]*)"/.exec(html);
					var id = RegExp.$1;
					that.process($.parseHTML(html),id);
				},
				error: function (xhr,status,exception) {
					addToTable(exception, "error");
					that.reset();
				}
			});
		}

		this.start = function() {
			if (typeof this.data != 'undefined') {
				shipsendingDone = 0;
				this.process();
			}
		}
	}

	var fleetSender = new sendFleet();

	var sendProbes = function(e) {
		if (fleetSender.canStart()) {
			fleetSender.data = $(e.target).data();
			fleetSender.data.mission = "6";
			fleetSender.data.type = "3";
			fleetSender.start();
		}
	}

	var sendRecyclers = function(e) {
		if (fleetSender.canStart()) {
			fleetSender.data = $(e.target).data();
			fleetSender.data.mission = "8";
			fleetSender.data.type = "2";
			fleetSender.start();
		}
	}

	var espionageName = "Espionage";
	var locData = localStorage.getItem("localization.data");
	if (locData) {
		locData = JSON.parse(locData);
		espionageName = locData.missions["6"];
	}

	$(document).ajaxSuccess(function(e,xhr,settings){
		if (settings.url.indexOf("page=galaxyContent") == -1) return;

		var rows = document.querySelectorAll("#galaxytable tr.row");
		for (var i = 0; i < rows.length; i++) {
			var moon = rows[i].querySelector("td.moon");
			if (moon) {
				if (isMobile) {
					if (!($(moon).hasClass("js_no_action"))) {
						var links = rows[i].querySelector("td.action").getElementsByTagName("a");
						for (var j = 0; j < links.length; j++) {
							var clickAttr = links[j].getAttribute("onclick") || "";
							clickAttr = clickAttr.replace(/\s*([(,)])\s*/g,"$1");
							if (clickAttr.indexOf("(6,") > -1) {
								var content = document.getElementsByClassName("js_detailRowMoon" + (i+1))[0].getElementsByClassName("active_row_details_content")[0];
								var nodes = content.childNodes;
								for (var k = nodes.length-1; k >= 0; k--) {
									if (nodes[k].nodeType == 3) {
										content.removeChild(nodes[k]);
									}
								}
								var spy_link = document.createElement("a");
								var expression = /\(\d*,(\d*),(\d*),(\d*),\d*,(\d*)\)/;
								expression.exec(clickAttr);
								$(spy_link).data("galaxy",RegExp.$1);
								$(spy_link).data("system",RegExp.$2);
								$(spy_link).data("position",RegExp.$3);
								$(spy_link).data("am210",RegExp.$4);
								spy_link.className = "dark_highlight_tablet";
								spy_link.onclick = sendProbes;
								spy_link.href = "javascript:void(0);";
								spy_link.innerHTML = "<span class='icon icon_espionage float_left'></span>" + espionageName;
								content.appendChild(spy_link);
								break;
							}
						}
					}
				} else {
					var ul = moon.getElementsByClassName("ListLinks")[0];
					if (ul) {
						var items = rows[i].querySelectorAll(".ListLinks>li");
						for (var j = 0; j < items.length; j++) {
							if (items[j].innerHTML.indexOf("(6,") > -1) {
								var li = items[j].cloneNode(true);
								var spy_link = li.getElementsByTagName("a")[0];
								var expression = /\(\d*,(\d*),(\d*),(\d*),\d*,(\d*)\)/;
								expression.exec(spy_link.getAttribute("onclick"));
								$(spy_link).data("galaxy",RegExp.$1);
								$(spy_link).data("system",RegExp.$2);
								$(spy_link).data("position",RegExp.$3);
								$(spy_link).data("am210",RegExp.$4);
								spy_link.onclick = sendProbes;
								spy_link.href = "javascript:void(0);";

								if (moon.getElementsByClassName("activity").length > 0) {
									ul.insertBefore(li,ul.getElementsByTagName("li")[0].nextSibling);
								} else {
									ul.insertBefore(li,ul.firstChild);
								}
								break;
							}
						}
					}
				}
			}
			var debris = rows[i].querySelector("td.debris");
			if (debris) {
				if (isMobile) {
					if (!($(debris).hasClass("js_no_action"))) {
						var content = document.getElementsByClassName("js_detailRowDebris" + (i+1))[0].getElementsByClassName("active_row_details_content")[0];
						var link = content.getElementsByTagName("a")[0];
						if (link) {
							var pos = content.getElementsByClassName("coords")[0];
							var expression = /(\d*):(\d*):(\d*)/;
							expression.exec(pos.textContent);
							$(link).data("galaxy",RegExp.$1);
							$(link).data("system",RegExp.$2);
							$(link).data("position",RegExp.$3);
							var total = 0;
							var res = content.getElementsByClassName("debris_res");
							for (var j = 0; j < res.length; j++) {
								total += parseInt(res[j].textContent.replace(/\D/g, ""));
							}
							$(link).data("am209",Math.ceil(total/20000));
							link.onclick = sendRecyclers;
							link.href = "javascript:void(0);";
						}
					}
				} else {
					var pos = debris.querySelector("#pos-debris");
					if (pos) {
						var recyclers = debris.getElementsByClassName("debris-recyclers")[0];
						var link = debris.querySelector(".ListLinks>li>a");
						if (recyclers && link) {
							var expression = /(\d*):(\d*):(\d*)/;
							expression.exec(pos.textContent);
							$(link).data("galaxy",RegExp.$1);
							$(link).data("system",RegExp.$2);
							$(link).data("position",RegExp.$3);
							$(link).data("am209",recyclers.textContent.replace(/\D/g, ""));
							link.onclick = sendRecyclers;
							link.href = "javascript:void(0);";
						}
					}
				}
			}
		}
	});
}).toString();

var script = document.createElement("script");
script.setAttribute("type","text/javascript");
script.text = "(" + strFunc + ")();";
document.body.appendChild(script);