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.

Prompt Unix colorato usando PuTTY.

Avendo notato che il terminale standard aperto su un sistema Linux fornisce di default all’interfaccia il prompt colorato, ho voluto ottenere lo stesso risultato anche sui terminali aperti da altri S.O. usando come interfaccia PuTTY.

Normalmente, se si apre una sessione terminale remota usando PuTTY sui sistemi moderni, si ottiene una finestra che è in grado di gestire i colori, ma che presenta comunque un prompt monocromatico.

In Internet si trovano facilmente guide con procedure che suggeriscono la modifica del file ~/.bashrc per ottenere un prompt colorato. Non gradendo la modifica non necessaria di componenti standard (come .bashrc), ho voluto cercare una maniera non invasiva e più corretta per ottenere il prompt colorato.

Vediamo insieme come:
cominciamo con il controllare il nostro .bashrc e andiamo alla ricerca della variabile color_prompt.
Nel mio caso si è subito evidenziata la soluzione del problema: la variabile $TERM deve assumere il valore xterm-color oppure *-256color per indurre automaticamente l’ambiente a presentare il prompt colorato. Oppure, in alternativa, levando il commento che precede la variabile force_color_prompt, si forza il settaggio (ultima riga commentata nella parte di .bashrc riportata).

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

Andiamo ad impostare il parametro corretto in PuTTY per far si che la variabile $TERM si valorizzi nella maniera che vogliamo: nella sotto-sezione Data impostiamo nel campo xterm-type string il valore xtem-256color

Si torni su Session per salvare la sessione, e aprendo un nuovo terminale otterremo il prompt colorato che volevamo, senza modificare un solo bit sul sistema remoto:

Chapeau !
Su altri sistemi Linux, con altri settaggi, gli ambienti possono presentarsi in maniera diversa, e il procedimento dovrà essere adattato, ma resta comunque valido.

Transmission su QNAP

A partire dalla versione 4.3.2 del Firmware QNAP, Transmission smette di essere compatibile e scompare dal repository QNAP.

Una possibile soluzione è quella di installare qTransmission, disponibile su repository terze parti. Di seguito i passi da seguire se si decide di intraprendere questa strada.

Per iniziare accediamo al NAS e avviamo AppCenter, quindi andiamo a modificare le sue impostazioni facendo click sulla ruota dentata posta in alto a destra:

Fare click sulla ruota dentata evidenziata dal circolo rosso

Portiamoci sul tab Archivio e aggiungiamo il nuovo QNAP Club Store. associandogli il seguente URL: https://www.qnapclub.eu/it/repo.xml

Dal tab Archivio aggiungiamo il nuovo repository

Terminata l’operazione, se tutto è andato bene, troveremo nella pagina dell’APP Ceter l’icona del repository QNAP Club Store appena configurato.

QNAP Club Store

Ora che il repository è impostato basterà cercare Transmission e installarlo sul nostro NAS.