Servito in un istante

printf “Errore %d: %s

Servito in un istante

“, $errore, $descrizione;

morire “$descrizione

" se ($ fatale) ;

}

Questo è scritto in uno stile Perl più classico: nota come non abbiamo utilizzato le parentesi nelle funzioni printf e die. Dobbiamo aggiungerlo come una nuova funzione di callback dopo la prima richiamata, quindi:

$oscar->set_callback_error(\&handle_error); Now when you run the program with an incorrect password you'll see: login: Connecting to login.oscar.aol.com: 5190. login: Connected. login: Connected to login server. login: Sending password. Error 0: Invalid password. Invalid password. 

Estensione del server

Vedremo ora due estensioni di questo server: un metodo con cui le persone possono registrarsi per ricevere messaggi e un metodo che altri programmi possono utilizzare per inviare messaggi. Il nostro obiettivo è creare un server su cui le persone si registrino e quindi ricevano informazioni da un altro programma come un monitor dei guasti. Abbiamo implementato la registrazione utilizzando le liste di amici, una funzione AIM che consente a ciascun utente di dire chi sono i propri amici e di dividerli in gruppi. Le informazioni sugli amici sono conservate sui server AIM, quindi non è necessario archiviare alcuna informazione localmente. Per implementare l'elenco degli amici, aggiungi il seguente codice:

use constant BUDDYGROUP => 'pcpro'; sub im_in { my($oscar, $sender, $message, $is_away) = @_; print "[AWAY] " if $is_away; print "$sender: $message "; if ($message =~ /join\s+${\BUDDYGROUP}/i) { $oscar->add_buddy(BUDDYGROUP, $sender); $oscar->commit_buddylist(); $oscar->send_im($sender, "$sender: added to buddy group ${\BUDDYGROUP}"); } elsif ($message =~ /remove\s+${\BUDDYGROUP}/i) { $oscar->remove_buddy(BUDDYGROUP, $sender); $oscar->commit_buddylist(); $oscar->send_im($sender, "$sender: removed from buddy group ${\BUDDYGROUP}"); } elsif ($message =~ /members\s+${\BUDDYGROUP}/i) { my $outgoing = sprintf "Group %s members: %s", BUDDYGROUP, join(',',$oscar->buddies(BUDDYGROUP)); $oscar->send_im($sender, $outgoing); } } 

Ciò che abbiamo fatto qui è impostare una costante per il nome del nostro gruppo "pcpro", quindi usarla in una nuova versione della nostra funzione di messaggio in arrivo im_in che ora esamina il messaggio in arrivo e decide cosa fare Fare. Se riceve "unisciti a pcpro", aggiunge questo utente all'elenco degli amici, mentre "rimuovi pcpro" lo rimuove dall'elenco. Se riceve il messaggio "membri pcpro", invia all'utente un elenco di tutti i membri del gruppo di amici. Tutti questi messaggi vengono gestiti allo stesso modo, confrontandoli con un'espressione regolare, nella riga:

if ($messaggio =~ /join\s+${\BUDDYGROUP}/i) {

che significa “se il messaggio ricevuto ($messaggio) corrisponde (=~) all'espressione regolare che inizia con il la parola "join" seguita da un numero qualsiasi di spazi (\s+) e dal nome del gruppo di amici, quindi eseguire la procedura successiva dichiarazione". L'espressione regolare è la parte racchiusa tra barre e quella "I" alla fine significa ignora maiuscole e minuscole, quindi il programma gestisce "Join PCPro" come "join pcpro". C'è del Perl complicato qui, poiché l'utilizzo della costante BUDDYGROUP all'interno di un'espressione regolare richiede una conoscenza avanzata dei riferimenti.

Ora che la nostra lista di amici è impostata, dobbiamo decidere come inviare quei messaggi. Esistono molti metodi per inserire messaggi in un programma Perl (vedere la pagina di manuale perlipc per esempi) ma utilizzeremo un socket TCP/IP. Aggiungere le seguenti righe al programma dopo le altre istruzioni “use”: