您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A script framework for Grepolis
当前为
// ==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(); }