Bot irc c++ faconnable et extensible avec architecture evenementielle (mvc like). gere des comptes utilisateurs et extension

Soyez le premier à donner votre avis sur cette source.

Vue 9 820 fois - Téléchargée 616 fois

Description

Ce programme utilise les librairies boost, mysqlpp (et donc mysql classique). Il a été programmé de façon portable, mais n'a jamais été compilé/testé sous linux. Merci de me reporter les erreurs éventuelles. Lire Readme.txt dans le zip pour plus d'informations sur la compilation.

Voici un bot irc sur lequel je travaille maintenant depuis pas mal de temps. La source contient tout d'abord un dossier dl_source, (Dynamic Library Source), où se situent les fichiers constituant la bibliothèque du bot : gestion des user irc, de la lecture des options jusqu'au logging des erreurs, en passant par les socket, ce sont de mini librairies en C++ proposant une approche orientée objet que le bot utilise. Ce dossier contient également MinXL, une mini API pour parser le XML téléchargée depuis codes-sources, et une implémentation de SHA1 (aussi de codes-sources).

Mais le plus important reste la gestion des évènements, orchestrée par trois fichiers : event.cpp/.hpp, listener.cpp/.hpp, dispatcher.cpp/.hpp.
Le fichier dispatcher contient une classe qui gère tout le bas-niveau associé à la programmation d'un bot irc : les socket, le protocole irc, l'analyse des réponses serveur pour en tirer des informations...cette classe lance un thread qui lit toutes les réponses du serveur, et lorsqu'il reçoit des données susceptibles d'intéresser les couches de plus haut niveau (réception d'un message, un utilisateur a quitté le serveur, etc...) il créer un objet de type event (message_event, quit_event, etc...) qui contient toutes les informations qu'il a pu tirer de l'analyse via les expressions régulières des données reçues, et il envoie cet évènement aux classes qui se sont enregistrées auprès de lui en tant que listener. Il met l'évènement dans une queue, qu'un autre thread indépendant vide en permanence (il utilise wait() pour ne pas bouffer tout le CPU). C'est pour ça qu'à la limite, cette classe pourrait tout à fait être utilisée pour programmer un client irc car c'est une sorte d'interface avec le protocole irc permettant aux autres classes de ne s'occuper que du haut niveau. La classe event_dispatcher propose également, dans l'autre sens, des méthodes pour converser avec le serveur : send_message(), send_notice(), send_command()...etc... voir dispatcher.hpp pour une plus ample descriptions (dossier dl_source)

On peut noter aussi la présence d'une classe io_interface dans le fichier dabaseio.hpp, qui définit une interface avec un support de données générique. Ainsi, le bot gère le stockage et l'accès aux comptes utilisateurs de façon abstraite, sans s'occuper de quel manière les données sont réellement stockées : sur le disque, dans une base de données, etc...une interface pour une base mysql est fournie et utilisée par défaut, mais vous pouvez très bien définir la votre. Voir dabaseio.hpp et mysql_impl.hpp (et main.cpp pour changer l'interface utilisée) pour plus d'informations (dans le dossier dl_source, toujours).

Le bot est également capable de charger en cours d'exécution des extensions : en réalité, le bot de base fourni ici gère la gestion des comptes utilisateurs, quelques commandes utilitaires, et les modules, mais est surtout destiné à accueillir ces extensions qui définiront vraiment ses fonctionnalités. Une description des plugins (nom, description, auteur, paramètres d'initialisation, etc...) est faite dans un fichier XML. Chaque module a une librairie dynamique associée (.dll sous windows, .so sous linux) que le bot ouvre en temps réel pour chercher les fonctions dont il a besoin. Les modules jouissent des mêmes avantages que le bot (c'est pour ça que la bibliothèque de bot est dans une librairie dynamique (ou partagée) : les modules doivent pouvoir en profiter), notamment au niveau de l'event_dispatcher et du niveau d'abstraction. Ils bénéficient de toute la librairie du bot. Pour des informations plus précises sur le fonctionnement des modules, voir le fichier bot_source/plugin.hpp.

Le tout fait un programme assez conséquent, et parfois un peu fouilli (trop de classe tue la classe...) mais j'ai essayé de programmer de la façon la plus claire et logique possible. Il manque aussi un peu de commentaire, même si je me suis efforcé d'en mettre un maximum, aussi si vous avez besoin d'un éclaircissement sur une partie précise, dîtes-le moi.

Pour une documentation plus complète, lisez les commentaires de début de fichier, surtout ceux des en-tête (.hpp), qui comportent souvent des précisions intéressantes. Lisez aussi le fichier Readme.txt contenu dans le zip. Pour des questions, n'hésitez pas à poster des commentaires ici.
Merci de votre lecture !

Source / Exemple :


Voir dans le zip (trop de code pour mettre ici ^^)

Conclusion :


comme précisé plus haut, n'a pas été testé en compilation/exécution sous linux.
Bug connu : segfault tout à la fin du programme (donc pas gênant), mais intriguant tout de même. Il semblerait se situer dans le destructeur de la classe bot (fichier : bot_source/bot.cpp).

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
9
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
25 septembre 2007

De rien ^^
C'est vrai que c'est imposant mais bon faut pas se fier au nombre de fichier, comme expliqué dans readme.txt, ya beaucoup de headers qui sont en double. Et puis j'ai voulu faire des truc bien séparés ;)
En tout cas si tu as des questions/suggestions n'hésite pas...
Messages postés
32
Date d'inscription
samedi 16 avril 2005
Statut
Membre
Dernière intervention
13 février 2010

Vu le descriptif, y a l'air d'y avoir du boulot!
Je prend pour regarder :)) (et apprendre des choses)
Merci ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.