Die Methode »look_down()« eines Baum-elements sucht, ausgehend vom gegenwärtigen Element, abwärts nach Knoten mit bestimmten Merkmalen und gibt sie als Liste zurück. Die Bedingung »_tag => $tagname« sucht nach Tags mit diesem Namen; »attrname => $attrvalue« verlangt darin ein Attribut.
Der Linktext und das Href-Attribut des jeweils ersten Links gelangen in Form einer absoluten URL in ein Element des Array »@questions«. Den zweiten Link (den des Fragestellers) unterdrückt der Doppelpack der For-Schleifen. Dafür sorgt die Anweisung »last« nach dem Ende der inneren Schleife.
Wichtig ist noch, nach dem Parsen den Baum mit »delete()« abzubauen, damit kein wertvoller Speicher verloren geht. Alternative Parser wären XML::LibXML oder XML::XSH, die mit mächtiger XPath-Syntax arbeiten. Allerdings steigen beide bei schlampigen HTML-Dokumenten, die Webbrowser noch großzügig verarbeiten, schnell aus.
Das Skript muss sich merken, welche Fragen es schon gemeldet hat und welche neu sind. Dabei nutzt es die eindeutige Node-Nummer, die im URL einer jeden Frage versteckt ist. Sie wird mit einem regulären Ausdruck extrahiert und mit der letzten gespeicherten Nummer aus einem persistenten Cache::FileCache-Objekt verglichen. Falls die gefundene Frage nun eine höhere Node-Nummer hat als die gespeicherte, gilt sie als neu. Anschließend wandert ihre Node-Nummer in den Cache.
Die Funktion »latest_news()« gibt ein Array von formatierten Instant Messages für den Benutzer zurück. Ist das Array leer, gibt es nichts Neues. Ist es dagegen gefüllt, erzeugt Zeile 143 aus der global gespeicherten Gaim-Struktur des angemeldeten Benutzers ein Objekt der Klasse »Gaim::Conversation::IM« und ruft von jedem einzelnen Nachrichten-Objekt die »send()«-Methode auf.
Installation
Wer Gaim noch nicht hat, holt sich am besten die neue Version 1.4.0 von [gaim.sourceforge.net] ab. Die Perl-Schnittstelle Gaim.pm ist nicht vom CPAN erhältlich, sondern Teil der Gaim-Distribution. Sie ist leicht zu installieren:
cd plugins/perl/common perl Makefile.PL make install
Sein Plugin-Verzeichnis legt jeder User manuell mit »mkdir ~/.gaim/plugins« an. Darin enthaltene Perl-Skripte, die den Anforderungen genügen, hängt Gaim beim Programmstart automatisch als Plugins ein. Es genügt, Pmwatcher.pl dorthin zu kopieren und Gaim zu starten. Im Menü »Tools->Preferences-> Plugins« (Abbildung 3) ist Pmwatcher dann permanent aktivierbar. Die in der Dialogbox angezeigten Daten bezieht Gaim aus dem Hash »%PLUGIN_INFO«, den die Funktion »plugin_init()« (Zeile 43 in Pmwatcher.pl) zurückliefert.
Die aufgelisteten Module sind alle vom CPAN erhältlich, zu beachten ist lediglich, dass »POE::Component::Client::HTTP« explizit installiert sein muss. Im Skript lässt sich mit »$FETCH_INTERVAL« die Zeit zwischen den Webrequests einstellen, 10 Minuten sind vorgegeben. Das sollte den Anforderungen an Aktualität genügen und die Perlmonks-Betreiber nicht verärgern. Die Variable »$USER« enthält den Instant-Messenger-Namen des Benutzers, der den Perlmonks-Reigen in Schwung bringt, falls er sich einloggt. Sonst wird zwar das Plugin jede Sekunde angesprungen, aber es finden keine Webrequests statt.
Wenn Gaim mit der Option »-d« (debug) startet, erscheinen die im Perl-Skript mit der Funktion »Gaim::debug_info« abgesetzten Logmeldungen auf der Standardausgabe. Die Plugin-Skripte von Gaim laufen übrigens nicht von der Kommandozeile aus.
Bevor der in Zeile 22 eingestellte Benutzer nicht online ist, passiert nichts. Loggt er sich ein, egal auf welchem Netzwerk, holt das Plugin alle 10 Minuten die Perlmonks.com-Website ein, prüft sie auf Veränderungen und teilt dem punktehungrigen Perl-Spezialisten das Ergebnis mit. Ob\’s bald für die Heiligsprechung reicht? (jcb)





