Un bot IRC

18/04/2005 11:40:35

Ca faisait longtemps, non ? Me revoilà !

Depuis quelques jours, je m’intéresse à la programmation de bots IRC. Vous pensez probablement que j’ai dû apprendre le langage de script de mIRC pour pouvoir m’amuser avec. Ben non. Je n’ai pas programmé mon bot avec mIRC mais en PHP.

Je vois d’ici certains visages ébahis. Il faut se rappeller certaines caractéristiques de PHP :

  • PHP peut ouvrir des sockets, c’est à dire des connexions TCP ou UDP sur un hôte.
  • Les scripts PHP peuvent être éxécutés sur une page web OU de façon autonome en utilisant l’éxécutable php. Cette caractéristique permet de programmer n’importe quelle application autonome. Elle s’éxécutera alors en mode texte (dans un shell sous Linux, dans une invite de commandes sous Windows), mais on peut aussi créer de véritables applications graphiques grâce à PHP-GTK, une extension permettant d’utiliser la librairie d’interface graphique GTK de Gnome dans PHP.

J’ai tout d’abord regardé la RFC IRC et j’ai été découragé par le nombre colossal de situations que le client doit gérer (je commence à comprendre pourquoi il y a si peu de clients IRC disponibles). J’ai donc cherché une librairie « toute faite ». J’ai vu l’extension IRCG de PHP mais celle-ci ne m’inspirait rien (on a l’impression qu’elle est laissée à l’abandon, elle n’est pas très puissante, et elle n’est pas libre).

Et je suis tombé sur LA merveille : SmartIRC. Il s’agit d’un ensemble de classes entièrement codées en PHP et qui permettent de faire absolument tout ce que l’on peut faire sur un serveur IRC. J’ai regardé le code source et j’ai été réellement impressionné par la beauté et la propreté du code, découpé de façon quasi-parfaite, sans aucune fiorture. A côté, mon architecture MVC ressemble à une veille baraque branlante.

SmartIRC fonctionne selon un principe simple : on se connecte au serveur, on s’identifie, on joint un ou ou plusieurs channels, et on le met en mode « listen ». Ce mode, comme son nom l’indique, « écoute » ce que le serveur lui envoit. Ce n’est que dans ce mode que les commandes précédentes sont réellement éxécutées. On ne peut rien faire dans le programme quand SmartIRC écoute, mais c’est une limitation technique de PHP, langage procédural qui n’a pas vraiment été conçu pour ça. Avant d’écouter, on précise à SmartIRC sur quel « évenement » il doit s’arrêter (par exemple quand quelqu’un dit quelque chose sur un channel, quand quelqu’un sort, quand quelqu’un rentre, etc.), et on lui précise un callback (pointeur vers une fonction ou une méthode de classe) qu’il appellera quand l’évenement se produira. La fonction appellée par le callback peut alors réagir en conséquence, et demander au client d’effectuer des actions précises telles que parler, faire un query, un whois, oper quelqu’un, voicer, et tout ce que peut faire un client sur un serveur IRC.

Il en résulte une différence fondamentale avec un script PHP normal : alors qu’un script pour le Web fonctionne de manière procédurale (le programme éxécute une série d’actions puis envoie le résultat et se ferme), un bot IRC fonctionne de manière évenementielle (le programme attend qu’il se passe quelque chose et réagit en conséquence). Vous vous doutez probablement que l’architecture de programmation ne peut évidemment pas être la même. Une architecture MVC est procédurale par nature et n’est donc vraiment, mais alors vraiment pas du tout adaptée pour un modèle aussi évenementiel que celui d’un bot IRC. J’ai donc créé ma propre architecture pour mon premier bot. Celle-ci est pour l’instant bien moins complexe que mon architecture pour le Web (ce qui est normal vu qu’il s’agit de mon premier bot), mais elle reste quand même très fonctionnelle. L’élément principale de cette nouvelle architecture est le Handler dont le but est de recevoir les événements et d’appeller les méthodes adaptées.

La grande polyvalence de PHP combinée à IRC permet de faire des choses jamais vues pour un bot. Non seulement la programmation de bots est bien plus facile et rapide (SmartIRC, bien que déroutant au début pour le programmeur PHP adapté au modèle procédural, reste assez simple à utiliser), mais surtout cela permet d’établir des passerelles entre IRC et d’autres technologies : mon premier bot, très simpliste et doté d’une seule commande, lisait le flux RSS de StargateTC.com, donnait les 5 dernières news sur le channel sur simple demande avec la commande !news, et prévenait automatiquement quand une nouvelle news arrivait ! RSS > XML > HTTP > DOM > IRC. Imaginez faire ça avec un bot mIRC classique ! L’éventail des possibilités est quasiment infini. Imaginez un bot d’administration de channel (qui ope automatiquement par exemple) qui tire ses informations d’une base de données MySQL et doté d’une interface d’administration Web ! Grâce à PHP et SmartIRC, c’est possible, et ça ne présente même aucune difficulté majeure.

Bien sûr, tout n’est pas aussi joli. Premièrement, un bot d’administration requiert que vous possédiez une machine connectée au Net 24h/24. Deuxièmement, SmartIRC n’est que dans une version Beta, et bien que je n’aie remarqué aucun bug et qu’elle soit entièrement stable, il est possible qu’il y ait des problèmes. Enfin, SmartIRC dans sa version « normale » (version 0.5.5) n’est pas compatible PHP 5. Mais fort heureusement, on peut télécharger les fichiers du CVS, qui, eux, sont compatibles.

Personnellement, j’ai déjà codé deux bots : le premier est le bot de passerelle RSS dont je vous ai parlé, mais il est assez mal codé (vu qu’il s’agit de mon premier et que c’était plus un test qu’autre chose), et un deuxième bot plus gros permettant d’organiser une partie de Morpion entre deux personnes sur un channel IRC. Le plateau est symbolisé par des caractères ASCII et le bot gère les tours, les victoires, les matchs nuls, les mouvements, etc. Dans sa dernière version (1.5), je l’ai même doté d’un mode « Manager » qui s’active dès que le Bot est opé et qui lui permet de gérer automatiquement les « voicés » du Channel durant une partie afin d’éviter les perturbateurs. Pour information, grâce à la grande simplicité de PHP, j’ai pu sortir une première version en seulement 3 heures. Je ne connais pas le langage de script de mIRC, mais je suis persuadé que ça aurait pris beaucoup plus de temps avec ce langage. Si vous désirez le voir en action, rejoignez-moi sur #SGTC-Games.irc on Quakenet, channel créé spécialement pour l’occasion, et queryez moi pour que j’amène le bot sur le channel.

Bon, et qu’est ce que je fais maintenant ? Je suis en train de réfléchir à une nouvelle idée de bot ;)

Rédigé par e-t172 |

Les commentaires sont fermés.

URL de trackback |