Client IRC con php – Semplice applicazione pratica

Il protocollo IRC è uno dei protocolli standardizzati più semplici in circolazione. La sua implementazione basilare consta di poche righe di codice. In questo spazio si intende fornire lo spunto dal quale, volendo, procedere autonomamente.

Il protocollo è specificato in RFC 1459 e successivamente modificato nelle RFC 2810 2811 2812 2813 7194

La più semplice implementazione che ho potuto definire consta di poche righe di codice:

<?php

$NL  = chr(012);
$CR  = chr(015);
$EM  = $CR.$NL;

$irc['network'] = "chat.freenode.net";
$irc['ircPort'] = 6667;
$irc['channel'] = "#satnogs";
$irc['usrName'] = "Nome";
$irc['reaName'] = "Mio Nome";
$irc['usrNick'] = "mioNick";
$irc['timeout'] = 1;

if(!$socket = fsockopen($irc['network'], $irc['ircPort'], $errno, $errmsg))
    die("$errmsg ErrNo($errno)\n");
if(!stream_set_blocking($socket, true))
    die("$errmsg ErrNo($errno)\n");

fputs($socket, "USER ".$irc['reaName']." Casa Telecom.net :".$irc['usrName'].$EM);
fputs($socket, "NICK ".$irc['usrNick'].$EM);

stream_set_timeout($socket, $irc['timeout']);
while(true) {

    $rawdata = fgets($socket, 512);
    if($last_err = error_get_last()) {
        echo "\rError occurred:\n";
        flush();
        var_dump($last_err);
        break;
    }

    if(!$rawdata) continue;

    $IRCMSG = preg_replace("/^([^".NULL.$NL.$CR."]*)".$CR.$NL."$/", '${1}', $rawdata);

    if(substr($IRCMSG, 0, 1) == '@')
        list($tags, $IRCMSG)    = explode(' ', substr($IRCMSG, 1), 2);
    if(substr($IRCMSG, 0, 1) == ':')
        list($source, $IRCMSG)  = explode(' ', substr($IRCMSG, 1), 2);
    list($command, $parameters) = explode(' ', $IRCMSG, 2);

    if(isset($source)) {
        if(preg_match("/!.*@/", $source))
            list($Snick, $Suser, $Shost) =
                explode(' ', preg_replace("/^([^!@]*)!([^!@]*)@(.*)$/", '${1} ${2} ${3}', $source), 3);
        else
            $Snick = $source;
    }

    if(isset($Snick))
        echo "($Snick) ";
    echo "[$command] {".$parameters."}\n";

    switch($command) {
    case "001":
        fputs($socket, "JOIN ".$irc['channel'].$EM);
        break;
    case "PING":
        fputs($socket,"PONG $parameters".$EM);
        break;
    }
}

?>

Fondamentalmente, eseguita la connessione al network IRC specificato nelle dichiarazioni iniziali, Il client comunica le proprie generalità e attende che vengano accettate con l’invio da parte del server di un “$command” di tipo “001”.
Quindi esegue il collegamento (Join) ad un canale e rimane in ascolto continuando a gestire la risposta ai PING di verifica inviati dal server.
I parametri delle dichiarazioni iniziali sono piuttosto stabili, ma possono e devono essere adattati alle personali preferenze.
Quello che si ottiene è lo spacchettamento al livello base di tutti i messaggi ricevuti dal server e la loro presentazione a schermo.
Si esce dal ciclo infinito con CTRL-C e si è liberi di arricchire il codice secondo le proprie esigenze e fantasie fino alla definizione di un completo Bot-Client IRC.
Buon divertimento.