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