Windrop Programmation TCL 2010/2011
Voici un tutoriel sur Windrop. Ce tutoriel a été trouvé sur le blog http://appswarren.wordpress.com/. Il est impératif d avoir des notions en SQL pour ce qui concerne la partie MysqlTCL. Il est utile de se documenter sur la programmation en TCL si on veut pousser les choses un peu plus loin. Logiciels nécessaires à ce tutoriel : a) Eggdrop v1.8 CVS : disponible sur le site : http://windrop.sourceforge.net/downloads.html Télécharger Eggdrop, ensuite extraire les fichiers dans un répertoire au choix : nous utiliserons «C:\Windrop». 1) Configuration de Windrop Aller dans le répertoire d installation «C:\Windrop». Ouvrir le fichier «eggdrop.conf» avec un éditeur de texte, le bloc note par exemple. Voici des exemples de modifications : du nom d utilisateur sur IRC : set username "VotreBot" d informations sur l utilisateur : set admin "VotreBot <email: VotreBot@VotreBot.be>" d informations concernant le server : set network "Linknet" du fuseau horaire pour la Belgique : set timezone "CET" et set offset "-1" du fichier contenant les logs du channel : logfile jpk channeltest "logs/channeltest.log" du fichier contenant les utilisateurs : set userfile "VotreBot.user" du fichier contenant les chans : set chanfile "VotreBot.chan" du pseudo : set nick "VotreBot" du pseudo alternatif: set altnick "VotreBotbis" du nom du bot : set realname "Mr VotreBot" du script tcl apres connexion au server : proc evnt:init_server {type {global botnick putquick "MODE $botnick +his-w" du port par défaut et du ssl : set default-port +7000 du server où le bot se connecte : set servers {eu.link-net.org:+7000 du ssl-verify-server: set ssl-verify-server 1 Pour utiliser le DCC CHAT afin de communiquer avec le «Bot», on doit ajouter cette ligne : listen 3333 users. Telnet ne sera ainsi accessible que pour les utilisateurs! Windrop 2 Version 1.0 du document
Ensuite, ajouter un devant : - source scripts/winident2.tcl car on ne l utilise pas ; - die "Please make sure you edit your config file completely."; - die "You didn't edit your config file completely like you were told, did you?". Aller sur le channel du serveur que vous avez introduit, avec le client IRC favoris. Ici le bot s appelle «BotIngInd». Ensuite lancer le fichier «RunOnce.bat». Une fenêtre MS-DOS va apparaitre : Le «BotIngInd» s est bien lancé. On peut vérifier si il est bien connecté au serveur avec un /whois BotIngInd. Maintenant il va falloir lui dire qu on le maître, donc lui envoyer un «hello» avec cette commande : /msg BotIngInd hello Voici ce que nous devrions obtenir : Taper la commande «/msg BotIngInd pass votremotdepass» et voila ce qu on devrait avoir : Maintenant il va falloir lancer un DCC CHAT avec le «Bot». Pour cela, il suffit d aller dans Tools >> Chat : Cette fenêtre qui va apparaître : Windrop 3 Version 1.0 du document
Cliquer sur «OK». On va ainsi lancer un DCC Chat : Ne pas oublier d ouvrir le port 3333 sur l ordinateur où se trouve notre «Windrop» sinon cela ne fonctionnera pas! On peut aussi communiquer avec notre «Bot» en utilisant Putty par exemple. Voici la marche à suivre : Dans Host Name (or IP adresse), il faut mettre l adresse réseau de l ordinateur où se trouve votre Windrop! Une fenêtre MS-DOS va apparaître : Il va falloir lui affecter un channel. Pour cela, on doit utiliser ces commandes : -.+chan votrechannel -.chanset votrechannel chanmode +kstn-m votremotdepasse Les options du chanmode dépendent de notre channel : il peut être mis en «secret», «private» Vous pouvez voir si le bot est bien arrivé sur votre channel : Le «Bot» est bien arrivé sur le channel! Si on rencontre des erreurs pendant le chargement de certains fichier dll ou si MysqlTcl ne fonctionne pas, on doit modifier le fichier «RunOnce.bat» et modifier la ligne «eggdrop m» en «eggdrop n» ; cela permet de déboger notre windrop et de régler les problèmes! 2) MysqlTcl Au préalable, il est nécessaire de créer une base de données afin d utiliser MysqlTcl qui est à télécharger sur le site : http://www.xdobry.de/mysqltcl/windows.html A l heure actuelle, nous utiliserons «mysqltcl-3.03.zip» et MySQL 5.1. Décompresser le fichier dans le répertoire «lib/mysqltcl-3.03» de Windrop. On obtiendra 3 fichiers : - libmysql.dll - libmysqltcl.dll - pkgindex.tcl Windrop 4 Version 1.0 du document
Ouvrir le fichier «pkgindex.tcl» avec un éditeur de texte, mais il va falloir rajouter la ligne suivante au-dessus des lignes qui se trouvent déjà le fichier «pkgindex.tcl» : set dir "lib/mysqltcl-3.03/" Créer un fichier «mysql.tcl» qui va nous permettre d interagir avec la base de données, ce fichier doit être créé dans le répertoire «scripts». Voici un exemple : MysqlTcl avec Mysql 5.1 PAULUS Warren 08/07/2011 version 1.0 PAQUETAGE package require mysqltcl INITIALISATION set dbuser "warren" set dbpassword "isib" set name "db_irc" set ip "localhost" on envoie : afficher en DCC bind dcc - afficher dcc:afficher proc dcc:afficher {hand idx arg { set db_handle [mysqlconnect -host $::ip -user $::dbuser -password $::dbpassword -db $::name] set sql "SELECT * from membre" set result [mysqlsel $db_handle $sql -list] permet d'envoyer un message à un utilisateur, ici il s agit de moi putserv "privmsg moi :Resultat: $result" Windrop 5 Version 1.0 du document
on écrit : afficher sur le channel où se trouve le bot bind pub -!afficher sql:!afficher proc sql:!afficher { nick uhost handle channel arg { set db_handle [mysqlconnect -host $::ip -user $::dbuser -password $::dbpassword -db $::name] set sql "SELECT * from membre" set result [mysqlsel $db_handle $sql -list] on va envoyer le résultat sur le channel où on a écrit!afficher putserv "PRIVMSG $channel : $result" Explications: Ligne de programmation set dbuser "warren" set dbpassword "isib" set name "db_irc" set ip "localhost" set sql "SELECT * from membre" Explication Nous allons créer une variable qui va contenir l utilisateur de la base de données. Idem pour le password, nom de la base de données et l adresse ip. C est à ce niveau qu on va envoyer notre requête sql. On va récupérer toutes les données de la table membre. putserv "PRIVMSG $channel : $result" On peut aussi taper «set sql "DROP TABLE IF EXISTS membre;"» si on s y connaît en langage SQL, on ne devrait pas avoir de problèmes. Cette ligne permet d afficher le résultat sur le channel où l utilisateur a effectué la commande. Si on rajoute $ârg à cette fonction, cela permettra de récupérer l argument après!afficher par exemple!afficher test. On pourra rajouter test dans la base de données par exemple. [lindex $arg 0] et [lindex $arg 1] Par exemple :!adduser votreutilisateur votreutilisateur sera $arg de!adduser! Permet de récupérer le premier argument et le deuxième argument. Par exemple :!add arg1 arg2 [lindex $arg 0] va nous donner arg1. [lindex $arg 1] va nous donner arg2. Cela peut permettra de rajouter dans une table (arg1) une donnée (arg2) Windrop 6 Version 1.0 du document
3) Blowfish Encryption Nous allons créer un fichier «.tcl» afin de décrypter ce que les utilisateurs disent sur le channel. Voici un exemple de fichier «.tcl» à mettre dans le dossier «scripts» : Blowfish Encryption PAULUS Warren 10/07/2011 version 1.0 Permet de decrypter les messages du channel set cryptkey "votrekey" bind pub - - "+OK" pubdecrypt proc pubdecrypt {nick uhost hand chan arg { global cryptkey set plaintext [decrypt $cryptkey [join $arg]] set textsplit [split $plaintext] set cmd [lindex $textsplit 0] set cmdargs [lrange $textsplit 1 end] if {[info procs "pubmsg:$cmd"] == "pubmsg:$cmd" { pubmsg:$cmd $nick $uhost $hand $chan $cmdargs Permet de crypter un message envoyé par le bot sur le channel proc pubmsg:!helpsql {nick uhost hand chan arg { global cryptkey set data "Voici les différentes commandes:" Explications: Ligne de programmation set cryptkey "votrekey" bind pub - - "+OK" pubdecrypt proc pubdecrypt {nick uhost hand chan arg { Explication On crée une variable avec comme valeur notre key blowfish. Si sur le channel on voit un message qui commence par +OK alors on sait qu il faut le décrypter. On va donc se retrouver dans la procédure «pubdecrypt». Déclaration de la procédure «pubdecrypt», on rentre avec les arguments «nick uhost hand chan arg». Windrop 7 Version 1.0 du document
nick = Pseudo de l utilisateur qui a parlé sur le channel. chan = Le channel où l utilisateur a parlé. uhost = Connaitre les informations concernant l utilisateur. global cryptkey set plaintext [decrypt $cryptkey [join $arg]] Par exemple en crypté : user@...-888888b8c8.isp... Cela permet d utiliser la cryptkey qui a été définie en dehors de la procédure. Permet de créer un variable «plaintext» qui va contenir le décryptage de l argument en fonction de la cryptkey. L argument, dans notre cas, c est ce qui vient après le «+OK» car comme on le sait le cryptage est de cette forme : +OK de4f884884/ proc pubmsg:!helpsql {nick uhost handle chan arg { set data "Voici les différentes commandes:" L argument est donc «de4f884884/». C est ce que l on va décrypter! Voici la procédure «pubmsg» qui est utilisée par la procédure «pubdecrypt». Donc dès que le bot voit une phrase «+OK» sur le channel, il décrypte l argument et si celui-ci est «!helpsql» on arrive dans cette procédure avec comme arguments nick, uhost, handle, channel qui ont été récupérés par «pubdecrypt». On va créer une variable «data» qui va contenir la phrase que l on voudra afficher sur le channel. Ensuite nous allons encrypter le contenu de la variable «data» grâce à la cryptkey. Puis nous allons afficher le résultat sur le channel avec le «+OK» devant afin que les utilisateurs sachent décrypter le data! Maintenant il nous suffit d intégrer le «BlowFish Encryption» à notre fichier mysql pour détecter!afficher en crypter. Ce n est pas compliqué. On peut aussi crypter les données ajoutées dans notre base de données pour plus de sécurité. Voir sur le blog pour avoir un aperçu de ce qui a été fait «appswarren.wordpress.com». Windrop 8 Version 1.0 du document
4) Fonction Catch Nous allons utiliser la fonction «catch». Pour ce faire je vais vous passer une partie de mon code que j expliquerai ensuite : proc pubmsg:!add {nick uhost handle channel arg { global cryptkey global db_handle set encrypted [encrypt $cryptkey [lindex $arg 1]] set ajoutsql "'$encrypted'" set dupli "mysqlsel/db server: Duplicate entry '$encrypted' for key 'PRIMARY'" set sql "INSERT INTO [lindex $arg 0] ([lindex $arg 0]) VALUES ($ajoutsql);" if { [ catch {set result [mysqlsel $db_handle $sql -list] fid ] { if { string equal $dupli $fin { set data "Attention [lindex $arg 1] se trouve déjà dans la base de données [lindex $arg 0]" else { set data "Ajout de [lindex $arg 1] dans la base de données [lindex $arg 0]" Explications: Ligne de programmation set ajoutsql "'$encrypted'" set dupli "mysqlsel/db server: Duplicate entry '$encrypted' for key 'PRIMARY'" set sql "SELECT * from membre" if { [ catch {set result [mysqlsel $db_handle $sql -list] fid ] { ) else { set data "Ajout de [lindex $arg 1] dans la base de données [lindex $arg 0]" Explication Nous allons créer une variable «ajoutsql» qui va contenir le mot encrypté sous cette forme mot car c est la ligne de programmation SQL qui a besoin du mot sous cette forme. Nous allons créer une variable «dupli» qui va contenir la phrase qui apparaît quand il y a une erreur de duplication. C est à ce niveau que nous allons envoyer notre requête sql. On peut aussi faire «set sql "DROP TABLE IF EXISTS membre;"» si ons y connaît en langage SQL, on ne devrait pas avoir de problèmes. Voilà la fonction if. Nous allons entourer la fonction à analyser entre un catch[], si jamais le set result{ nous envoie une exception alors on la récupèrera dans la variable «fid». Sinon on crée un variable data comme expliqué auparavant dans la partie «Blowfish». Pour information, lindex $arg 1 c est la donnée, et lindex $arg 0 c est la table. Windrop 9 Version 1.0 du document
if { [string equal $dupli $fin] { set data "Attention [lindex $arg 1] se trouve déjà dans la base de données [lindex $arg 0]" La fonction if permet de voir si les variables dupli et fid ont le même contenu donc de savoir si le message préenregistré correspond au message levé par l exception! Ce qui va permettre d alerter sur le channel qu il y déjà cette donnée dans la base de donnée! On peut maintenant gérer les exceptions comme on le veut. A nous de jouer! FIN DU TUTORIAL Windrop 10 Version 1.0 du document