                  IIII RRRRRR    CCCCC    BBBBBB
                   II  RR   RR  CC        BB    B       t
                   II  RR   RR CC         BB    B       t
                   II  RRRRRR  CC         BBBBBB   ooo  ttt
                   II  RR   RR CC         BB    B o   o t
                   II  RR   RR  CC        BB    B o   o t
                  IIII RR   RR   CCCCC    BBBBBB   ooo   ttt

<--                      Partie III : le CTCP                              -->
<--                  Par S/ash (sl4sh@ifrance.com)                         -->


Ceci est une explication de la partie sur le CTCP de l'article prcdent.

I. Le Quoting CTCP
------------------
Le problme dans l'irc est que l'on ne peut pas envoyer de caractres comme CR
(carrier return), NL (New Line) ou NUL (0). Donc le quoting CTCP sert 
envoyer des caractres qui seront interprt tel quel.
On choisit doncun caractre que l'on nommera M-QUOTE, il s'agit du caractre 
'\020' (comprendre 20 en octal soit 16 dcimal).
Ben maintenant on envoie ce caractre suivit de '0' et  l'arrive, on aura 
le NUL.
en gros pour envoyer un caractre NUL, on envoie '\020', '0'.
Voil les trames pour chaque caractre spcial :
NUL      -> M-QUOTE '0'
NL       -> M-QUOTE 'n'
CR       -> M-QUOTE 'r'
M-QUOTE  -> M-QUOTE M-QUOTE
Et oui, il faut aussi quoter le M-QUOTE (car il interprt de faon spcial).
Cela resemble normment au quoting C (vous savez quand vour taper '\n' pour
CR) en remplacant le backs\ash par le M-QUOTE.
Si vous mettez un caractres non reconnue comme servant au quoting derrire
un M-QUOTE, le M-QUOTE sera ignor.

II. Les donnes TAGGED (littralement tiquet)
-----------------------------------------------
Pour envoyer n'importe quelle donne  un autre client on va utilis un autre
type de quoting nomm X-DATA Quoting (X pour extended).
En gros, on choisit le caractre X-DELIM par '\001' (ie le caractre 1)
et on entoure le message (qui ne pourra contenir le X-DELIM) par 2 X-DELIM.
Le tag est la premire partie d'un message X-DATA jusqu'au premire espace.
Ce tag est utilis entre les client pour des messages spcifique et est case
sensitive (les majuscule ou miniscule sont importantes).
Nous reparleront des Tags plus loin.
Ce quoting n'est valable qu'avec les message PRIVMSG et NOTICE

III. Le quoting au niveau CTCP
------------------------------
On definit encore un nouveau caractre de quoting nomm X-QUOTE dfinit
par le caractre '\134' (le backs\ash).
Ben ouais, pour le X-DELIM au niveau CTCP il faut bien le coder, donc
on utilise X-QUOTE 'a' pour X-DELIM ('\\a') et X-QUOTE X-QUOTE pour X-QUOTE.
Donc ca c'est le quoting utilise pour les messages CTCP qui transite sur le
rseau. X-QUOTE rgit de la mme faon pour les caractres qu'il ne connait
pas que M-QUOTE dans un message CTCP.

IV. L'ordre du quoting
----------------------
Tous d'abord il y a 3 niveaux de messages
Le niveau High (H) : quand le client discute avec l'utilisateur
Le niveau Middle (M) : le CTCP Quoting a t apliqu au message de niveau H
(on a quot les caractres M-QUOTE, CR, NL et NUL : c'est le niveau CTCP).
Le niveau Low (L) : le niveau client vers serveur (les messages qui circulent
sur le rseau) : c'est le dernier quoting dont on a parl.
En gros on affichera les messages en niveau H et on les enverra en niveau L.

V. Les commandes CTCP
---------------------
Il s'agit des tag dans le quotage de bas niveau.
Ce sont les suivantes :
* FINGER  : renvoie l'idle de l'utilisateur
    on y rpond par un "FINGER :info" evidemment quoter par des \001
* ERRMSG  : pour envoyer un messages d'erreurs ("ERRMSG msg");
* VERSION : le message pour demander la version (rponse :
    "VERSION nom:version:environnement")
* SOURCE : pour obtenir une version du client (rponse : plusieurs lignes
du type "SOURCE host:dir:files" termin par un message "SOURCE")
* USERINFO : information sur l'utilisateur (rponse : "USERINFO :info")

Je passe sur CLIENTINFO qui est ininterressant.
Tous ces messages sont envoyer en notice.

VI. Ce qui nous interresse...
-----------------------------
Bon on veut rpondre  plusieurs info : VERSION, SOURCE, USERINFO.
(Pour camoufler le bot par exemple).
De plus on veut grer des listes de users donc on va introduire de
nouvelles commandes CTCP comme LOG, HELP (Liste les commandes du bot),
LOGOUT...
on utilise whois pour voir si un user est dconnect (ping est trop lent).

Dans le prochain article on parlera du protocole DCC (Direct Client to Client)
permettant l'envoie de fichier et la gestion d'un serveur de fichier.

Le bot 0.3 avec les explications dans le fichier README, est ou sera sur 
le site de la RtC TecH.
<--                          File by S/ash                                 -->
[EOF]
