Greasy Fork

QT Framework for Grepolis

A script framework for Grepolis

目前为 2014-07-24 提交的版本。查看 最新版本

// ==UserScript==
// @name           QT Framework for Grepolis
// @namespace      Quack
// @description    A script framework for Grepolis
// @include        http://*.grepolis.*/game*
// @icon           http://s1.directupload.net/images/140711/eshmcqzu.png
// @version        1.00.00
// @grant          GM_listValues
// @grant          GM_getValue
// @grant          GM_setValue
// @grant          GM_deleteValue
// @grant          GM_info
// @grant          GM_xmlhttpRequest
// @grant          unsafeWindow
// ==/UserScript==

/************************************************************************
 * Main script content
 ***********************************************************************/
function main_script() {
	/************************************************************************
	 * Global variables
	   - Alle Game Variablen
	   - Deklaration des QT Objektes, worin sämtliche Funktionen eingefügt werden
	 ***********************************************************************/
	var QT = {};
	var wID = Game.world_id;
	var mID = Game.market_id;
	var aID = Game.alliance_id;
	var sID = Game.player_id;
	var pName = Game.player_name;
	/************************************************************************
	 * Languages
	   - Habe das so gelöst, dass ich mir die Übersetzungen mit der "get" Funktion hole
	   - Beispiel: QT.Lang.get("test", "teststring");
	 ***********************************************************************/
	QT.Lang = {
		get : function (a, b) {
			if (QT.Lang[mID] != undefined && QT.Lang[mID][a] != undefined && QT.Lang[mID][a][b] != undefined) {
				return QT.Lang[mID][a][b]
			} else {
				return QT.Lang.en[a][b]
			}
		},
		de : {
			test : {
				teststring : 'Sprache wurde erkannt'
			}
		},
		en : {
			test : {
				teststring : 'Language detected'
			}
		}
	};
	/************************************************************************
	 * Images
	   - Hier kommen alle Bilder rein, welche durch die Toolsammlung genutzt werden
	   - Zumindest ist das mal der Plan ;) Hatte noch kein Bock die dort alle einzufügen
	 ***********************************************************************/
	QT.Images = {};
	/************************************************************************
	 * Links
	   - Hier kommen alle URLs rein, welche durch die Toolsammlung genutzt werden
	 ***********************************************************************/
	QT.Links = {};
	/************************************************************************
	 * Settings
	   - Values: Dort kann festgelegt werden, ob einzelne Funktionen per default aktiviert sind oder nicht.
	   - save_all: Es können die Variablen übergeben werden, welche gespeichert werden sollen. Um die setTimout Kacke kommt man in Chrome leider nicht rum. Im FF braucht man sie scheinbar nicht mehr
	   - reset_all: Löscht komplett alle Variablen des Skripte (Ursprung wie bei Erststart des Skriptes)
	   - load_all: Damit werden die Variablen zu Beginn des Starts geladen und in das QT.Settings.values Objekt eingefügt.
	   - Die Script version wird mit durch die Variable QT_scriptMeta ermittelt
	     Im Firefox ist dies das mit cloneInto exportierte Objekt GM_info
		 Im Chrome habe ich die Variable QT_scriptMeta deklariert und dort das GM_info Objekt reingepackt
	 ***********************************************************************/
	QT.Settings = {
		values : {
				"script_version" : QT_scriptMeta.script.version,
				"messageOpenAlert" : true,
				"startFunction" : true,
		},
		save_all : function (values) {
			setTimeout(function () {
				var keys = GM_listValues();
				console.log(keys);
				for (key in QT.Settings.values) {
					if (key != "qmenu_update_next" && key != "qmenu_online_version" && key != "onlinetotal") {
						if (key in values) {
							GM_setValue(key, values[key]);
						} else {
							GM_deleteValue(key);
						}
					}
				}
			}, 0);
			window.location.reload();
		},
		reset_all : function () {
			setTimeout(function () {
				var keys = GM_listValues();
				for (var i = 0, key = null; key = keys[i]; i++) {
					GM_deleteValue(key);
				}
			}, 0);
			window.location.reload();
		},
		load_all : function () {
			setTimeout(function () {
				var keys = GM_listValues();
				for (var i = 0, key = null; key = keys[i]; i++) {
					QT.Settings.values[key] = GM_getValue(key);
				}
			}, 0);
		}
	};
	/************************************************************************
	 * Ajax Call functions
	   - Du machst das in deinem Skript ein wenig anders. Ich hatte das geändert, nachdem Grepolis vor einiger Zeit die URLs der Ajax Calls angepasst hatte
	     Beispiel: http://de52.grepolis.com/game/message?town_id=19268&action=default
	   - Hier überprüfe ich auch, ob ein Skript laut Einstellungen überhaupt gestartet werden darf
	 ***********************************************************************/
	QT.CallAjaxFunction = {
		message : {
			default : function (event, xhr, settings) {
				if (QT.Settings.values.messageOpenAlert)
					QT.Functions.messageOpenAlert();
			}
		}
	};
	/************************************************************************
	 * Functions
	   - Hier kommen alle Funktionen rein, die beim Start des Skriptes oder durch einen Ajax Call aufgerufen werden
	 ***********************************************************************/
	QT.Functions = {
		messageOpenAlert : function () {
			alert("Die Nachrichten wurden geöffnet");
		},
		someStartFunction : function () {
			console.log("Irgendwas wurde erfolgreich nach dem fertigen Laden von Grepolis ausgeführt");
		},
		testButtons : function () {
			$('#ui_box').append('<div id="qt_buttons" style="position: relative;top: 54px;z-index: 100"><button id="qt_messageOpenAlert">messageOpenAlert deaktivieren</button><button id="qt_listValues">GM_listValues</button><button id="qt_delete">reset_all</button><button id="qt_scriptVersion">Script version</button></div>');
			$("#qt_messageOpenAlert").click(function () {
				//GM_setValue("test","Der Test klappt!");
				var valuesToSave = {};
				valuesToSave.messageOpenAlert = false;
				QT.Settings.save_all(valuesToSave);
			});
			$("#qt_listValues").click(function () {
				console.log(GM_listValues());
			});
			$("#qt_delete").click(function () {
				//GM_deleteValue("test");
				QT.Settings.reset_all();
			});
			$("#qt_scriptVersion").click(function () {
				alert(QT.Settings.values.script_version);
			});
		}
	};
	/************************************************************************
	 * Load Settings + Observer
	   - Erst werden alle Einstellungen geladen
	   - Dann meldet sich der Observer und die alle startup Funktionen können aufgerufen werden
	   - Genauso wie $(document).ajaxComplete
	     Bei mir wird eine Funktionen direkt aufgerufen - also nicht wie bei der case Variante
		 Im Beispiel: QT.CallAjaxFunction["message"]["default"](event, xhr, settings);
		              QT.CallAjaxFunction    [b]       [c]     (event, xhr, settings);
	   - Was vielleicht passieren könnte wäre, dass die Settings nicht schnell genau geladen werden und der Start von Grepolis eher abgeschlossen ist
	     Das Ganze passiert, weil der Inhalt der QT.Settings.load_all() Funktion in ein setTimout eingewickelt ist.
	     Das Grepo schneller läd ist mir aber bisher noch nicht passiert - man könnte sonst vielleicht im $.Observer nochmal mit setTimeout arbeiten. Auch wenns nicht so schön wäre... 
	 ***********************************************************************/
	QT.Settings.load_all();
	$.Observer(GameEvents.game.load).subscribe('QT', function (e, data) {
		if (QT.Settings.values.startFunction)
			QT.Functions.someStartFunction();
		QT.Functions.testButtons();
		
		$(document).ajaxComplete(function (event, xhr, settings) {
			var a = settings.url.split("?");
			var b = a[0].substr(6);
			var c = a[1].split("&")[1].substr(7);
			if (b in QT.CallAjaxFunction && c in QT.CallAjaxFunction[b]) {
				QT.CallAjaxFunction[b][c](event, xhr, settings);
			}
		});
	});
}

/************************************************************************
 * Starting method
   - Für den Firefox werden die GM API Funktionen exportiert und main_script in den head Bereich der Seite eingefügt
     Die exportierten Funktionen tragen den selben Namen wie die originalen GM Funktionen. Der Grund ist Chrome, weil dort die GM_ Funktionen direkt ausgeführt werden können und ich somit nicht noch extra unterscheiden muss
   - Da GM_info ein Objekt ist und keine Funktion, muss die mit cloneInto exportiert werden
	 GM_info brauchste ja vielleicht auch gar nicht - ich benutze das halt für meinen Updater
   - Für Chrome braucht einfach nur das main_script ausgeführt zu werden.
     Zuvor deklariere ich noch QT_scriptMeta und haue da das GM_info Objekt rein.
	 Der QT.Settings.values.script_version Eintrag kann ja sonst nicht auf die Skript Version zugreifen
 ***********************************************************************/
if (typeof cloneInto != "undefined") { // Firefox
	exportFunction(GM_listValues, unsafeWindow, {defineAs: "GM_listValues"});
	exportFunction(GM_getValue, unsafeWindow, {defineAs: "GM_getValue"});
	exportFunction(GM_setValue, unsafeWindow, {defineAs: "GM_setValue"});
	exportFunction(GM_deleteValue, unsafeWindow, {defineAs: "GM_deleteValue"});
	exportFunction(GM_xmlhttpRequest, unsafeWindow, {defineAs: "GM_xmlhttpRequest"});
	unsafeWindow.QT_scriptMeta = cloneInto(GM_info, unsafeWindow);
	
	var s = document.createElement('script');
	s.type = 'text/javascript';
	s.textContent = main_script.toString() + "\n main_script();";
	document.head.appendChild(s);
} else { // Chrome + Opera
	var QT_scriptMeta = GM_info;
	main_script();
}