QT Framework for Grepolis

A script framework for Grepolis

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

  1. // ==UserScript==
  2. // @name QT Framework for Grepolis
  3. // @namespace Quack
  4. // @description A script framework for Grepolis
  5. // @include http://*.grepolis.*/game*
  6. // @icon http://s1.directupload.net/images/140711/eshmcqzu.png
  7. // @version 1.00.00
  8. // @grant GM_listValues
  9. // @grant GM_getValue
  10. // @grant GM_setValue
  11. // @grant GM_deleteValue
  12. // @grant GM_info
  13. // @grant GM_xmlhttpRequest
  14. // @grant unsafeWindow
  15. // ==/UserScript==
  16.  
  17. /************************************************************************
  18. * Main script content
  19. ***********************************************************************/
  20. function main_script() {
  21. /************************************************************************
  22. * Global variables
  23. - Alle Game Variablen
  24. - Deklaration des QT Objektes, worin sämtliche Funktionen eingefügt werden
  25. ***********************************************************************/
  26. var QT = {};
  27. var wID = Game.world_id;
  28. var mID = Game.market_id;
  29. var aID = Game.alliance_id;
  30. var sID = Game.player_id;
  31. var pName = Game.player_name;
  32. /************************************************************************
  33. * Languages
  34. - Habe das so gelöst, dass ich mir die Übersetzungen mit der "get" Funktion hole
  35. - Beispiel: QT.Lang.get("test", "teststring");
  36. ***********************************************************************/
  37. QT.Lang = {
  38. get : function (a, b) {
  39. if (QT.Lang[mID] != undefined && QT.Lang[mID][a] != undefined && QT.Lang[mID][a][b] != undefined) {
  40. return QT.Lang[mID][a][b]
  41. } else {
  42. return QT.Lang.en[a][b]
  43. }
  44. },
  45. de : {
  46. test : {
  47. teststring : 'Sprache wurde erkannt'
  48. }
  49. },
  50. en : {
  51. test : {
  52. teststring : 'Language detected'
  53. }
  54. }
  55. };
  56. /************************************************************************
  57. * Images
  58. - Hier kommen alle Bilder rein, welche durch die Toolsammlung genutzt werden
  59. - Zumindest ist das mal der Plan ;) Hatte noch kein Bock die dort alle einzufügen
  60. ***********************************************************************/
  61. QT.Images = {};
  62. /************************************************************************
  63. * Links
  64. - Hier kommen alle URLs rein, welche durch die Toolsammlung genutzt werden
  65. ***********************************************************************/
  66. QT.Links = {};
  67. /************************************************************************
  68. * Settings
  69. - Values: Dort kann festgelegt werden, ob einzelne Funktionen per default aktiviert sind oder nicht.
  70. - 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
  71. - reset_all: Löscht komplett alle Variablen des Skripte (Ursprung wie bei Erststart des Skriptes)
  72. - load_all: Damit werden die Variablen zu Beginn des Starts geladen und in das QT.Settings.values Objekt eingefügt.
  73. - Die Script version wird mit durch die Variable QT_scriptMeta ermittelt
  74. Im Firefox ist dies das mit cloneInto exportierte Objekt GM_info
  75. Im Chrome habe ich die Variable QT_scriptMeta deklariert und dort das GM_info Objekt reingepackt
  76. ***********************************************************************/
  77. QT.Settings = {
  78. values : {
  79. "script_version" : QT_scriptMeta.script.version,
  80. "messageOpenAlert" : true,
  81. "startFunction" : true,
  82. },
  83. save_all : function (values) {
  84. setTimeout(function () {
  85. var keys = GM_listValues();
  86. console.log(keys);
  87. for (key in QT.Settings.values) {
  88. if (key != "qmenu_update_next" && key != "qmenu_online_version" && key != "onlinetotal") {
  89. if (key in values) {
  90. GM_setValue(key, values[key]);
  91. } else {
  92. GM_deleteValue(key);
  93. }
  94. }
  95. }
  96. }, 0);
  97. window.location.reload();
  98. },
  99. reset_all : function () {
  100. setTimeout(function () {
  101. var keys = GM_listValues();
  102. for (var i = 0, key = null; key = keys[i]; i++) {
  103. GM_deleteValue(key);
  104. }
  105. }, 0);
  106. window.location.reload();
  107. },
  108. load_all : function () {
  109. setTimeout(function () {
  110. var keys = GM_listValues();
  111. for (var i = 0, key = null; key = keys[i]; i++) {
  112. QT.Settings.values[key] = GM_getValue(key);
  113. }
  114. }, 0);
  115. }
  116. };
  117. /************************************************************************
  118. * Ajax Call functions
  119. - 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
  120. Beispiel: http://de52.grepolis.com/game/message?town_id=19268&action=default
  121. - Hier überprüfe ich auch, ob ein Skript laut Einstellungen überhaupt gestartet werden darf
  122. ***********************************************************************/
  123. QT.CallAjaxFunction = {
  124. message : {
  125. default : function (event, xhr, settings) {
  126. if (QT.Settings.values.messageOpenAlert)
  127. QT.Functions.messageOpenAlert();
  128. }
  129. }
  130. };
  131. /************************************************************************
  132. * Functions
  133. - Hier kommen alle Funktionen rein, die beim Start des Skriptes oder durch einen Ajax Call aufgerufen werden
  134. ***********************************************************************/
  135. QT.Functions = {
  136. messageOpenAlert : function () {
  137. alert("Die Nachrichten wurden geöffnet");
  138. },
  139. someStartFunction : function () {
  140. console.log("Irgendwas wurde erfolgreich nach dem fertigen Laden von Grepolis ausgeführt");
  141. },
  142. testButtons : function () {
  143. $('#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>');
  144. $("#qt_messageOpenAlert").click(function () {
  145. //GM_setValue("test","Der Test klappt!");
  146. var valuesToSave = {};
  147. valuesToSave.messageOpenAlert = false;
  148. QT.Settings.save_all(valuesToSave);
  149. });
  150. $("#qt_listValues").click(function () {
  151. console.log(GM_listValues());
  152. });
  153. $("#qt_delete").click(function () {
  154. //GM_deleteValue("test");
  155. QT.Settings.reset_all();
  156. });
  157. $("#qt_scriptVersion").click(function () {
  158. alert(QT.Settings.values.script_version);
  159. });
  160. }
  161. };
  162. /************************************************************************
  163. * Load Settings + Observer
  164. - Erst werden alle Einstellungen geladen
  165. - Dann meldet sich der Observer und die alle startup Funktionen können aufgerufen werden
  166. - Genauso wie $(document).ajaxComplete
  167. Bei mir wird eine Funktionen direkt aufgerufen - also nicht wie bei der case Variante
  168. Im Beispiel: QT.CallAjaxFunction["message"]["default"](event, xhr, settings);
  169. QT.CallAjaxFunction [b] [c] (event, xhr, settings);
  170. - Was vielleicht passieren könnte wäre, dass die Settings nicht schnell genau geladen werden und der Start von Grepolis eher abgeschlossen ist
  171. Das Ganze passiert, weil der Inhalt der QT.Settings.load_all() Funktion in ein setTimout eingewickelt ist.
  172. 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...
  173. ***********************************************************************/
  174. QT.Settings.load_all();
  175. $.Observer(GameEvents.game.load).subscribe('QT', function (e, data) {
  176. if (QT.Settings.values.startFunction)
  177. QT.Functions.someStartFunction();
  178. QT.Functions.testButtons();
  179. $(document).ajaxComplete(function (event, xhr, settings) {
  180. var a = settings.url.split("?");
  181. var b = a[0].substr(6);
  182. var c = a[1].split("&")[1].substr(7);
  183. if (b in QT.CallAjaxFunction && c in QT.CallAjaxFunction[b]) {
  184. QT.CallAjaxFunction[b][c](event, xhr, settings);
  185. }
  186. });
  187. });
  188. }
  189.  
  190. /************************************************************************
  191. * Starting method
  192. - Für den Firefox werden die GM API Funktionen exportiert und main_script in den head Bereich der Seite eingefügt
  193. 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
  194. - Da GM_info ein Objekt ist und keine Funktion, muss die mit cloneInto exportiert werden
  195. GM_info brauchste ja vielleicht auch gar nicht - ich benutze das halt für meinen Updater
  196. - Für Chrome braucht einfach nur das main_script ausgeführt zu werden.
  197. Zuvor deklariere ich noch QT_scriptMeta und haue da das GM_info Objekt rein.
  198. Der QT.Settings.values.script_version Eintrag kann ja sonst nicht auf die Skript Version zugreifen
  199. ***********************************************************************/
  200. if (typeof cloneInto != "undefined") { // Firefox
  201. exportFunction(GM_listValues, unsafeWindow, {defineAs: "GM_listValues"});
  202. exportFunction(GM_getValue, unsafeWindow, {defineAs: "GM_getValue"});
  203. exportFunction(GM_setValue, unsafeWindow, {defineAs: "GM_setValue"});
  204. exportFunction(GM_deleteValue, unsafeWindow, {defineAs: "GM_deleteValue"});
  205. exportFunction(GM_xmlhttpRequest, unsafeWindow, {defineAs: "GM_xmlhttpRequest"});
  206. unsafeWindow.QT_scriptMeta = cloneInto(GM_info, unsafeWindow);
  207. var s = document.createElement('script');
  208. s.type = 'text/javascript';
  209. s.textContent = main_script.toString() + "\n main_script();";
  210. document.head.appendChild(s);
  211. } else { // Chrome + Opera
  212. var QT_scriptMeta = GM_info;
  213. main_script();
  214. }
  215.