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