|
Aide tcl de base
Comme vous le savez sûrement, les bots mIRC se
"meurent" de plus en plus, laissant place aux eggdrops/windrops. Nous allons
donc, dans cette rubrique apprendre les bases du scripting tcl qui sert bien
évidemment, à faire des scripts pour les eggdrops/windrops. C'est l'équivalent
des addons mIRC... on scripte et on ajoute les scripts dans la configuration de
l'eggdrop.
Bien, dans notre aide tcl, nous ferons un
script servant à s'op, déop, kick, kickban etc par les commandes .op ..deop etc..
sur le channel.. Ces commandes ne seront valables que si
l'user qui la tape à un access Opérateur au bot.
1 - { Les Binds }
Les binds définissent à quoi le bot doit
réagir.. il en existe une trentaine en tcl. Nous verrons ici les binds msg, pub,
et dcc...qui sont les binds les plus faciles... et qui conviendront très bien à
notre partie "Aide tcl de base"...
- Msg permet au bot de répondre à une commande
qui se passe en privé.
(ex: &op #csadmin Jo)
- Dcc permet au bot de répondre à une commande
qui, elle, se passera en dcc bien évidemment.
(ex: &op #csadmin Jo)
- pub permet au bot de répondre à une commande
qui, répondra aux commandes sur le channel.
(ex: &op Jo) si on tape ça sur #csadmin.
2 - { Les Procédures }
Une procédure est une portion de code qui peut
être appelée par n'importe quoi dans un script. On peut aussi en faire des
fonctions (lorsqu'elles retournent quelque chose). Pour les eggdrops/windrops,
la procédure est appelée par un bind.
proc nom de la procédure {
arguments } { corps de la procédure }
proc pub:!salut { nick uhost handle
channel arg } {
putserv "PRIVMSG $channel salut"
}
(par exemple)
Nous verrons plus tard dans le détail
l'utilisation de putserv et des variables. Sachez simplement que putserv permet
d'envoyer une information au serveur. Ce petit script donnera donc :
<Vous> !salut
<Eggdrop> salut
3 - { Les Variables }
Les variables permettent
de stocker des informations dans la mémoire de l'eggdrop.
Par exemple, dans le script :
nick, uhost, handle, channel et arg sont des variables dont le contenu est donné
par le bind. Pour utiliser le contenu d'une variable, il faut précéder son nom
par un $.
Exemple : $channel retourne le nom du channel sur lequel s'est passée l'action.
Il existe aussi des variables globales dont le contenu est défini par le bot.
Pour les utiliser dans une procédure, il faut signaler au bot que son champ
d'action n'est pas limité à la procédure, en lui indiquant au début du corps de
la procédure les variables globales à utiliser à l'aide de l'instruction
globale.
Exemple :
bind pub - !nick pub:!nick
proc pub:!nick { nick uhost handle channel arg } {
global botnick
putserv "PRIVMSG $channel :Mon nick est $botnick"
}
Résultat :
<Vous> !nick
<Webs00> Mon nick est Webs00
Il existe un tas de
variables, variables globales comme
botnick
botname server version numversion uptime server-online lastbindbotname server
version numversion uptime server-online lastbind...
4 - { Commandes
d'écriture }
Il en existe 2 sortes : Celles
qui permettent d'écrire sur le serveur, et celles qui permettent d'écrire dans
les logs.. Celles concernant le serveur sont putquick, pushmode, putserv,
puthelp et putkick (pushmode permet d'envoyer des modes au serveur, c'est
l'équivalent d'un /mode). Putkick permet de kicker quelqu'un sur un channel.
Puthelp, putserv et putquick permettent d'envoyer toutes les autres commandes au
serveur, en utilisant les RAW IRC.
elles qui désormais,
concernent l'écriture dans les logs sont putlog, putcmdlog, putxferlog et
putloglev.putlog, putcmdlog et putxferlog ont la même syntaxe, et écrivent
respectivement dans les logs.
Syntaxe
: put*log "texte
putloglev a une
syntaxe différente :
Syntaxe : putloglev "level(s)"
"channel" "texte"
5 - { Les conditions (If)
Le "if" permet de faire
quelques commandes si, et seulement si elles répondent à une condition qui est
spécifiée par le "if".Une expression est vraie, si la valeur de celle-ci (qui
peut être donnée par une fonction, par exemple) est différente de 0. Une
expression est fausse si la valeur de celle-ci est 0.
Il existe trois syntaxes dans
lesquelles nous pouvons employer if. Elles sont les suivantes : (if expressions
commandes) , (if expression commande.2 else commande.2) , (if
if expression1 commandes1 elseif
expression2 commandes2 elseif expression3 commandes3 else commandes4).
Pour illustrer ces
syntaxes , voici trois scripts les présentant :
bind pub - !isvoice pub:isvoice
proc pub:isvoice { nick uhost handle channel arg } {
if [isvoice $nick $channel] {
putserv "PRIVMSG $channel :T'es voice sur $channel."
}
bind pub - !isvoice pub:isvoice
proc pub:isvoice { nick uhost handle channel arg } {
if [isvoice $nick $channel] {
putserv "PRIVMSG $channel :T'es voice sur $channel."
} else {
putserv "PRIVMSG $channel :T'es pas voice sur $channel."
}
bind pub - !isvoice pub:isvoice
proc pub:isvoice { nick uhost handle channel arg } {
if [isvoice $nick $channel] {
putserv "PRIVMSG $channel :T'es voice sur $channel."
} elseif [isop $nick $channel] {
putserv "PRIVMSG $channel :T'es pas voice sur $channel mais t'es op"
} else {
putserv "PRIVMSG $channel :T'es rien du tout sur $channel."
}
Si l'expression qui suit le "if" n'est pas vraie, l'eggdrop
regarde si l'expression qui suit le "elseif" est vraie. Si elle est vraie, les
commandes qui suivent le "elseif" sont exécutées. Sinon, l'eggdrop examine le "elseif"
suivant ou passe au "else".
6 - { Les Boucles }
Les boucles permettent de
contrôler l'exécution de votre script, en répétant certaines instructions.
Il y a trois boucles différentes en TCL : for, foreach, while.
L'instruction while permet d'exécuter un bloc d'instruction tant que la
condition désignée est véridique.
Syntaxe : while condition instructions
set x 0
while {$x<5} {
putlog "x = $x"
incr x
}
(exemple tiré d'un autre site)
L'instruction for est un peu plus complexe : Sa syntaxe est la suivante :
Syntaxe :for début test suivant instructions
Ce script a le même effet que celui servant d'exemple à while.
for {set x 0} {$x<5} {incr x} {
putlog "x = $x"
}
7- { Les Tableaux }
Les tableaux sont gérés de
façon très simple en TCL.
Exemple : nom-du-tableau(index)
set nick(1) "Khorbald"
set nick(2) "Jo"
for {set index 1} {$index<=2} {incr index} {
putlog "Nick numéro $index : $nick($index)"
}
Résultat :
<Eggdrop> Nick 1 :
Laurent
<Eggdrop>
Nick 2 : Lucas
8 - { Les Listes }
Les listes sont,
éventuellement, une autre façon de gérer des données que les tableaux. Une liste
s'écrit et se présente sous la forme suivante : { texte texte1 texte2 }
Instructions de gestion des listes :
Instructions non détaillées :
list : crée une liste
join : crée une liste
lappend : ajoute des éléments à une liste
lindex : lit un élément d'une liste
linsert : insère des éléments dans une liste
llength : retourne le nombre d'éléments d'une liste
lrange : retourne un ou plusieurs éléments d'une liste
lreplace : remplace des éléments d'une liste
lsearch : recherche un élément dans une liste
lsort : trie les éléments d'une liste
9- { Script Final }
## Webs.tcl ##
bind pub o &op pub:&op
proc pub:&op { nick uhost handle channel arg } {
set opnick [lindex $arg 0]
putserv "MODE $channel +o $opnick"
}
bind pub o &deop pub:&deop
proc pub:&deop { nick uhost handle channel arg } {
set deopnick [lindex $arg 0]
putserv "MODE $channel -o $deopnick"
}
bind pub o &voice pub:&voice
proc pub:&voice { nick uhost handle channel arg } {
set voicenick [lindex $arg 0]
putserv "MODE $channel +v $voicenick"
}
bind pub o &devoice pub:&devoice
proc pub:&devoice { nick uhost handle channel arg } {
set devoicenick [lindex $arg 0]
putserv "MODE $channel -v $devoicenick"
}
bind pub o &kick pub:&kick
proc pub:&kick { nick uhost handle channel arg } {
set kicknick [lindex $arg 0]
set reason [lrange $arg 1 end]
putserv "KICK $channel $kicknick :$reason"
}
bind pub o &ban pub:&ban
proc pub:&ban { nick uhost handle channel arg } {
set bannick [lindex $arg 0]
putserv "MODE $channel +b $bannick"
}
bind pub o &topic pub:&topic
proc pub:&topic { nick uhost handle channel arg } {
set topicz [lrange $arg 0 end]
putserv "TOPIC $channel :topicz"
}
putlog "Webs.tcl"
Ce tcl est bien évidemment un tcl de base qui est très
simple mais qui est ici un bon exemple pour notre rubrique.
Shine
|