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.
Hughobot v1.0
Description des charges remplies par le "moteur" ou la couche de base, qui s'occupe de dispatcher les évènements:
-se connecter à un serveur irc quelconque en tirant les informations de connexions nécessaire soit d'un fichier de configuration (hughobot.cfg, vous pouvez le changer en bidouillant main.cpp), soit de la ligne de commande, soit des deux (en sachant que les options de la ligne de commande prime sur les options du fichier). Utilisez l'option --help pour plus d'information.
-lire les réponses serveur et les analyser correctement selon leur type (message, notice, kick, etc...). En tirer les informations nécessaires au traitement (auteur du message, destinataire, quel salon, etc...) grâce au regex pour les transmettre au bot.
-une fonction de logging évoluée est utilisée. Utilisez l'option --help pour plus d'informations sur les options --loglevel ou --logfile.
Description des charges remplies par le bot à proprement dit:
-gère des comptes utilisateurs via un support de données interchangeable (vous pouvez écrire votre propre interface pour un disque, des socket, un bdd, etc...). Un support pour base mysql est utilisé par défaut. Cryptage des mdp en SHA1.
-gère l'ajout de plugin. Un fichier XML est utilisé pour leur description (nom, paramètres d'initialisation [un peu comme pour des applet], description [non obligatoire], etc...). Ce fichier est par défaut plugins.xml, modifiable via l'option --plugins-descriptor. Dans ce fichier est spécifié l'emplacement de la librairie dynamique (.dll / .so selon que ça soit sous win ou nux) que le bot doit charger. Cette librairie doit contenir une classe fille de la classe module (voir dl_source/module.hpp) et une fonction create_module(const module_environnement& me) qui doit fournir une nouvelle instance de la classe contenue dans la librairie. (Lire les commentaires de dl_source/module.hpp et bot_source/plugin.hpp pour plus d'informations).
---N.B. : sont gérer par mysql également les droits relatifs aux commandes, pour celles qui nécessitent un certain accès (administrateur, opérateur, etc...).
-propose un ensemble de commandes sur irc pour gérer ces deux aspects : s'identifier, créer un nouveau compte, modifier l'accès d'un utilisateur (opérateur), etc...
ou
charger un module sur un salon, le décharger, lister les modules, etc...
une commande help pour obtenir de l'aide sur une commande particulière (!help "commande"). Une commande quit pour que le bot quitte le serveur.
---N.B. : les commandes sur irc doivent commencer par le caractère "!".
-une fonction de logging évoluée est utilisée. Utilisez l'option --help pour plus d'informations sur les options --loglevel ou --logfile.
Bug connus:
-Lorsque la commande quit est utilisée, le message "Appuyez sur la touche [ENTREE] pour continuer" s'affiche. On appuie sur entrée pour terminer le programme, une erreur de segmentation (segfault) se produit tout à la fin, apparemment dans le destructeur de la classe bot. Le bug n'étant pas gênant, je ne l'ai pas résolu immédiatement puis je l'ai oublié, je pense le corriger bientôt.
INFORMATIONS PLUS PRECISES SUR LE FONCTIONNEMENT DU BOT (DEVELOPPEURS)
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).
Le moteur, ou basse couche : càd la gestion des évènements est orchestrée par trois fichiers : event.cpp/.hpp, listener.hpp, dispatcher.cpp/.hpp (dossier bot_source).
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 lorsque la queue est vide). C'est pour ça qu'à la limite, cette classe pourrait tout à fait être utilisée pour programmer un client irc car elle 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. Une classe io_settings définit des méthodes statiques pour pouvoir modifier l'interface utilisée dans modifier le code du bot. Celui-ci obtient sont interface grâce à io_interface::get_current_interface(). Si vous écrivez votre propre interface, il suffit de remplacer dans main.cpp les lignes (io_settings::set_current_interface(interface_sql)) par (io_settings::set_current_interface(mon_interface_pointeur)). 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 du 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.
Si vous avez des problèmes, trouvez de gros défauts, avez des suggestions, des question, etc...
n'hésitez pas à demander
__________________________
Lorsque touts les arbres auront été coupés, Lorsque touts les animaux auront été chassés, Lorsque touts les poissons auront été pêchés;
Alors l'homme découvrira que l'argent ne se mange pas.
------ |_o/e _|a/a---------
Nouvelle mise à jour, ajout d'une fonction wait_numeric_responses() qui permet d'envoyer une commande et de demander au thread de retenir des réponses particulières, jusqu'à rencontrer une réponse de fin de commande ou une réponse d'erreur (tout les codes de réponses sont spécifiés à la fonction).
La fonction bloque donc en utilisant une boost::thread::condition (un wait()). On peut spécifier un timeout, 0 par défaut (=désactivé).
Une illustration de l'utilité de cette fonction est fournie via une autre fonction whois() qui permet d'otenir sous forme de structure les informations renvoyées par la commande WHOIS <user>. Ajout également de l'ensemble des réponses et erreurs serveurs possibles (référence à la traduction en fr de la rfc 1459 en mars 1993, donc il manque peut être des constantes) sous forme de constantes numériques dans l'en-tête dl_source\irc.hpp (comme static const unsigned short RPL_ENDOFWHOIS = xxx; ou encore static const unsigned short int ERR_NOSUCHUSER = xxx;)
__________________________
Lorsque touts les arbres auront été coupés, Lorsque touts les animaux auront été chassés, Lorsque touts les poissons auront été pêchés;
Alors l'homme découvrira que l'argent ne se mange pas.
------ |_o/e _|a/a---------