IRC/Bot

Wikibooks, manuali e libri di testo liberi.
< IRC
Indice del libro

La comunicazione IRC, come qualsiasi altra comunicazione in Internet, si basa semplicemente su uno scambio di byte. Per questo è possibile creare un programma che si colleghi come un normale utente ad un server IRC e possa ricevere o inviare messaggi.

Bisogna però specificare una cosa: quando noi ci connettiamo a IRC, in verità facciamo fare il grosso del lavoro al client IRC, che converte i messaggi che gli inviamo in forma semplificata in messaggi leggibili dal server, seguendo il protocollo IRC. Il bot però non può appoggiarsi ad un client, e quindi dovrà essere programmato per inviare messaggi leggibili dal server (più avanti è spiegato meglio come).

In questo modulo verrà spiegato come creare un proprio bot che si connette a IRC e riceve/invia messaggi dal/al server. Il linguaggio utilizzato è il PHP.

Una semplice struttura[modifica]

Per approfondire, vedi PHP.
/* alcune variabili di configurazione, possono essere adattate a piacere*/
$ircserver = 'irc.freenode.net';
$ircport = 6667;
$ircchannels = '#canale';
$user = 'nomeBot';
$irc = fsockopen($ircserver,$ircport,$ircerrno,$ircerrstr,15); //apre una connessione con il server IRC
if (!$irc) { //se non si riesce a connettere restituisce un errore
    die($ircerrstr.' ('.$ircerrno.')');
}
fwrite($irc,'USER '.$user.' "1" "1" :RamacBot IRC Bot.'."\n"); //si collega a IRC
fwrite($irc,'NICK '.$user."\n"); //imposta il nick
//continua a leggere le informazioni inviate dal server sino a quando non si interrompe la connessione
while (!feof($irc)) { 
    $data = str_replace(array("\n","\r"),'',fgets($irc,512)); //legge i dati dal server ed elimina gli accapo
    $data = str_replace('  ', ' ', $data); //elimina i doppi spazi
    $d = explode(' ',$data); //divide le informazioni in un array
    if (strtolower($d[0]) == 'ping') {  //risponde ai ping del server
        fwrite($irc,'PONG '.$d[1]."\n");
    } elseif (($d[1] == '376') or ($d[1] == '422')) { //si collega al chan se non vi è entrato
        fwrite($irc,'JOIN '.$ircchannels."\n");
    } else { //si arriva a questo codice solo se è tutto ok;
    /*
    * qui va inserito il cuore dello script, che invia output differenti in base ai messaggi ricevuti
    */
    }
}

Il codice è stato commentato per semplificarne la lettura; analizziamo l'array $d. Esso è il fulcro su cui gira l'applicazione, in quanto contiene tutto quello che viene inviato dal server, ovvero conterrà man mano ciascun singolo comando IRC eseguito sui canali ai quali siamo connessi.
Attenzione: come è stato detto in precedenza, il bot riceve e invia i dati non come si farebbe da un client, bensì seguendo le specifiche del protocollo IRC, che può essere per esempio trovato qua. Vediamo quindi un esempio di un tipico messaggio ricevuto dal bot:

:Ramac!n=Ramac@host-84-221-233-171.cust-adsl.tiscali.it PRIVMSG #wikibooks-it :ciao

La prima parte è costituita dal nome dell'utente che ha inviato il messaggio al server, mentre il resto indica il testo del messaggio. Nel nostro caso, l'utente Ramac ha inviato un messaggio privato al channel #wikibooks-it passando come parametro ciao; gli utenti vedranno così il testo "ciao" nella schermata della chat.
I messaggi possono essere anche di altro tipo:

:Ramac!n=Ramac@host-84-221-233-171.cust-adsl.tiscali.it PART #wikibooks-it :ciao 

Con questo comando, l'utente esce dal canale #wikibooks-it.

Detto questo, nei casi in cui il programma esegua l'ultimo blocco di codice, delimitato dall'ultimo else, la struttura dell'array $d sarà la seguente:

  • $d[0] contiene l'utente che ha inviato il messaggio
  • $d[1] indica il comando IRC effettuato dall'utente
  • $d[2] indica il canale IRC o l'utente a cui è indirizzato il comando (questo non accade sempre, in quanto non tutti i comandi IRC prevedono un "destinatario")
  • da $d[3] in poi l'array contiene il testo vero e proprio del messaggio, e sarà quello che andremo ad analizzare nella maggior parte dei casi

Inviare un messaggio[modifica]

Il modo più semplice per inviare un messaggio è usare il comando PRIVMSG destinatario: testo, dove destinatario è il nome di un utente oppure un canale IRC. Ad esempio:

fwrite($irc,'PRIVMSG '.$chan.' :Arrivederci a tutti!'."\n");
fwrite($irc,'QUIT :ciao!'."\n");
exit;

Con questo codice il bot invia un messaggio di saluto, invia un messaggio QUIT che interrompe la comunicazione con il server ed esce dallo script.