_ ________________________________________ _ -*2*- `^°*;:,.> IRC Hack Tutorial - La suite - <.,:;*°^` ___________________/¯¯¯¯¯¯¯¯¯¯¯¯¯¯By Blured75¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\_____________________
IRC Hack tutorial
Texte par bLuReD75

Salut les loubards de l'IRC. Vous vous souvenez de l'irc-hack tutorial?
En voici la suite, avec cette fois ci des exemples en annexe (fournis 
dans le package). 


Théorie des IRC Nets	
--------------------


Clients et serveurs

IRC est un système client/serveur. Cela veut tout simplement dire qu'il 
y a une machine qui va se charger de recevoir toutes les connexions des 
clients. Les serveurs gèrent entre 10 et 1000 connexions IRC simultanées 

Les clients

Les clients, c'est vous et moi, chacun avec une machine différente. Il 
existe une multitude de clients différents, pour tous les goûts, pour 
tous les OS. La seule restriction pour pouvoir se connecter à un serveur
IRC, c'est que le client respecte le protocole défini dans le RFC 1459 
(voir fichier annexe). Les clients les plus connus sont mIRC 
sous Windows et ircII sous UNIX. 

Les serveurs

Les serveurs sont presque tous sous UNIX. Le logiciel qui s'occupe de 
recevoir et de gérer les connexions des clients s'appelle ircd (IRC 
Daemon). Les ressources exigée par un serveur dépendent essentiellement 
du nombre de personnes qui sont connectées. N'importe qui peut installer 
un serveur IRC chez lui. Par contre, pour faire partie d'un des quatre 
grands IRC Nets (20.000 personnes et plus), il faut une machine assez 
puissante, et surtout une connexion à l'Internet permanente et rapide ! 

IRC Net

Si tout le monde devait se connecter sur le même serveur, le pauvre 
serveur serait vite depassé par la situtation. C'est pourquoi en plus 
des connexions client-serveur, le protocole d'IRC permet des connexions 
serveur-serveur. 

On peut voir comment sont interconnectés les serveurs en tapant la 
commande /links.

Note : il ne doit jamais y avoir de boucle ! Heureusement, ircd vérifie 
a chaque connexion si cela ne peut pas créer de boucle. Le cas echeant, 
la connexion est annulée automatiquement. 

Comment ça marche ?

Imaginons que tous les clients representés soient sur #toto. Si le 
client 1 dit "glop" sur #toto, le serveur 7 va envoyer ce message au 
client 2, car il est aussi sur le channel #toto. Mais il va aussi 
signaler au serveur 2 que le client 1 a dit "glop" sur #toto. Le serveur
2 n'a aucun client sur #toto, donc il va seulement propager le message 
au serveur 1. Le serveur 1 enverra le message au client 3, ainsi qu'aux 
serveur 3, 4 et 8, et ainsi de suite... 

Ca veut bien dire que lorsqu'on fait "glop" sur un channel, le message
va se propager à travers le monde jusqu'aux serveurs où sont connectés
chacun des membres du channel. Par contre, le message ne se propage 
pas vers les serveurs qui ne sont pas concernés. 

La répartition en réseau de serveurs permet donc de diminuer le nombre
de connexions sur chaque serveur, mais ça ne diminue pas beaucoup le 
trafic qui passe entre les serveurs. C'est pourquoi, techniquement, on 
ne peut pas dépasser des réseaux de plus de 35.000 utilisateurs sans 
générer un lag pénible pour les utilisateurs : les connexions Internet 
sont trop lentes ! 

Netsplits

Un phénomène qui en intrigue plus d'un, c'est les splits et les joins. 
Il arrive parfois que les serveurs IRC soient surchargés, s'il y a trop 
de monde sur l'IRC Net par exemple. Lorsqu'un serveur n'arrive plus à 
suivre, il peut décider de "splitter", c'est à dire de casser une de ses
liaisons avec un autre serveur. L'IRC Net originel se retrouve alors 
scindé en deux IRC Nets complètement indépendants.

Sur un channel, on voit parfois plusieurs personnes partir au même 
moment. Cela peut être dû à un netsplit. On reste alors seul avec les 
personnes qui sont du même côté du split. Imaginons par exemple, que le
Serveur 1 et le Serveur 4 splittent. Les clients 1, 2 et 3 voient 
alors les client 4 et 5 partir, et vice-versa ! 
On peut aller voir ce qui se passe de l'autre côté du split se 
connectant à un des serveurs qui a splitté. Sur les nouveaux serveurs 
2.9, on peut voir les netsplits/netjoins simplement allant sur le 
channel &servers. Il est possible de profiter des netsplits pour gagner 
l'op sur un channel. Evidemment, ce genre de pratique peut conduire à 
de graves ennuis avec les propriétaires du channel et les IRCOPs qui 
surveillent ce genre de choses. Voyons point par point comment cela 
se passe. 

Supposons que le channel appartienne a Client 2. Jusque là tout va bien. 
Les choses se gâtent quand le Serveur A décide de splitter. 
En effet, Client 1 se retrouve alors tout seul. Il peut quitter puis 
revenir sur le channel pour devenir op. 
Au moment du netjoin, Client 2 va voir Client 1 arriver, et se faire 
oper par Serveur A. Inversement, Client 1 va voir Client 2 se faire 
oper par Serveur B. C'est ce qu'on appelle un server-op. 

Et qu'est-ce qu'on fait maintenant ? Et bien c'est le plus rapide qui 
va déoper l'autre. Mais s'ils se déopent en même temps, on peut aboutir 
à une désynchronisation ! 

Pour être sûr de gagner l'op, Client 1 aurait pu lancer un deuxième 
client sur son Serveur A qui aurait pris le même nick que Client 2. 

Au moment du netjoin, il se serait produit une "nick collision", et 
les deux personnes, Client 2 et son jumeau, auraient été déconnectées. 
Client 1 se serait retrouvé seul avec l'op.

Avec la version 2.9 des serveurs IRC intervient le Nick Delay, ND. Les 
serveurs se "souviennent" des channels et des nicks. Si l'on prend un 
nick qui existait sur un autre serveur, ou si on join un channel qui 
n'était pas vide avant le split, le serveur renvoie l'erreur : 
"Nick/channel is temporarily unavailable". Mais comme le dit le 
message, ça n'est que temporaire, et si le split dure, le channel 
pourra quand même se faire hacker. Le ND dure en général 10 à 30 
minutes, ce qui est supérieur à la durée de la plupart des splits.

Désynchronisation

Chaque serveur stocke l'état complet du réseau IRC : qui est où, sur 
quel channel, sur quel serveur, avec quels modes etc... L'état interne 
est le même à tout instant sur tous les serveurs... en théorie. En 
pratique, il y a du lag, des délais de plusieurs secondes dûs à la 
lenteur des connexions Internet. 

Cela crée un retard dans la propagation des évènements. De ce fait, 
il arrive parfois que des évènements ne se produisent pas dans le 
même ordre selon point d'où on les observe. Ca vous rappelle la 
mécanique quantique ? Alors prenons un exemple concret : 

Le client 1 deop le client 2, et au même instant (disons à un 
dixième de seconde près), le client 2 deop le client 1. 
Sur le serveur A, le deop du client 1 arrive avant le deop du 
client 2. Pour A, 2 est deopé par 1. D'autre part, sur le serveur B, 
le deop du client 1 arrive après celui du client 2. Pour B, 1 est 
deopé par 2. 
Puis, comme pour tout message, chaque serveur propage le message 
de deop qu'il a reçu à ses voisins... 
 
Mais dans notre cas, quand le deop du client 1 arrive sur le 
serveur B, 1 n'est plus op, donc le serveur B signale gentiment 
l'erreur au client 1 : "You are not channel operator". Inversement, 
le deop du client 2 ne prendra pas effet sur le serveur A. 
 
Nos deux serveurs sont maintenant dans deux états différents, et 
vont le rester ! En effet, il y a égalité entre les serveurs, donc 
il n'y a pas de raison que l'un d'eux l'emporte sur l'autre. 

Server-op

Il ya deux façon de devenir op sur un channel : 
Se faire oper par un utilisateur op 
Se faire oper par un serveur 
Pour se faire oper par un utilisateur, il faut demander au Monsieur. 
Se faire oper par un serveur, c'est simple comme bonjour : il suffit 
de joiner un channel vide ! Eh oui, lorsqu'on arrive sur un channel 
vide, c'est le serveur sur lequel on est connecté qui nous op. 
Sympa non ? 

Maintenant, voyons comment on peut utiliser notre désynch' pour 
se faire oper : 

D'abord, on kick le client 2. 
Evidemment, comme client 1 n'est pas op sur le serveur B, le 
client 2 ne va s'apercevoir de rien. Pour lui on a l'air bien sage. 
Maintenant, on quitte notre channel. Pour le serveur A, le channel
n'existe plus. 
Puis on revient ! 
Qu'est-ce qui se passe ? Et bien pour le serveur A, on vient d'entrer 
sur un channel vide, donc il nous op. Et en bon serveur qu'il est, il 
informe les autres serveurs qu'il nous a opé sur ce channel. Sur le 
serveur B, le client 2 voit de ses yeux ébahis le serveur A nous oper :-) 

Avertissement

Cette méthode peut très bien fonctionner pour prendre le pouvoir 
sur un channel. Sachez que les IRCOPs ont des moyens de surveiller 
les désynch', notamment en allant sur le canal local &channel (tout 
le monde peut y aller). Créer volontairement des désynch' est un très 
bon motif pour se retrouver banni des serveurs IRC. 

Logs

Si vous n'avez pas cru un mot de ce que j'ai raconté, voici un petit 
log. Mechant et Gentil sont sur deux serveur differents, et sont au 
depart tous les deux ops (suite a un netjoin par exemple). 

*** Users on #Glop: @Mechant @Gentil  
*** Mode change "-o Gentil" on channel #Glop by Mechant  
*** Gentil has been kicked off channel #glop by Mechant (Mechant)  
*** Users on #Glop : @Mechant  
*** Mechant has left channel #Glop (Mechant)  
*** Mechant (blured75@ted.via.ecp.fr) has joined channel #Glop +o  
*** Users on #Glop: @Mechant	

*** Users on #Glop: @Mechant @Gentil 
*** Mode change "-o Mechant" on channel #Glop by Gentil 
*** Users on #Glop : @Gentil Mechant 
*** Mechant has left channel #Glop (Mechant) 
*** Mechant (blured75@ted.via.ecp.fr) has joined channel #Glop +o 
*** Users on #Glop : @Mechant @Gentil

Après la désynch', Mechant peut quitter et joiner le channel autant 
de fois qu'il veut se faire oper par le serveur sur lequel il est. 
Ce server-op apparait ici au niveau du "+o" qui figure en fin de 
la ligne de join de Mechant : 

*** Mechant (blured75@ted.via.ecp.fr) has joined channel #Glop +o . 

Cela peut aussi apparaître sous la forme d'un 

*** Mode change "+o Mechant" on channel #Glop by irc.glop.fr 

juste après le join sur les anciennes version de serveur. 
Essayez par vous même !

Les serveurs fred.via.ecp.fr et ted.via.ecp.fr sont à votre 
disposition pour toutes les expériences possibles; ils font partie 
d'un réseau expérimental, l'ECPnet. Par contre, n'essayez pas sur 
des serveurs officiels, vous risqueriez d'en être banni. 

************************************************************************

IRC-Nets

Voici une petite liste de serveurs sur lesquels on peut se connecter 
depuis la France. Vous trouverez une liste et des cartes complètes 
de serveurs sur le site de #IRChelp . 

Principaux serveurs

IRCnet 

130 serveurs, 25.000 utilisateurs 
sil.polytechnique.fr 
irc.enst.fr 
irc.emn.fr 
irc.grolier.net 
salambo.Enserb.U-Bordeaux.Fr 
irc.insat.com 
IRC.Eurecom.FR 
irc.funet.fi 
irc.stealth.net 
irc.webbernet.net 

EFnet 

70 serveurs, 40.000 utilisateurs 
irc.ec-lille.fr 

Ce serveur français, normalement connecté à IRCnet, s'est exilé sur 
EFnet suite à de sombres histoires d'IRCOP...

Undernet 

40 serveurs, 25.000 utilisateurs 
Caen.Fr.Eu.UnderNet.org 
Diemen.NL.EU.undernet.org 

DALnet 

30 serveurs, 20.000 utilisateurs 
taxi.ny.us.DAL.net 
Serveurs divers

ECPnet 

Petit réseau deviendra... petit. 
tibob.via.ecp.fr 
LinuxNET et LISC 

Pour parler de Linux. 

irc.blackdown.org 
irc.debian.org 
Microsoft Network 
Ou les RFCs bafoués en tous points. 
irc.msn.com 

SandNET 

Un réseau sympa avec services de registration 
stlouis-mo-sandnet.ml.org 

UltraNET 

Le réseau de Club-Internet 
neuilly.fr.eu.ultranet.org 

Gamma Force 

Petit réseau Nord Americain 
phantom.ultranet.ca 

Spririt Web 

Serveur en mal de connectés 
irc.spiritweb.org 

KidLink et Kids World 
Dédié aux enfants, il faut d'abord s'inscrire.

************************************************************************

BOT	

Introduction

Je vous propose de construire étape par étape, de manière simple, un 
robot IRC. 

Connexion à une machine

Connexion

D'abord votre bot va devoir se connecter à un serveur. Vous trouverez 
ici (voir fichier annexe - prog_irc.txt) un petit programme en Python 
qui ouvre une socket en TCP sur le port 6667, exactement comme le ferait 
un client IRC "normal". Voici la version en C, (idem) un moins parlante. 
Vous pouvez aussi établir cette connexion "à la main" en tapant 
simplement sous UNIX :

telnet <server> 6667 

Par exemple : 

ted:~>telnet irc.funradio.fr 6667 

Trying 138.195.128.128... 
Connected to tibob.via.ecp.fr. 
Escape character is '^]'. 

Sous Windows, il suffit de faire "connexion distante", et préciser, en 
plus de l'hôte, le port "6667" au lieu du port "telnet". 
Maintenant, on est connecté, mais on n'est pas encore authentifié au 
niveau du serveur IRC. 

Login

Le Login est une phase ou le client donne les infos nécessaires pour 
que le serveur nous "enregistre". Le protocole est une fois de plus 
défini dans le RFC 1459 (idem voir fichier annexe) au paragraphe 4.1, 
et se résume à peu pres à : 

envoyer une première ligne : NICK <nick> 
envoyer une seconde ligne  : USER <username> <hostname>
				<servername> <realname> 
<username> est le login 
<hostname> le nom de machine 
<servername> est le nom de serveur 
<realname> est l'IRCNAME qui apparait lors d'un whois 

Remarques : 

N'oubliez pas le [enter] en fin de ligne ('\n' en C) 
hostname et servername sont ignorés par le serveur (ca ne sert que 
lorsque deux serveurs discutent entre eux) 
username sera remplacé par le vrai login si la machine depuis laquelle 
on se connecte a un démon d'identification (identd). C'est le cas de 
la plupart des machines. 

Certains serveurs demandent un mot de passe, qui doit etre specifié 
dans une troisième ligne : PASS <password> 

Certains serveurs vont envoyer un PING :<numéro>, auquel cas on 
devra répondre avec un PONG <numéro> pour terminer l'enregistrement. 

Voyons cela en pratique : 

ted:~>telnet irc.funradio.fr 6667 

Trying 138.195.128.128... 
Connected to tibob.via.ecp.fr. 
Escape character is '^]'. 
USER toto titi tata tutu 
NICK toutou 
:tibob.via.ecp.fr 001 toutou :Welcome to the Internet Relay Network 
			      toutou!fred@ted.via.ecp.fr
 
:tibob.via.ecp.fr 002 toutou :Your host is tibob.via.ecp.fr, 
			      running version 2.9.4 

:tibob.via.ecp.fr 003 toutou :This server was created Tue Feb 24 1998 
			      at 19:32:22 CET 

:tibob.via.ecp.fr 004 toutou tibob.via.ecp.fr 2.9.4 oirw abiklmnopqstv 

La plupart des clients exécutent alors immédiatement les deux 
commandes suivantes :

LUSER (vous affiche des infos sur les connexions de ce serveur) 
MOTD (vous affiche le "Message Of The Day") 

Une fonction qui effectue le LOGIN est très simple; en voici un 
exemple en Python et en C (voir annexe). 

On a maintenant un robot capable de faire de l'IRC, c'est déjà beaucoup ! 

PING ? PONG !

Malheureusement, l'espérance de vie de notre robot est, à cet instant,
limitée à quelques minutes seulement. En effet, si l'on poursuit 
notre "TP", on voit apparaître au bout d'un instant :

PING :tibob.via.ecp.fr 
ERROR :Closing Link: toutou[fred@ted.via.ecp.fr] (Ping timeout) 
Connection closed by foreign host. 

Le serveur nous envoie un PING pour vérifier que la connexion est 
bonne. Il faut répondre... PONG bien sûr ! C'est ce qu'on appelle 
"le challenge" du serveur. (voir annexe)

PING après le PONG :

PING :tibob.via.ecp.fr 
PONG :tibob.via.ecp.fr 

S'il n'y a pas de PONG, le serveur envoie un message d'erreur et 
ferme la connexion. Le délai pour répondre est de l'ordre d'une 
minute, selon les serveurs, mais on a tout intérêt à répondre le 
plus tôt possible !

Voici une fonction en Python ou en C qui écoute sur la socket
que l'on a ouvert, et repond en cas d'un eventuel PING. 

Zebot

Parfait, toutes les fonctions vitales d'un bot sont là. On peut 
les assembler pour faire un bot qui va se connecter et rester 
connecté indéfiniment : c'est Zebot, le bot zéro, et son homologue 
en Python Pybot (voir annexe).

On peut même faire un script Shell, qui effectue les opérations de 
notre "TP", puis rentre dans une boucle qui PONG; c'est le Sh-Bot.
Attention, c'est programmé au plus simple. On remarquera que le 
programme plante si on flood le bot par exemple. A perfectionner ! 

Sockets

Introduction

Zebot, tel qu'il a été construit, n'a aucun avenir. On verra le 
problème de structure tout à l'heure, mais avant cela il y a deux 

problemes de socket : 

Zebot a une socket bloquante : il ne peut absolument rien faire 
pendant qu'il fait son read(sock, buff, MAX_SIZE-1). 
Zebot n'écoute que sur une seule socket. 
Or un bot doit pouvoir faire plusieurs choses pendant qu'il 
écoute sur le réseau, et il doit aussi pouvoir écouter sur 
plusieurs sockets, s'il accepte les DCC CHAT par exemple. 

Select/fd_set

Ce paragraphe va etre très technique, mais apporte une solution 
propre à nos deux problèmes. 

fd_set 

On déclare une variable globale de type fd_set, nommée fdused. 

#include <string.h> /* FD_SET */ 
extern fd_set fdused; /* liste des sockets sur lesquelles on 
fait le select */ 

Puis on suit la procédure suivante : 

Initialisation 

Une petit fonction d'initialisation : 

void initsocket(void) 
{ 
sockmax=0; 
FD_ZERO(&fdused); /* initialisation de fdused */ 
} 

Ajout d'une socket 

A chaque fois que l'on va ouvrir une nouvelle socket (un nouveau 
DCC CHAT ou une nouvelle connexion à un serveur), on va appeler 
la fonction suivante : 

void addsocket(int sock) 
{ 

FD_SET(sock,&fdused); /* on note dans fdused que la socket 'sock' 
est utilisee */ 
if(sock>sockmax) /* on a besoin de connaitre le plus grand */ 
sockmax=sock; /* numero de socket pour le select */ 
printf("Added sock %d\n", sock); 
} 

Effacement d'une socket 

Inversement, si l'on doit fermer une socket, on appellera : 

void delsocket(int sock) 
{ 
FD_CLR(sock,&fdused); 
if(sock==sockmax) 
{ 
while(--sock>0) 
if(FD_ISSET(sock,&fdused)) 
break; 
sockmax=sock; 
} 
} 

puis on fermera la socket : 

close(sock);

Select 

Maintenant, voyons comment nous allons pouvoir écouter sur toutes 
les sockets positionnées dans fdused, tout en faisant autre chose. 
La fonction select prend 5 arguments. Le premier est le numéro de 
socket le plus grand plus un ! (sockmax +1). Le second est notre 
fdused. Les 3e et 4e sont NULL. Le dernier est le temps au bout 
duquel on sortira du select même si on a rien reçu. C'est grâce 
à ce dernier argument qu'on pourra reprendre regulièrement la main 
pour faire autre chose (toutes les 100ms par ex.). 

Note : si on reçoit quelquechose, on sort tout de suite du select. 

fd_set fdread; 
int status; 
char buff[512]; 
struct timeval timeout={0L, 100000L}; /* .1 second max. in select */ 
memcpy(&fdread, &fdused, sizeof(fdused)); /* on fait une copie de fdused */ 
while((status=select(sockmax+1, &fdread, NULL, NULL, &timeout))<0) 
warn_log("receive: Error receiving socket"); 
timeout.tv_sec=0; /* timeout a été effacé par select */ 
timeout.tv_usec=100000; /* donc il faut le remettre a 0.1 sec */ 

Si la variable status est à 0, c'est qu'on est sorti par timeout, 
donc il n'y a rien dans les sockets. Par contre, si status n'est 
pas nul, il faut aller voir ce qui a été reçu sur chacune des sockets. 

Supposons qu'on ait une structure socket, avec un numéro de socket, 
socket.number, et un pointeur sur la socket suivante, socket.next 
(le dernier pointant sur NULL). first_socket est notre première socket. 

for(reactor=first_socket; reactor!=NULL; reactor=reactor->next) 
if(FD_ISSET(reactor->number, &fdread)!=0) /* On regarde s'il y a 
quelquechose dans cette socket */ 
read_msg(reactor); /* Il y a quelquechose, on appelle une fonction 
qui fera un read(reactor,...) */ 

On remarquera que le select ne lit pas les données. Il permet juste 
de savoir s'il y en a en attente ou pas.

Conclusion

On a maintenant le nécessaire pour gérer un nombre illimité de 
sockets. Il reste bien sur à écrire les fonctions read_msg qui 
lisent les messages reçu, les traitent, et réagissent en fonction 
de leur contenu. 

Configuration

Dernière chose avant de passer à la structure du bot : le parsage 
de la configuration. En effet, il ne faut pas faire comme dans 
Zebot où l'on a codé en dur l'adresse du serveur par exemple.
Généralement, on fait un fichier contenant les informations sur 
les serveurs IRC, un autre sur les utilisateurs du robot, avec 
leurs droits. Le robot doit lire ces fichiers au lancement, et 
sauvegarder sa configuration dedans au cours de son fonctionnement. 
Le parsage des fichiers est quelquechose d'assez fastidieux à coder 
en C. On peut utiliser Lex et Yacc. Ce système de fichiers de 
configuration permet de ne pas avoir à recompiler le bot à chaque 
changement de configuration, ce qui est appréciable !

Structure

Voilà, on y est ! Voyons d'abord les quatres fonctions du bot :
Le parser s'occupe de traiter les messages reçu sur les sockets. 
Le if s'occupe d'appeler les fonctions concernées par le message reçu. 
Les fonctions réagissent en fonction du message reçu. C'est le coeur 
du robot. 

La queue s'occupe de traiter les information sorties des fonctions 
pour les envoyer au serveur. 
 
La Queue

Il faut absolument faire une fonction qui récupère les messages 
générés par les fonctions et les envoie vers le serveur IRC. En 
effet, si toutes les fonctions envoient des données directement 
dans les sockets, on a aucun contrôle sur le débit envoyé. Si 
toutes les fonctions parlent en même temps, le bot va flooder 
le serveur IRC. Il risque alors de se faire déconnecter. Toutes 
les fonctions doivent donc impérativement envoyer leur données 
vers une fonction qui les stocke, et les envoie progressivement. 
Malheureusement, il n'y a pas d'algorithme sûr pour calculer le 
débit que l'on peut envoyer sans flooder le serveur. Il vaut 
mieux le déterminer expérimentalement, selon le serveur. 
S'il y a beaucoup de messages en attente, la fonction de queue 
peut se charger aussi d'optimiser : passer les messages 
importants avant les autres, regrouper les modes, etc... 

Le Parser

Le parser obtient les données brutes venant du serveur. Par exemple : 

:toto!hero@glop.via.ecp.fr PRIVMSG #glop :Salut ! 

Il va se charger par exemple de séparer le nick, le login et le 
host, et mettre tout ça dans un belle structure. Un peut aussi 
en profiter pour rechercher les droits de la personne en question 
dans une userlist enregistrée quelquepart. Par exemple : 

struct message { 
struct user { 
char *nick; 
char *login; 
char *host; 
int user_level; 
} *from; 
char *commande; 
char *to; 
char *texte; 
}; 

Ensuite, le parser passe cette structure au "if"... 

Le "If"

Il s'agit en fait de la moulinette qui va aiguiller la structure 
envoyée par le parser vers les fonctions qui doivent être appelées. 
Cela peut être une opération très basique, comme une succession de 
"if(!strcmp(parsed_msg->commande, "PRIVMSG")) ..." ou autre chose 
de plus compliqué (voir Lignus II, quand le site sera fait...). 

Les fonctions

Ce sont les fonctions qui constituent l'âme du bot. Les autres 
modules ne sont que des interfaces. Un fonction peut être très 
simple : quand elle reçoit un PING :%s, elle renvoie un PONG :%s, 
ou très complexe (selon l'imagination du concepteur). 

Listes doublement chaînées

Un bot, c'est plein d'allocations dynamiques. Il est donc 
conseillé d'utiliser des listes doublement chaînees : c'est 
plus pratique et plus sûr.


Annexes (fichiers joints dans le package) :
La version en C :
socket.c

Le RFC 1459 sur l'IRC
-irc_rfc_fr1459.htm

Fonction qui effectue un login en Python :
-log_in.py

Le même en C :
-log_in.c

Fonction qui écoute sur le socket que l'on a ouvert et répond en cas 
d'un éventuel PING (en python) :
-pong.py

Fonction qui écoute sur le socket que l'on a ouvert et répond en cas 
d'un éventuel PING (en C) :
-pong.c

Script de ZeBot en Python :
-pybot.py

Script de Zebot en C :
-zebot.c

Zebot en script sh --> ShBot :
-bot.sh

Et petit cado :

Connection à un serveur irc en python :

#! /usr/bin/python 
# On importe toutes les fonctions de la librairie "socket" 
from socket import * 

host = 'blured.via.blurhost.fr' 

# On resoud le nom de machine 
hostaddr = gethostbyname(host) 
# On ouvre une socket 
# AF_INET - type Internet
# SOCK_STREAM - type TCP (par opposition avec UDP) 
sock = socket(AF_INET, SOCK_STREAM) 
# Et on se connecte ! s
ock.connect(host, 6667) 
# Et voila ! 


Blured