| f | // ==UserScript== | f | // ==UserScript== |
| // @name Farmmanager-Erweiterung | | // @name Farmmanager-Erweiterung |
| n | // @description Berichte können mit einem Klick in den Farmmanager ei | n | // @description (Version 1.0) Berichte können mit einem Tastendruck i |
| ngelesen werden | | n den Farmmanager eingelesen werden |
| // @author bmaker (Robert N.) | | // @author bmaker (Robert N.) |
| // @namespace files.robertnitsch.de | | // @namespace files.robertnitsch.de |
| // @include http://*.die-staemme.de/game.php?*screen=report*view=* | | // @include http://*.die-staemme.de/game.php?*screen=report*view=* |
| n | | n | // @include http://*.die-staemme.de/game.php?*view=*screen=report*
|
| // ==/UserScript== | | // ==/UserScript== |
| | | |
| n | | n | /* KONFIGURATION */
|
| | |
|
| | | // Hier eine Liste der möglichen Tasten-Codes: http://www.webonweboff |
| | | .com/tips/js/event_key_codes.aspx
|
| | | // Für die einfachen Buchstaben-Tasten gilt: A = 65, B = 66, C = 67, |
| | | ..., Y = 89, Z = 90
|
| | |
|
| | | // Um einen Hotkey ganz zu deaktivieren einfach -1 eintragen
|
| | |
|
| | | // Beschreibung: mit diesem Hotkey wird der Bericht einfach nur ei |
| | | ngelesen
|
| | | // Standard: 69 (Taste 'e')
|
| | | // Gültige Werte: 0 - 255 sowie -1 für Deaktivierung
|
| | | var parse_hotkey = 69; // 69 <=> e
|
| | |
|
| | | // Beschreibung: mit diesem Hotkey wird der Bericht eingelesen und |
| | | bei Erfolg gelöscht
|
| | | // Standard: -1
|
| | | // Gültige Werte: 0 - 255 sowie -1 für Deaktivierung
|
| | | var parse_and_delete_hotkey = -1;
|
| | |
|
| | | // Beschreibung: Die "Bericht erfolgreich eingelesen"-Meldung MIT |
| | | Popup lässt sich hiermit ein- bzw. abschalten
|
| | | // Davon ist die Meldung OHNE Popup nicht betroffen, |
| | | diese wird IMMER angezeigt.
|
| | | // Standard: false
|
| | | // Gültige Werte: true, false
|
| | | var show_success_popup = false;
|
| | |
|
| | | // Beschreibung: debug-Modus. Sollte man einfach anlassen.
|
| | | // Standard: true
|
| | | // Gültige Werte: true, false
|
| | | var debug = true;
|
| | |
|
| | | /* /KONFIGURATION */
|
| | |
|
| | |
|
| | |
|
| | |
|
| | | // ################################
|
| | | // AB HIER NICHTS MEHR VERÄNDERN!!!
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | | /*
|
| | | Changelog:
|
| | | Version 1.0 (26.02.2010):
|
| | | - Beginn der Versionierung (bisherige Versionen waren unversioni |
| | | ert)
|
| | | - jetzt kompatibel zu Version 6.0 (insbesondere also Welt 55/56) |
| | |
|
| | | - man kann jetzt die Tasten zum Einlesen selbst definieren
|
| | | - es gibt jetzt einen zusätzlichen Hotkey, der den Bericht nach |
| | | erfolgreichem Einlesen automatisch löscht (Tom)
|
| | | - es wird jetzt direkt über dem Bericht angezeigt, wenn er erfo |
| | | lgreich eingelesen wurde (ohne Popup)
|
| | | - die bisherige Erfolgs-Meldung (mit Popup) ist nun standardmäà |
| | | Ÿig deaktiviert (skydeath)
|
| | | - besseres Verhalten bei falsch eingegebener Farmmanager-ID
|
| | | - einige kleinere Verbesserungen, zum Beispiel werden jetzt viel |
| | | mehr Details preisgegeben, wenn etwas schief läuft
|
| | |
|
| | | */
|
| | |
|
| | |
|
| /* Reguläre Ausdrücke */ | | /* Reguläre Ausdrücke */ |
| n | regex_world = /http:\/\/([0-9a-z]+)\.die\-staemme\.de/; | n | regex_world = /http:\/\/([0-9a-z]+)\.die\-staemme\.de/i; |
| | | regex_id = /^[0-9a-zA-Z]{10}$/;
|
| | | regex_delete = /L.{1,2}schen/;
|
| | | |
| /* Funktionen */ | | /* Funktionen */ |
| | | |
| // Gibt das Kürzel der Welt zurück, auf der der Benutzer spielt | | // Gibt das Kürzel der Welt zurück, auf der der Benutzer spielt |
| // Beispiel: de14 | | // Beispiel: de14 |
| function _getWorld() { | | function _getWorld() { |
| match = document.URL.match(regex_world); | | match = document.URL.match(regex_world); |
| if(match) { | | if(match) { |
| return match[1]; | | return match[1]; |
| } | | } |
| return false; | | return false; |
| } | | } |
| | | |
| // Gibt die ID des Farmmanagers zurück, die der Benutzer eingestellt | | // Gibt die ID des Farmmanagers zurück, die der Benutzer eingestellt |
| hat. | | hat. |
| // Wenn der Benutzer die ID noch nicht eingestellt hat, wird er dazu a | | // Wenn der Benutzer die ID noch nicht eingestellt hat, wird er dazu a |
| ufgefordert, seine ID | | ufgefordert, seine ID |
| // anzugeben. | | // anzugeben. |
| function _getFarmmanagerID(world) { | | function _getFarmmanagerID(world) { |
| id = GM_getValue('fm_id_'+world, false); | | id = GM_getValue('fm_id_'+world, false); |
| if(id === false) { | | if(id === false) { |
| id = prompt('Bitte gib die ID zu deinem Farmmanager (für Welt | | id = prompt('Bitte gib die ID zu deinem Farmmanager (für Welt |
| '+world+') ein!'); | | '+world+') ein!'); |
| n | | n |
|
| | | if(id.match(regex_id))
|
| GM_setValue('fm_id_'+world, id); | | GM_setValue('fm_id_'+world, id); |
| | | else
|
| | | return -2;
|
| } | | } |
| n | return id;
| n |
|
| | | if(String(id).match(regex_id))
|
| | | return id;
|
| | | else
|
| | | return -1;
|
| } | | } |
| | | |
| // Gibt den _vollständigen_ Textinhalt eines DOM-Elements zurück, | | // Gibt den _vollständigen_ Textinhalt eines DOM-Elements zurück, |
| // also auch die Textinhalte aller Subelemente. Die Textinhalte der je | | // also auch die Textinhalte aller Subelemente. Die Textinhalte der je |
| weiligen Elemente | | weiligen Elemente |
| // werden durch delimeter getrennt. (Es bietet sich ein Leerzeichen an | | // werden durch delimeter getrennt. (Es bietet sich ein Leerzeichen an |
| .) | | .) |
| function _getNodeTextRecursively(node, delimeter) { | | function _getNodeTextRecursively(node, delimeter) { |
| var result = ''; | | var result = ''; |
| if(node.nodeType == 3) { | | if(node.nodeType == 3) { |
| if(node.nodeValue && !node.nodeValue.match(/^\s+$/)) { | | if(node.nodeValue && !node.nodeValue.match(/^\s+$/)) { |
| result += _trim(node.nodeValue)+delimeter; | | result += _trim(node.nodeValue)+delimeter; |
| } | | } |
| } | | } |
| if(node.hasChildNodes()) { | | if(node.hasChildNodes()) { |
| for(var k=0; k<node.childNodes.length; k++) { | | for(var k=0; k<node.childNodes.length; k++) { |
| result += _getNodeTextRecursively(node.childNodes[k], deli | | result += _getNodeTextRecursively(node.childNodes[k], deli |
| meter); | | meter); |
| } | | } |
| } | | } |
| return result; | | return result; |
| } | | } |
| | | |
| // Entfernt Whitespaces am Anfang und am Ende eines Strings. | | // Entfernt Whitespaces am Anfang und am Ende eines Strings. |
| function _trim (str) { | | function _trim (str) { |
| return str.replace (/^\s+/, '').replace (/\s+$/, ''); | | return str.replace (/^\s+/, '').replace (/\s+$/, ''); |
| } | | } |
| | | |
| n | | n | // Setzt die intern gespeicherte Farmmanager-ID (wegen Ungültigkeit) |
| | | zurück und setzt
|
| | | // den Benutzer darüber in Kenntnis, dass er beim nächsten Einlesen |
| | | die korrekte ID bereit halten soll.
|
| | | function _invalidID() {
|
| | | alert("Die gespeicherte Farmmanager-ID ist ungültig. "+
|
| | | "Wenn du das nächste Mal versuchst einen Bericht einzulesen |
| | | wirst du aufgefordert die richtige ID einzulesen!\n\n"+
|
| | | "Bitte halte dann die korrekte Farmmanager-ID zu diesem Zwec |
| | | k bereit.");
|
| | | GM_setValue('fm_id_'+world, false);
|
| | | }
|
| | |
|
| | | // Löscht den aktuell geöffneten Bericht, indem der "Löschen"-Link |
| | | aufgerufen wird
|
| | | function _deleteReport() {
|
| | | var as = document.getElementsByTagName('a');
|
| | | var a = false;
|
| | |
|
| | | // alle Links auf der Seite durchgehen
|
| | | for(var i=0; i<as.length; i++) {
|
| | | try {
|
| | | if(as[i].firstChild.nodeValue.match(regex_delete)) {
|
| | | a = as[i];
|
| | | break;
|
| | | }
|
| | | } catch(e) { /* fu */ };
|
| | | }
|
| | |
|
| | | // der Löschen-Link wurde nicht gefunden
|
| | | if(a === false) {
|
| | | alert("Kann diesen Bericht nicht löschen!");
|
| | | return -1;
|
| | | }
|
| | |
|
| | | // dem Löschen-Link folgen
|
| | | var delLink = a.getAttribute("href");
|
| | | location.href = delLink;
|
| | | }
|
| | |
|
| | | function _showHTMLSuccessMessage() {
|
| | | // Normale Methode
|
| | | try {
|
| | | document.getElementById("content_value").firstChild.firstChild |
| | | .nodeValue =
|
| | | "Bericht erfolgreich eingelesen!";
|
| | | GM_log("Normaler HTML-Hinweis mit document.getElementById(\"co |
| | | ntent_value\") hat funktioniert.");
|
| | |
|
| | | return;
|
| | | }
|
| | | catch(e) {
|
| | | GM_log("HTML-Hinweis mit document.getElementById(\"content_val |
| | | ue\") hat nicht funktioniert");
|
| | | }
|
| | |
|
| | | // 1. Backup
|
| | | try {
|
| | | var h2s = document.getElementsByTagName("h2");
|
| | | h2s[0].firstChild.nodeValue = "Bericht erfolgreich eingelesen! |
| | | ";
|
| | | GM_log("1. Backup-HTML-Hinweis mit document.getElementsByTagNa |
| | | me(\"h2\")[0] hat funktioniert");
|
| | |
|
| | | return;
|
| | | }
|
| | | catch(e) {
|
| | | GM_log("1. Backup-HTML-Hinweis mit document.getElementsByTagNa |
| | | me(\"h2\")[0] hat ebenfalls nicht funktioniert.");
|
| | | }
|
| | |
|
| | | GM_log("Konnte HTML-Hinweis nicht anzeigen.");
|
| | |
|
| | | // Ausweich-Methode ist der (ehemalige) Standardhinweis, aber nur, |
| | | wenn dieser abgeschaltet ist
|
| | | if(!show_success_popup)
|
| | | alert("Bericht erfolgreich eingelesen!\n\n(Der Hinweis OHNE Po |
| | | pup konnte nicht angezeigt werden.)");
|
| | | }
|
| | |
|
| /* Hauptskript */ | | /* Hauptskript */ |
| function main() { | | function main() { |
| world = _getWorld(); | | world = _getWorld(); |
| id = _getFarmmanagerID(world); | | id = _getFarmmanagerID(world); |
| n |
| n |
|
| | | if(id == -2) {
|
| | | alert("Du hast eine ungültige Farmmanager-ID angegeben! Probi |
| | | ere es nochmal!");
|
| | | return;
|
| | | }
|
| | | else if(id == -1) {
|
| | | _invalidID();
|
| | | return;
|
| | | }
|
| | |
|
| tables = document.getElementsByTagName('table'); | | tables = document.getElementsByTagName('table'); |
| table = false; | | table = false; |
| n | for(i=0; i<tables.length; i++) { | n | for(var i=0; i<tables.length; i++) { |
| if(tables[i].getAttribute('width') == '450') { | | if(tables[i].getAttribute('width') == '450') { |
| table = tables[i]; | | table = tables[i]; |
| break; | | break; |
| } | | } |
| } | | } |
| | | |
| n | | n | if(table == false) {
|
| | | alert("Konnte den Bericht nicht finden.\n\nWahrscheinlich gibt |
| | | es ein Problem mit einem anderen installierten Greasemonkey-Skript!") |
| | | ;
|
| | | }
|
| | |
|
| // den Bericht parsen | | // den Bericht parsen |
| report = _getNodeTextRecursively(table, " "); | | report = _getNodeTextRecursively(table, " "); |
| report = report.replace(/([0-9]+)\s\.\s([0-9]+)/g, '$1.$2'); | | report = report.replace(/([0-9]+)\s\.\s([0-9]+)/g, '$1.$2'); |
| | | |
| //alert(report); | | //alert(report); |
| | | |
| // herausfinden, welche Ressourcen gespäht wurden | | // herausfinden, welche Ressourcen gespäht wurden |
| var wood = 'no'; | | var wood = 'no'; |
| var loam = 'no'; | | var loam = 'no'; |
| var iron = 'no'; | | var iron = 'no'; |
| ths = table.getElementsByTagName('th'); | | ths = table.getElementsByTagName('th'); |
| for(var i=0; i<ths.length; i++) { | | for(var i=0; i<ths.length; i++) { |
| if(!ths[i].firstChild) | | if(!ths[i].firstChild) |
| continue; | | continue; |
| if(!ths[i].firstChild.nodeValue) | | if(!ths[i].firstChild.nodeValue) |
| continue; | | continue; |
| | | |
| if(ths[i].firstChild.nodeValue.match(/Ersp.{1,2}hte\s+Rohstoff | | if(ths[i].firstChild.nodeValue.match(/Ersp.{1,2}hte\s+Rohstoff |
| e:/)) { | | e:/)) { |
| GM_log('"Erspähte Rohstoffe:" gefunden!'); | | GM_log('"Erspähte Rohstoffe:" gefunden!'); |
| imgs = ths[i].nextSibling.getElementsByTagName('img'); | | imgs = ths[i].nextSibling.getElementsByTagName('img'); |
| for(var j=0; j<imgs.length; j++) { | | for(var j=0; j<imgs.length; j++) { |
| n | GM_log("test: "+imgs[j].getAttribute('title')); | n | //GM_log("test: "+imgs[j].getAttribute('title')); |
| if(imgs[j].getAttribute('title') == 'Holz') | | if(imgs[j].getAttribute('title') == 'Holz') |
| wood = 'yes'; | | wood = 'yes'; |
| else if(imgs[j].getAttribute('title') == 'Lehm') | | else if(imgs[j].getAttribute('title') == 'Lehm') |
| loam = 'yes'; | | loam = 'yes'; |
| else if(imgs[j].getAttribute('title') == 'Eisen') | | else if(imgs[j].getAttribute('title') == 'Eisen') |
| iron = 'yes'; | | iron = 'yes'; |
| } | | } |
| | | |
| break; | | break; |
| } | | } |
| } | | } |
| | | |
| GM_log("Gespähte Rohstoffe - Holz: "+wood+" Lehm: "+loam+" Eisen: | | GM_log("Gespähte Rohstoffe - Holz: "+wood+" Lehm: "+loam+" Eisen: |
| "+iron); | | "+iron); |
| | | |
| // den Bericht abschicken bzw. einlesen | | // den Bericht abschicken bzw. einlesen |
| GM_xmlhttpRequest({ | | GM_xmlhttpRequest({ |
| method: 'POST', | | method: 'POST', |
| url: 'http://np.bmaker.net/tools/farmmanager.php?id='+id, | | url: 'http://np.bmaker.net/tools/farmmanager.php?id='+id, |
| headers: { | | headers: { |
| 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey', | | 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey', |
| 'Accept': 'application/atom+xml,application/xml,text/xml', | | 'Accept': 'application/atom+xml,application/xml,text/xml', |
| | | |
| 'Content-type': 'application/x-www-form-urlencoded', | | 'Content-type': 'application/x-www-form-urlencoded', |
| }, | | }, |
| data: encodeURI('ajax=1&report='+report+'&wood='+wood+'&loam=' | | data: encodeURI('ajax=1&report='+report+'&wood='+wood+'&loam=' |
| +loam+'&iron='+iron+'¬e=&parse=1'), | | +loam+'&iron='+iron+'¬e=&parse=1'), |
| onload: function(responseDetails) { | | onload: function(responseDetails) { |
| n | if(responseDetails.status == 200)
| n | try {
|
| alert('Der Berichte wurde erfolgreich an den F | | //var responseXML = new DOMParser().parseFromS |
| armmanager geschickt!');
| | tring(responseDetails.responseText, "text/xml");
|
| | | //alert(responseXML.getElementsByTagName('mess |
| | | age')[0].firstChild.nodeValue);
|
| | | var success = responseDetails.responseText.mat |
| | | ch(/erfolgreich eingelesen/i);
|
| | |
|
| | | // das "Bericht wurde erfolgreich eingelesen"- |
| | | Popup soll nur angezeigt werden,
|
| | | // wenn der Benutzer das so in der Konfigurati |
| | | on festgelegt hat.
|
| | | // Fehlermeldungen werden nach wie vor IMMER i |
| | | n dem Popup angezeigt.
|
| | | if(!success || show_success_popup) {
|
| | | alert(responseDetails.responseText);
|
| | | }
|
| | |
|
| | | // Bei Erfolg soll eine Erfolgsmeldung in der |
| | | Seite erscheinen.
|
| | | if(success && !parsed) {
|
| | | parsed = true;
|
| | | _showHTMLSuccessMessage();
|
| | | }
|
| | |
|
| | | // Hat Nopaste gemeldet, dass es diesen Farmma |
| | | nager gar nicht gibt?
|
| | | // => Zurücksetzen der ID
|
| | | if(responseDetails.responseText.match(/Farmman |
| | | ager nicht gefunden/i)) {
|
| | | _invalidID();
|
| | | }
|
| | |
|
| | | // Hat Nopaste einen Fehler gleich welcher Art |
| | | gemeldet?
|
| | | // => Dann jetzt abbrechen, denn ein paar Zeil |
| | | en später kommt das automatische Löschen
|
| | | // und das wäre ungünstig im Falle eines |
| | | Fehlers (weil der Bericht dann unwiderruflich verloren ist).
|
| | | if(responseDetails.responseText.match(/Fehler/ |
| | | ))
|
| | | return;
|
| | | } catch(e) {
|
| | | alert("Der Bericht wurde abgeschickt, aber die |
| | | Antwort von NoPaste konnte nicht vollständig ausgewertet werden.\n\n |
| | | "+
|
| | | "Die genaue Fehlermeldung lautet: \n"+e+ |
| | |
|
| | | "\n\nDie genaue Antwort von NoPaste laut |
| | | et: \n"+responseDetails.responseText);
|
| | | return;
|
| | | }
|
| else | | |
| alert('Es ist ein Fehler aufgetreten. Bitte ve | | // Automatisches Löschen des Berichts?
|
| rsuche, den Bericht selbst einzulesen!');
| | |
| | | if(delete_after_parsing)
|
| | | _deleteReport();
|
| } | | } |
| }); | | }); |
| n | | n |
|
| | | return 0;
|
| } | | } |
| | | |
| n | // Wenn die Taste E gedrückt wird, soll das Skript aufgerufen bzw. de | n | // globale Variablen
|
| r Bericht eingelesen werden.
| | |
| | | var delete_after_parsing = false;
|
| | | var parsed = false;
|
| | |
|
| | | // Hotkeys...
|
| document.addEventListener("keydown", function(evt) { | | document.addEventListener("keydown", function(evt) { |
| n | | n | // wurde einer der beiden Hotkeys gedrückt?
|
| if(evt.keyCode==69) { | | if(evt.keyCode == parse_hotkey) { |
| | | delete_after_parsing = false;
|
| | | }
|
| | | else if(evt.keyCode == parse_and_delete_hotkey) {
|
| | | delete_after_parsing = true;
|
| | | }
|
| | | else {
|
| | | return;
|
| | | }
|
| | |
|
| | | // sollen alle Fehlermeldungen gemeldet werden?
|
| | | if(debug) {
|
| | | try { main() } catch(e) { alert("Fehler: " + e); }
|
| | | }
|
| | | else {
|
| main(); | | main(); |
| } | | } |
| t | }, false); | t | }, false);
|