Tanz auf allen Hochzeiten
Da Pidgin verschiedenste IM-Protokolle benutzt und ein Anwender meist unter mehreren Accounts auf mehreren Servern gleichzeitig eingeloggt ist, steht unter dem Eintrag »sound_map« in der YAML-Datei zuerst ein Schlüssel, der den jeweiligen IM-Anbieter und den dort verwendeten Nutzernamen durch einen Doppelpunkt getrennt auflistet.
Unter dieser Hierarchiestufe folgen die Zuordnungen von Onlinepartnern und Sounddateien, die Pidgin abspielen soll, falls der Partner sich einloggt oder dem Nutzer eine Nachricht schickt. Nach Abbildung 3 ist also mein Screen-Name auf Yahoos Messenger-Service »mikeschilli« und falls mir dort »elcaramba« eine Nachricht schickt, rasselt Pidgin mit »cabassa.mp3« einen heißen südamerikanischen Rhythmus.
Filter gegen Trommelfeuer
Neben der Zuordnung der Buddies zu den Geräuschen unter dem Eintrag »sound_map« setzt die YAML-Datei auch noch den Parameter »interval«, damit das System nicht bei jeder eintrudelnden Nachricht ein Geräusch abspielt. Steht »interval« auf 60, ist die Mindestzeitspanne zwischen zwei Geräuscheinspielungen 60 Sekunden. Kommen in diesem Zeitraum mehrere Nachrichten an, unterdrückt das System das abzuspielende Geräusch, denn schließlich soll der arme User kein akustisches Trommelfeuer ertragen, sondern arbeiten.
YAML-Daten lassen sich eins zu eins in Perl importieren, die Funktion »LoadFile()« aus dem YAML-Modul wandelt sie in die in Abbildung 4 gezeigte Struktur um. In dem darauf folgenden Schritt steht nun die Konvertierung der Daten in aufgeblähtes XML an.

Abbildung 4: Mit »LoadFile()« eingelesen ergeben die YAML-Daten aus der Abbildung 3 diese Datenstruktur in Perl.
Von YAML nach XML
Das von Pidgin verwendete XML-Format (Abbildung 2) definiert für jeden Pounce ein Konstrukt, das in »<pounce>«-Tags eingeschlossen ist. Die Gesamtheit aller dieser Tags steht innerhalb eines Sammel-Tags mit dem Namen »<pounces>«. Dies ist einfach mittels Reverse Engineering herauszufinden, in dem man mehrere Pounces mit Pidgins grafischer Oberfläche definiert und anschließend die automatisch neu geschriebene XML-Datei inspiziert.
Das Skript »pounce-yml-to-xml« in Listing 1 wandelt nun die kompakte YAML-Datei in Abbildung 3 in ausführliche XML-Instruktionen für Pidgin um, die es anschließend in »~/.purple/pounces.xml« speichert. Die For-Schleife ab Zeile 17 iteriert über die Einträge im »sound_map«-Hash der YAML-Datei, die allesamt im Format »protocol:account« vorliegen. Darunter befindet sich ein weiterer Hash, der den Onlinepartnern (Buddies) Geräusche zuordnet.
|
Listing 1: |
|---|
01 #!/usr/local/bin/perl -w
02 use strict;
03 use Sysadm::Install qw(:all);
04
05 use YAML qw(LoadFile);
06 use Template;
07
08 my($home) = glob "~";
09 my $path = "$home/.pidgin-pounce";
10 my $yaml = LoadFile( "$path/pounce.yml" );
11
12 my $xml_file = "$home/.purple/pounces.xml";
13 my $SOUND_CMD = "~/bin/pounce-sound";
14
15 my @pounces = ();
16
17 for my $account (
18 keys %{ $yaml->{sound_map} }) {
19
20 my($proto, $recv) = spl it /:/, $account;
21
22 for my $buddy (keys %{
23 $yaml->{sound_map}->{$account} }) {
24
25 push @pounces,
26 mk_pounce($buddy, $recv, $proto);
27 }
28 }
29
30 binmode STDOUT, ":utf8";
31
32 my $xml = q{
33 <?xml version='1.0' encoding='UTF-8' ?>
34 <pounces version='1.0'>
35 [% FOR pounce IN pounces %]
36 [% pounce %]
37 [% END %]
38 </pounces>
39 };
40
41 my $tmpl = Template->new();
42
43 mv $xml_file, "$xml_file.old" if
44 -f $xml_file;
45
46 $tmpl->process( $xml,
47 { pounces => @pounces },
48 $xml_file ) or die $tmpl->error;
49
50 ###########################################
51 sub mk_pounce {
52 ###########################################
53 my($buddy, $recv, $prot) = @_;
54
55 return qq{
56 <pounce ui='gtk-gaim'>
57 <account
58 protocol='prpl-$prot'>$recv</account>
59 <pouncee>$buddy</pouncee>
60 <options/>
61 <events>
62 <event type='sign-on'/>
63 <event type='message-received'/>
64 </events>
65 <actions>
66 <action type='execute-command'>
67 <param name='command'
68 >$SOUND_CMD $prot:$recv $buddy</param>
69 </action>
70 </actions>
71 <save/>
72 </pounce>
73 }
74 }
|
Die Keys-Funktion gibt eine Liste dieser Partner zurück. Zeile 26 ruft für jeden die ab Zeile 51 definierte Funktion »mk_pounce()« auf. Als Parameter erhält sie den Namen des Buddy, den Namen des Accounts (»recv« genannt, weil dieser später Nachrichten von den Buddies empfängt) sowie das verwendete Protokoll (»yahoo«, »aim« oder dergleichen). Die Funktion gibt dann jeweils einen XML-String zurück, der einem Eintrag in Pidgins Konfigurationsdatei »pounces.xml« entspricht.
Empfindlicher Pidgin
Zum Schreiben des XML-Formats der Gesamtdatei kommt das Modul Template vom CPAN zum Einsatz, ein Template-Prozessor, der normalerweise beim dynamischen Aufbau von Webseiten hilft. Im Skript »pounce-yml-to-xml« expandiert es nur Makros im Format »[% Variable %]«. Das praktische »FOR«-Konstrukt der Template-Sprache hilft in Zeile 35, die unästhetische Vermengung von Perl- und XML-Code zu vermeiden.




