/ IT

Eggdrop et scripting TCL

Ah le monde de l’IRC (Internet Relay Chat) ! Des milliers de personnes connectées sur leurs canaux de discussion…

Même si ce moyen de communication semble globalement sur le déclin aux vues des statistiques de netsplit.de, hormis sur Freenode dont la population est singulière, il n’en reste pas moins très utile afin de partager ses passions, passer le temps, travailler sur des projets communs, obtenir de l’aide, etc.

Certains chans IRC comptant plusieurs centaines de personnes, le besoin d’automatiser la modération d’un canal s’est vite fait sentir, c’est ainsi que naquirent les « bots IRC », programmes destinés à assurer la gestion de canaux donnés (système anti-flood, anti-insultes, op/voice, kick/ban, etc) et pouvant également fournir des informations dans le temps (flux RSS d’un site, musique diffusée sur un stream radio, etc).

Il existe une grande variété de bots IRC, il est d’ailleurs assez aisé de développer le sien. Mais le champion toutes catégories dans ce domaine reste l’Eggdrop. Développé à partir de 1993 il s’est imposé de par ses fonctionnalités et performances comme la référence ultime. Toujours en cours de développement on recense actuellement environ 15.000 eggdrops connectés .

Brièvement, qu’est ce qui rend l’Eggdrop unique ?

Une configuration très pointue, intégrant la gestion d’utilisateurs, de privilèges, les notions de flood, log de discussions, administration via telnet, etc.

Mais surtout, sa prise en charge du langage TCL, permettant des développements complémentaires relativement simples et extrêmement poussés.

Dans cet article nous verrons en détails comment déployer un eggdrop, le configurer, et les bases du scripting TCL. « Shall we begin ?! »

Installation et configuration d’un Eggdrop :

Il est fort probable que votre distribution Linux / *BSD via les packages ou le système de ports, intègre déjà une version d’Eggdrop. Toutefois, dans ce cas précis, nous allons récupérer la dernière version en cours de développement (cf 1.8), car celle-ci gère nativement l’IPv6 et le SSL puis nous compilerons tout à la main comme le font les Hommes, les vrais (enfin les célibataires…).

Pré-requis :

Ici nous allons récupérer le code via l’application git, mais il est possible d’acquérir directement le code via GitHub.

Il vous faudra également de quoi compiler, et surtout pensez à intégrer tcl-dev dont va dépendre notre eggdrop pour ses scripts !

Récupération / Compilation :

$ git clone https://github.com/eggheads/eggdrop.git eggdrop1.8 

Clonage dans 'eggdrop1.8'... 
remote: Counting objects: 31557, done. 
remote: Total 31557 (delta 0), reused 0 (delta 0), pack-reused 31557 
Réception d'objets: 100% (31557/31557), 11.69 MiB | 8.18 MiB/s, fait. 
Résolution des deltas: 100% (26707/26707), fait. 
Vérification de la connectivité... fait.

Les sources acquises, il est temps de compiler tout ça :

$ cd eggdrop1.8/ && ./configure && make config && make && make install

Il est possible dans certains cas que ./configure ne trouve pas vos dépendances tcl, il suffit de faire une simple recherche et passer les bons paramètres :

$ find /usr/lib -name libtcl*.so && find /usr/include -name tcl.h 
/usr/lib/arm-linux-gnueabihf/libtcl8.6.so 
/usr/include/tcl8.6/tcl.h 

$ ./configure --with-tcllib=/usr/lib/arm-linux-gnueabihf/libtcl8.6.so --with-tclinc=/usr/include/tcl8.6/tcl.h

Le répertoire de votre eggdrop se situe par défaut dans : ~/eggdrop/ Il est possible de changer le répertoire à votre guise :

make install DEST=$HOME/mybelovedeggdrop

Configuration :

On ouvre le fichier de configuration :

$ vi ~/eggdrop/eggdrop.conf

La première à faire est de commenter les deux lignes commençant par :

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?"

Ensuite, c’est simple il reste à configurer les différents éléments définissant l’identité de votre Bot selon ses besoins, prenons des exemples :

set username "Roberto" 
set admin "Lina Sovereign" 
set network "Caged Monster" 
set userfile "roberto.user" 
set pidfile "pid.Roberto" 
set chanfile "Roberto.chan" 
set nick "RobertoTheBot" 
set altnick "RobertoTheBot_" 
set realname "Roberto The Bot \o/"

Je veux que mon bot se connecte à Freenode :

set servers { irc.freenode.net:6667 }

Je veux que mon bot se connecte à Freenode en IPv6 :

set servers { [2a00:1a28:1100:11::42]:6667 }

Je veux que mon bot se connecte à Freenode en SSL :

set servers { irc.freenode.net:+6697 }

Dans certains cas il peut être utile d’empêcher votre bot de répondre aux requêtes CTCP :

set ctcp-mode 1

Administration de votre Eggdrop :

Il est existe différents moyens d’administrer un eggdrop, faire un /msg NomDuBot HELLO à sa première connexion sur le serveur IRC et administrer via DDC CHAT ou passer directement par TELNET. Je conseille fortement l’option TELNET pour une visibilité accrue des actions du bot ainsi qu’une gestion complète. La configuration du port telnet se présente ainsi :

listen 3333 all

On écoute sur le port 3333 pour tous, à savoir les utilisateurs et les bots (car nous pouvons linker plusieurs bots afin de faire un botnet).

Notre eggdrop est configuré, il ne reste plus qu’à le lancer !

Lancement et paramétrage en ligne :

$ ./eggdrop -m eggdrop.conf

L’option -m est à utiliser la première fois uniquement pour spécifier le fichier de configuration et créer les fichiers associés.

Il reste à se connecter en telnet pour s’identifier la première fois et créer son compte administrateur, entrez NEW, notre nom d’utilisateur et le mot de passe souhaité.

$ telnet localhost 3333

RobertoTheBot (Eggdrop v1.8.0+tclconfig (C) 1997 Robey Pointer (C) 2010 Eggheads)

Please enter your nickname.
NEW

This is the telnet interface to RobertoTheBot, an eggdrop bot.
Don't abuse it, and it will be open for all your friends, too.
You now get to pick a nick to use on the bot,
and a password so nobody else can pretend to be you.
Please remember both!
Enter the nickname you would like to use.
Lina
*** POOF! ***
You are now a master on this bot.
### POOF! ###
You are now a botnet master on this bot.
@@@ POOF! @@@
You are now an OWNER of this bot.

YOU ARE THE MASTER/OWNER ON THIS BOT NOW
From now on, you don't need to use the -m option to start the bot.
Enjoy !!
Okay, now choose and enter a password:
(Only the first 15 letters are significant.)
password

Remember that! You'll need it next time you log in.
You now have an account on RobertoTheBot...

Un commande utile afin de connaître l’état du bot est : .stat

.stat
[10:48:11] #Lina# status
I am RobertoTheBot, running eggdrop v1.8.0+tclconfig: 1 user (mem: 63k).
Online for 00:03 (background) - CPU: 00:00.46 - Cache hit: 42.9%
Configured with: '--with-tcllib=/usr/lib/arm-linux-gnueabihf/libtcl8.6.so' '--with-tclinc=/usr/include/tcl8.6/tcl.h'
Admin: Lina Sovereign
Config file: eggdrop.conf
OS: Linux 4.4.13-v7+
Process ID: 14412 (parent 1)
Tcl library: /usr/share/tcltk/tcl8.6
Tcl version: 8.6.2 (header version 8.6.2)
Tcl is threaded.
TLS support is enabled.
TLS library: OpenSSL 1.0.1t 3 May 2016
IPv6 support is enabled.
Socket table: 20/100
Memory table: 2848/25000 (11.4% full)
Memory table itself occupies an additional 781k static
Loaded module information:
Online as: RobertoTheBot!~Roberto@LFbn-1-5762-7.w90-108.abo.wanadoo.fr (Roberto The Bot o/)
Server [irc.freenode.net]:+6697 (connected for 00:03)

Voici quelques commandes qui vous seront utiles :

.+chan/.-chan fait rejoindre / partir d'un canal 
.chanset (pour modifier les paramètres d'un canal) 
.msg (pour faire parler le bot en privé) 
.say (pour faire parler le bot sur un canal) 
.rehash (recharge la configuration / les scripts TCL) 
.restart (redémarre le bot) 
.die (tue le bot) 
.quit (vous déconnecte de votre session)

Pour plus d’informations, je vous conseille ce Wiki très complet.

Passons à présent aux bases du Scripting en TCL :

De manière générale vos scripts vont se retrouver dans le répertoire dédié à cet effet dans **eggdrop/scripts/.

Pour préciser à votre eggdrop l’emplacement d’un script TCL, il suffit d’éditer votre fichier de configuration eggdrop.conf afin d’y ajouter la ligne qui va bien : source scripts/nom-de-votre-script.tcl

Nous allons créer un petit script de test afin de bien comprendre le fonctionnement :

$ vi ~/eggdrop/scripts/test.tcl

Le scripting TCL est vraiment très bien fait. L’eggdrop va réagir à des événements / situations permettant de déclencher une action. On appelle ça un BIND. Vous trouverez une liste de l’ensemble des BINDS existants ici.

Nous allons à titre d’exemple nous focaliser sur trois types de BIND. Lors de la connexion à un serveur, lors de la réception d’un message privé ou afin de customiser le CTCP VERSION REPLY.

Authentification à NickServ lors de la connexion au serveur :

Je veux m’identifier au service NickServ dès ma connexion et de ce fait je vais déclarer quelques variables associées.

set nickname "Roberto" 
set password "mon pass" 
set init-server { putserv "PRIVMSG nickserv :identify $nickname $password" }

Assez simple à appréhender, lors de la connexion au serveur, mon eggdrop va envoyer un message privé à NickServ pour s’identifier.

Maintenant, je veux prévenir un utilisateur qui va parler à mon eggdrop, qu’il n’est qu’un robot :

bind msgm - * msg:coucou proc msg:coucou { nick uhost handle arg } { putserv "PRIVMSG $nick :Désolé je ne suis qu'un bot !" }

bind msgm va déclencher une action en cas de réception d’un message privé.

"–" correspond aux privilèges requis sur le bot, ici aucun

"*" va identifier n’importe quel type de message reçu

msg:coucou est juste le nom donné au bind afin d’être utilisé dans ma procédure.

Changer mon reply CTCP VERSION :

bind ctcp - VERSION fake:version 
proc fake:version {nick uhost hand chan key text} { 
putserv "NOTICE $nick :L'important n'est pas ce que j'utilise, mais que je sois là non ?" 
}

En cas de réception d’un CTCP de type VERSION, le bot envoie une notice différente.

Besoin d’aide ?