QT Framework for Grepolis

A script framework for Grepolis

2014-07-24 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

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