f1// ==UserScript==f1// ==UserScript==
2// @name Farmmanager-Erweiterung2// @name Farmmanager-Erweiterung
n3// @description Berichte können mit einem Klick in den Farmmanager ein3// @description (Version 1.0) Berichte können mit einem Tastendruck i
>ngelesen werden>n den Farmmanager eingelesen werden
4// @author bmaker (Robert N.)4// @author bmaker (Robert N.)
5// @namespace files.robertnitsch.de5// @namespace files.robertnitsch.de
6// @include http://*.die-staemme.de/game.php?*screen=report*view=*6// @include http://*.die-staemme.de/game.php?*screen=report*view=*
nn7// @include http://*.die-staemme.de/game.php?*view=*screen=report*
7// ==/UserScript==8// ==/UserScript==
89
nn10/*  KONFIGURATION */
11
12// Hier eine Liste der möglichen Tasten-Codes: http://www.webonweboff
 >.com/tips/js/event_key_codes.aspx
13// Für die einfachen Buchstaben-Tasten gilt: A = 65, B = 66, C = 67, 
 >..., Y = 89, Z = 90
14
15// Um einen Hotkey ganz zu deaktivieren einfach -1 eintragen
16
17    // Beschreibung: mit diesem Hotkey wird der Bericht einfach nur ei
 >ngelesen
18    // Standard: 69 (Taste 'e')
19    // Gültige Werte: 0 - 255 sowie -1 für Deaktivierung
20    var parse_hotkey = 69;              // 69 <=> e
21
22    // Beschreibung: mit diesem Hotkey wird der Bericht eingelesen und
 > bei Erfolg gelöscht
23    // Standard: -1
24    // Gültige Werte: 0 - 255 sowie -1 für Deaktivierung
25    var parse_and_delete_hotkey = -1;
26
27    // Beschreibung: Die "Bericht erfolgreich eingelesen"-Meldung MIT 
 >Popup lässt sich hiermit ein- bzw. abschalten
28    //               Davon ist die Meldung OHNE Popup nicht betroffen,
 > diese wird IMMER angezeigt.
29    // Standard: false
30    // Gültige Werte: true, false
31    var show_success_popup = false;
32
33    // Beschreibung: debug-Modus. Sollte man einfach anlassen.
34    // Standard: true
35    // Gültige Werte: true, false
36    var debug = true;
37
38/* /KONFIGURATION */
39
40
41
42
43// ################################
44// AB HIER NICHTS MEHR VERÄNDERN!!!
45
46
47
48
49
50/*
51  Changelog:
52    Version 1.0 (26.02.2010):
53      - Beginn der Versionierung (bisherige Versionen waren unversioni
 >ert)
54      - jetzt kompatibel zu Version 6.0 (insbesondere also Welt 55/56)
 >
55      - man kann jetzt die Tasten zum Einlesen selbst definieren
56      - es gibt jetzt einen zusätzlichen Hotkey, der den Bericht nach
 > erfolgreichem Einlesen automatisch löscht (Tom)
57      - es wird jetzt direkt Ã¼ber dem Bericht angezeigt, wenn er erfo
 >lgreich eingelesen wurde (ohne Popup)
58      - die bisherige Erfolgs-Meldung (mit Popup) ist nun standardmäÃ
 >Ÿig deaktiviert (skydeath)
59      - besseres Verhalten bei falsch eingegebener Farmmanager-ID
60      - einige kleinere Verbesserungen, zum Beispiel werden jetzt viel
 > mehr Details preisgegeben, wenn etwas schief läuft
61
62*/
63
64
9/* Reguläre Ausdrücke */65/* Reguläre Ausdrücke */
n10regex_world = /http:\/\/([0-9a-z]+)\.die\-staemme\.de/;n66regex_world = /http:\/\/([0-9a-z]+)\.die\-staemme\.de/i;
67regex_id = /^[0-9a-zA-Z]{10}$/;
68regex_delete = /L.{1,2}schen/;
1169
12/* Funktionen */70/* Funktionen */
1371
14// Gibt das Kürzel der Welt zurück, auf der der Benutzer spielt72// Gibt das Kürzel der Welt zurück, auf der der Benutzer spielt
15// Beispiel: de1473// Beispiel: de14
16function _getWorld() {74function _getWorld() {
17    match = document.URL.match(regex_world);75    match = document.URL.match(regex_world);
18    if(match) {76    if(match) {
19        return match[1];77        return match[1];
20    }78    }
21    return false;79    return false;
22}80}
2381
24// Gibt die ID des Farmmanagers zurück, die der Benutzer eingestellt 82// Gibt die ID des Farmmanagers zurück, die der Benutzer eingestellt 
>hat.>hat.
25// Wenn der Benutzer die ID noch nicht eingestellt hat, wird er dazu a83// Wenn der Benutzer die ID noch nicht eingestellt hat, wird er dazu a
>ufgefordert, seine ID>ufgefordert, seine ID
26// anzugeben.84// anzugeben.
27function _getFarmmanagerID(world) {85function _getFarmmanagerID(world) {
28    id = GM_getValue('fm_id_'+world, false);86    id = GM_getValue('fm_id_'+world, false);
29    if(id === false) {87    if(id === false) {
30        id = prompt('Bitte gib die ID zu deinem Farmmanager (für Welt88        id = prompt('Bitte gib die ID zu deinem Farmmanager (für Welt
> '+world+') ein!');> '+world+') ein!');
nn89        
90        if(id.match(regex_id))
31        GM_setValue('fm_id_'+world, id);91            GM_setValue('fm_id_'+world, id);
92        else
93            return -2;
32    }94    }
n33    return id; n95    
96    if(String(id).match(regex_id))
97        return id;
98    else
99        return -1;
34}100}
35101
36// Gibt den _vollständigen_ Textinhalt eines DOM-Elements zurück,102// Gibt den _vollständigen_ Textinhalt eines DOM-Elements zurück,
37// also auch die Textinhalte aller Subelemente. Die Textinhalte der je103// also auch die Textinhalte aller Subelemente. Die Textinhalte der je
>weiligen Elemente>weiligen Elemente
38// werden durch delimeter getrennt. (Es bietet sich ein Leerzeichen an104// werden durch delimeter getrennt. (Es bietet sich ein Leerzeichen an
>.)>.)
39function _getNodeTextRecursively(node, delimeter) {105function _getNodeTextRecursively(node, delimeter) {
40    var result = '';106    var result = '';
41    if(node.nodeType == 3) {107    if(node.nodeType == 3) {
42        if(node.nodeValue && !node.nodeValue.match(/^\s+$/)) {108        if(node.nodeValue && !node.nodeValue.match(/^\s+$/)) {
43            result += _trim(node.nodeValue)+delimeter;109            result += _trim(node.nodeValue)+delimeter;
44        }110        }
45    }111    }
46    if(node.hasChildNodes()) {112    if(node.hasChildNodes()) {
47        for(var k=0; k<node.childNodes.length; k++) {113        for(var k=0; k<node.childNodes.length; k++) {
48            result += _getNodeTextRecursively(node.childNodes[k], deli114            result += _getNodeTextRecursively(node.childNodes[k], deli
>meter);>meter);
49        }115        }
50    }116    }
51    return result;117    return result;
52}118}
53119
54// Entfernt Whitespaces am Anfang und am Ende eines Strings.120// Entfernt Whitespaces am Anfang und am Ende eines Strings.
55function _trim (str) {121function _trim (str) {
56    return str.replace (/^\s+/, '').replace (/\s+$/, '');122    return str.replace (/^\s+/, '').replace (/\s+$/, '');
57}123}
58124
nn125// Setzt die intern gespeicherte Farmmanager-ID (wegen Ungültigkeit) 
 >zurück und setzt
126// den Benutzer darüber in Kenntnis, dass er beim nächsten Einlesen 
 >die korrekte ID bereit halten soll.
127function _invalidID() {
128    alert("Die gespeicherte Farmmanager-ID ist ungültig. "+
129          "Wenn du das nächste Mal versuchst einen Bericht einzulesen
 > wirst du aufgefordert die richtige ID einzulesen!\n\n"+
130          "Bitte halte dann die korrekte Farmmanager-ID zu diesem Zwec
 >k bereit.");
131    GM_setValue('fm_id_'+world, false);
132}
133
134// Löscht den aktuell geöffneten Bericht, indem der "Löschen"-Link 
 >aufgerufen wird
135function _deleteReport() {
136    var as = document.getElementsByTagName('a');
137    var a = false;
138    
139    // alle Links auf der Seite durchgehen
140    for(var i=0; i<as.length; i++) {
141        try {
142            if(as[i].firstChild.nodeValue.match(regex_delete)) {
143                a = as[i];
144                break;
145            }
146        } catch(e) { /* fu */ };
147    }
148    
149    // der Löschen-Link wurde nicht gefunden
150    if(a === false) {
151        alert("Kann diesen Bericht nicht löschen!");
152        return -1;
153    }
154    
155    // dem Löschen-Link folgen
156    var delLink = a.getAttribute("href");
157    location.href = delLink;
158}
159
160function _showHTMLSuccessMessage() {
161    // Normale Methode
162    try {
163        document.getElementById("content_value").firstChild.firstChild
 >.nodeValue = 
164            "Bericht erfolgreich eingelesen!";
165        GM_log("Normaler HTML-Hinweis mit document.getElementById(\"co
 >ntent_value\") hat funktioniert.");
166        
167        return;
168    }
169    catch(e) {
170        GM_log("HTML-Hinweis mit document.getElementById(\"content_val
 >ue\") hat nicht funktioniert");
171    }
172    
173    // 1. Backup
174    try {
175        var h2s = document.getElementsByTagName("h2");
176        h2s[0].firstChild.nodeValue = "Bericht erfolgreich eingelesen!
 >";
177        GM_log("1. Backup-HTML-Hinweis mit document.getElementsByTagNa
 >me(\"h2\")[0] hat funktioniert");
178        
179        return;
180    }
181    catch(e) {
182        GM_log("1. Backup-HTML-Hinweis mit document.getElementsByTagNa
 >me(\"h2\")[0] hat ebenfalls nicht funktioniert.");
183    }
184    
185    GM_log("Konnte HTML-Hinweis nicht anzeigen.");
186    
187    // Ausweich-Methode ist der (ehemalige) Standardhinweis, aber nur,
 > wenn dieser abgeschaltet ist
188    if(!show_success_popup)
189        alert("Bericht erfolgreich eingelesen!\n\n(Der Hinweis OHNE Po
 >pup konnte nicht angezeigt werden.)");
190}
191
59/* Hauptskript */192/* Hauptskript */
60function main() {193function main() {
61    world = _getWorld();194    world = _getWorld();
62    id = _getFarmmanagerID(world);195    id = _getFarmmanagerID(world);
n63 n196    
197    if(id == -2) {
198        alert("Du hast eine ungültige Farmmanager-ID angegeben! Probi
 >ere es nochmal!");
199        return;
200    }
201    else if(id == -1) {
202        _invalidID();
203        return;
204    }
205    
64    tables = document.getElementsByTagName('table');206    tables = document.getElementsByTagName('table');
65    table = false;207    table = false;
n66    for(i=0; i<tables.length; i++) {n208    for(var i=0; i<tables.length; i++) {
67        if(tables[i].getAttribute('width') == '450') {209        if(tables[i].getAttribute('width') == '450') {
68            table = tables[i];210            table = tables[i];
69            break;211            break;
70        }212        }
71    }213    }
72214
nn215    if(table == false) {
216        alert("Konnte den Bericht nicht finden.\n\nWahrscheinlich gibt
 > es ein Problem mit einem anderen installierten Greasemonkey-Skript!")
 >;
217    }
218    
73    // den Bericht parsen219    // den Bericht parsen
74    report = _getNodeTextRecursively(table, " ");220    report = _getNodeTextRecursively(table, " ");
75    report = report.replace(/([0-9]+)\s\.\s([0-9]+)/g, '$1.$2');221    report = report.replace(/([0-9]+)\s\.\s([0-9]+)/g, '$1.$2');
76    222    
77    //alert(report);223    //alert(report);
78    224    
79    // herausfinden, welche Ressourcen gespäht wurden225    // herausfinden, welche Ressourcen gespäht wurden
80    var wood = 'no';226    var wood = 'no';
81    var loam = 'no';227    var loam = 'no';
82    var iron = 'no';228    var iron = 'no';
83    ths = table.getElementsByTagName('th');229    ths = table.getElementsByTagName('th');
84    for(var i=0; i<ths.length; i++) {230    for(var i=0; i<ths.length; i++) {
85        if(!ths[i].firstChild)231        if(!ths[i].firstChild)
86            continue;232            continue;
87        if(!ths[i].firstChild.nodeValue)233        if(!ths[i].firstChild.nodeValue)
88            continue;234            continue;
89            235            
90        if(ths[i].firstChild.nodeValue.match(/Ersp.{1,2}hte\s+Rohstoff236        if(ths[i].firstChild.nodeValue.match(/Ersp.{1,2}hte\s+Rohstoff
>e:/)) {>e:/)) {
91            GM_log('"Erspähte Rohstoffe:" gefunden!');237            GM_log('"Erspähte Rohstoffe:" gefunden!');
92            imgs = ths[i].nextSibling.getElementsByTagName('img');238            imgs = ths[i].nextSibling.getElementsByTagName('img');
93            for(var j=0; j<imgs.length; j++) {239            for(var j=0; j<imgs.length; j++) {
n94                GM_log("test: "+imgs[j].getAttribute('title'));n240                //GM_log("test: "+imgs[j].getAttribute('title'));
95                if(imgs[j].getAttribute('title') == 'Holz')241                if(imgs[j].getAttribute('title') == 'Holz')
96                    wood = 'yes';242                    wood = 'yes';
97                else if(imgs[j].getAttribute('title') == 'Lehm')243                else if(imgs[j].getAttribute('title') == 'Lehm')
98                    loam = 'yes';244                    loam = 'yes';
99                else if(imgs[j].getAttribute('title') == 'Eisen')245                else if(imgs[j].getAttribute('title') == 'Eisen')
100                    iron = 'yes';246                    iron = 'yes';
101            }247            }
102            248            
103            break;249            break;
104        }250        }
105    }251    }
106    252    
107    GM_log("Gespähte Rohstoffe - Holz: "+wood+" Lehm: "+loam+" Eisen:253    GM_log("Gespähte Rohstoffe - Holz: "+wood+" Lehm: "+loam+" Eisen:
> "+iron);> "+iron);
108    254    
109    // den Bericht abschicken bzw. einlesen255    // den Bericht abschicken bzw. einlesen
110    GM_xmlhttpRequest({256    GM_xmlhttpRequest({
111        method: 'POST',257        method: 'POST',
112        url: 'http://np.bmaker.net/tools/farmmanager.php?id='+id,258        url: 'http://np.bmaker.net/tools/farmmanager.php?id='+id,
113        headers: {259        headers: {
114            'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',260            'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
115            'Accept': 'application/atom+xml,application/xml,text/xml',261            'Accept': 'application/atom+xml,application/xml,text/xml',
>>
116            'Content-type': 'application/x-www-form-urlencoded',262            'Content-type': 'application/x-www-form-urlencoded',
117        },263        },
118        data: encodeURI('ajax=1&report='+report+'&wood='+wood+'&loam='264        data: encodeURI('ajax=1&report='+report+'&wood='+wood+'&loam='
>+loam+'&iron='+iron+'&note=&parse=1'),>+loam+'&iron='+iron+'&note=&parse=1'),
119        onload: function(responseDetails) {265        onload: function(responseDetails) {
n120                    if(responseDetails.status == 200) n266                    try {
121                        alert('Der Berichte wurde erfolgreich an den F267                        //var responseXML = new DOMParser().parseFromS
>armmanager geschickt!'); >tring(responseDetails.responseText, "text/xml");
268                        //alert(responseXML.getElementsByTagName('mess
 >age')[0].firstChild.nodeValue);
269                        var success = responseDetails.responseText.mat
 >ch(/erfolgreich eingelesen/i);
270                        
271                        // das "Bericht wurde erfolgreich eingelesen"-
 >Popup soll nur angezeigt werden,
272                        // wenn der Benutzer das so in der Konfigurati
 >on festgelegt hat.
273                        // Fehlermeldungen werden nach wie vor IMMER i
 >n dem Popup angezeigt.
274                        if(!success || show_success_popup) {
275                            alert(responseDetails.responseText);
276                        }
277                        
278                        // Bei Erfolg soll eine Erfolgsmeldung in der 
 >Seite erscheinen.
279                        if(success && !parsed) {
280                            parsed = true;
281                            _showHTMLSuccessMessage();
282                        }
283                        
284                        // Hat Nopaste gemeldet, dass es diesen Farmma
 >nager gar nicht gibt?
285                        // => Zurücksetzen der ID
286                        if(responseDetails.responseText.match(/Farmman
 >ager nicht gefunden/i)) {
287                            _invalidID();
288                        }
289                        
290                        // Hat Nopaste einen Fehler gleich welcher Art
 > gemeldet?
291                        // => Dann jetzt abbrechen, denn ein paar Zeil
 >en später kommt das automatische Löschen
292                        //    und das wäre ungünstig im Falle eines 
 >Fehlers (weil der Bericht dann unwiderruflich verloren ist).
293                        if(responseDetails.responseText.match(/Fehler/
 >))
294                            return;
295                    } catch(e) {
296                        alert("Der Bericht wurde abgeschickt, aber die
 > Antwort von NoPaste konnte nicht vollständig ausgewertet werden.\n\n
 >"+
297                              "Die genaue Fehlermeldung lautet: \n"+e+
 >
298                              "\n\nDie genaue Antwort von NoPaste laut
 >et: \n"+responseDetails.responseText);
299                        return;
300                    }
122                    else301                    
123                        alert('Es ist ein Fehler aufgetreten. Bitte ve302                    // Automatisches Löschen des Berichts?
>rsuche, den Bericht selbst einzulesen!');  
303                    if(delete_after_parsing)
304                        _deleteReport();
124                }305                }
125    });306    });
nn307    
308    return 0;
126}309}
127310
n128// Wenn die Taste E gedrückt wird, soll das Skript aufgerufen bzw. den311// globale Variablen
>r Bericht eingelesen werden.  
312var delete_after_parsing = false;
313var parsed = false;
314
315// Hotkeys...
129document.addEventListener("keydown", function(evt) {316document.addEventListener("keydown", function(evt) {
nn317    // wurde einer der beiden Hotkeys gedrückt?
130    if(evt.keyCode==69) {318    if(evt.keyCode == parse_hotkey) {
319        delete_after_parsing = false;
320    }
321    else if(evt.keyCode == parse_and_delete_hotkey) {
322        delete_after_parsing = true;
323    }
324    else {
325        return;
326    }
327    
328    // sollen alle Fehlermeldungen gemeldet werden?
329    if(debug) {
330        try { main() } catch(e) { alert("Fehler: " + e); }
331    }
332    else {
131        main();333        main();
132    }334    }
t133}, false);t335}, false);
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op