Open Source im professionellen Einsatz

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.

Erst habe ich dafür ein wenig mit XML::Simple experimentiert, aber damit XML zu erzeugen, das genauso aussieht wie die Vorgabe, ist praktisch unmöglich. Und Pidgin ist nicht gerade robust, was die Abfolge der Daten in dieser XML-Datei betrifft. Wer einen gnadenlos abstürzenden Pidgin beobachten will, braucht nur den »pouncee«-Eintrag vom Anfang ans Ende der »pounce«-Struktur zu verfrachten.

Die Funktion »mv« aus dem Modul Sysadm::Install schiebt eine eventuell schon von Pidgin verwaltete Datei »pounces.xml« höflich zur Seite und benennt sie in »pounces.xml.old« um. Die »process()«-Methode in Zeile 46 nimmt einen Array von Pounce-XML-Texten entgegen, über den die For-Schleife im Template-Code iteriert, das parametrisierte XML an die richtigen Stellen einpflanzt und anschließend Pidgins Datei »pounces.xml« mit den neuen Daten überschreibt.

Das Ergebnis, das in Abbildung 5 zu sehen ist, enthält einen Wust aus XML-Statements für jede Kombination aus Protokoll, Account und Kommunikationspartner. Am Ende rufen aber alle Instanzen dieses XML-Snippets das externe Programm »pounce-sound« (Listing 2) mit Parametern wie Account- und Username auf.

Listing 2:
»pounce-sound«

01 #!/usr/local/bin/perl -w
02 use strict;
03 use YAML qw(LoadFile);
04 use Data::Throttler;
05
06 my($proto, $buddy) = @ARGV;
07
08 die "usage: $0 proto:recv buddy"
09 if !defined $buddy;
10
11 my($home) = glob "~";
12 my $path = "$home/.pidgin-pounce";
13
14 my $yaml = LoadFile( "$path/pounce.yml" );
15
16 my $throttler = Data::Throttler->new(
17 max_items => 1,
18 interval => $yaml->{interval},
19 backend => "YAML",
20 backend_options => {
21 db_file => "$path/throttle.yml",
22 },
23 );
24
25 if(! $throttler->try_push(
26 key => "$proto:$buddy")) {
27 # rate limit reached, skip it
28 exit 0;
29 }
30
31 if(exists
32 $yaml->{sound_map}->{$proto}->{$buddy}) {
33 my $sound =
34 $yaml->{sound_map}->{$proto}->{$buddy};
35 system("play $path/sounds/$sound");
36 }

Abbildung 5: Das von »pounce-yml-to-xml« generierte XML, das Pidgin dazu veranlasst, bei eintreffenden Nachrichten von »bigboss« an »mikeschilli« das externe Skript »pounce-sound« aufzurufen.

Abbildung 5: Das von »pounce-yml-to-xml« generierte XML, das Pidgin dazu veranlasst, bei eintreffenden Nachrichten von »bigboss« an »mikeschilli« das externe Skript »pounce-sound« aufzurufen.

Die den Online-Buddies zugeordneten Geräuschdateien installiert man allesamt im Verzeichnis »sounds« unterhalb des ».pidgin-pounces«-Directory.

Sound zurechtschneiden

Ihre Dauer sollte jeweils ein paar Sekunden nicht überschreiten. Wer eine längere Sounddatei kürzen möchte, greift zu Audacity und blendet mit den Fade-in- und Fade-out-Effekten das Geräusch einfach sanft ein- und aus (Abbildung 6).

Abbildung 6: Das Tool Audacity schneidet das Geräusch auf die korrekte Länge zurecht und kann es mit den Fade-in- oder Fade-out-Effekten sanft ein- oder ausklingen lassen.

Abbildung 6: Das Tool Audacity schneidet das Geräusch auf die korrekte Länge zurecht und kann es mit den Fade-in- oder Fade-out-Effekten sanft ein- oder ausklingen lassen.

Das von Pidgin im Ereignisfall aufgerufene Skript »pounce-sound« nimmt auf der Kommandozeile als Parameter die Kombination aus Protokoll und Account sowie das Kürzel des sendenden Users entgegen. Es liest die YAML-Datei ein und findet heraus, ob ein Spezialsound für den jeweiligen User vorliegt. Falls ja, spielt es diesen mit dem Utility »play« über die Soundkarte ab.

Erhält Pidgin zum Beispiel über das Yahoo-Protokoll mit dem eingeloggten User »mikeschilli« eine Nachricht vom User »bigboss«, dann ruft es

pounce-sound yahoo:mikeschilli bigboss

auf. Das Skript wiederum sieht in der YAML-Datei nach, findet, dass für diesen Fall die MP3-Datei »bugle.mp3« vorgesehen ist, und spielt sie ab.

Das einzig Bemerkenswerte an »pounce-sound« ist der Aufruf von Data::Throttler, der verhindert, dass zu häufiges Abspielen der Sounds den Zorn des Benutzers erregt. Data::Throttler legt unter »~/.pidgin-pounce/throttler.yml« eine YAML-Datei an und merkt sich dort Anzahl und Zeitpunkt der letzten Aufrufe. Die Methode »try_push()« behält einen Schlüssel aus Protokoll, dem Accountnamen und dem Namen des sendenden Buddy und liefert einen unwahren Wert zurück, falls der Buddy während der Zeitspanne der letzten »interval« Sekunden schon aktiv war. Andere Kommunikationspartner hingegen lässt es gewähren, bis auch diese ihr Quantum überschreiten.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook