| |
TCL para eggdrops
por exemplos
Parte 1
A idéia deste tutorial é ensinar como fazer
pequenos scripts simples, não imagine que você
se tornará um craque em tcl apenas com este
texto, isto exige muito treino e estudo. Vamos
começar desenvolvendo passo a passo um script
bastante simples que manda uma mensagem de saudação
para todas as pessoas que entram no canal.
Comecemos por alguns detalhes básicos de um
script tcl: um script tcl é simplesmente um
arquivo de texto puro, que pode ser escrito em
qualquer editor mas que deve ser salvo sem
nenhuma formatação especial (cuidado com isso!
Se usar algo como o Word lembre de salvar como se
fosse um .txt), linhas de programas não precisam
acabar com nenhum caracter especial como em
algumas outras linguagens, não tem numeração e
se forem iniciadas por # serão ignoradas pelo
eggdrop, se transformando em comentários para
facilitar a leitura do programa. Se você
desenvolver seus scripts no Windows e o eggdrop
estiver no Unix/Linux lembre de fazer o upload em
ascii ou o script nunca funcionará corretamente...
Agora vamos ao script. O primeiro passo é achar
uma forma de ativar o script a cada vez que alguém
entra no canal, para isso usaremos o comando bind
que faz exatamente isso e é o mais importante
comando dos scripts tcl para eggdrops. O bind
ativa uma determinada procedure (subrotina) se
determinado evento acontecer e passa para ela uma
série de dados (parâmetros). O bind pode ser
usado com uma longa de lista de eventos que pode
ser encontrada no tcl-commands.doc que vem com o
eggdrop. No nosso caso usaremos o bind join, veja
o formato dele:
JOIN (stackable)
bind join <flags> <máscara> <proc>
proc <nick> <user@host> <handle>
<canal>
A primeira linha diz que ele é stackable, ou
seja, você pode usar uma sequência deles, no
caso de binds que não são stackable o eggdrop
executa o primeiro bind que achar para aquele
evento e depois não executa nenhum outro.
Portanto tenha cuidado ao usar binds que não são
stackable.
A linha seguinte nos diz o formato dele onde
flags são as flags que o usuário deve ter para
ativar o evento, ou seja se eu colocar o apenas a
entrada de operadores irá ativar o comando. A máscara
é uma mascará que pode usar wildcards como * e
será comparada com #canal nick!user@host, ou
seja, se a mascará for #canal1* o evento será
ativado para qualquer join em um canal cujo nome
comece por #canal1. Por fim temos o nome da
procedure que deve ser rodada quando este evento
acontecer. Pelos nossos objetivos queremos pegar
todos os joins, assim a flag será - (ou seja,
nenhuma é exigida) e a máscara *. Chamando
nossa procedure de msg_canal (poderia ser
qualquer nome sem espaços), teremos a primeira
linha do programa:
bind
join - * msg_canal
Voltando à
ultima linha do formato do bind temos os parâmetros
que ele irá mandar a procedure: nick, user@host,
handle e canal (cuidado com a ordem e não esqueça
de nenhum mesmo que não vá usá-lo). Chamaremos
cada item deste respectivamente de nick, host,
hand e chan. Ou seja se quisermos saber o nick da
pessoa usaremos a variável $nick e assim por
diante. Uma procedure em tcl é definida sempre
no formato:
proc nome {variaveis} {
comandos
}
Substituindo o nome e as variáveis de acordo com
o que escolhemos temos em nosso script:
bind
join - * msg_canal
proc msg_canal {nick host hand chan} {
}
Agora temos
que colocar na procedure msg_canal o que nós
queremos que o bot faça. Queremos que ele mande
uma saudação a todos que entrarem no canal, mas
como fazer isso? Primeiro, vamos usar o comando
puthelp que apesar do nome não serve apenas para
ajuda, ele manda um texto comando para um
servidor assim como o putserv mas usaremos o
puthelp pois cada comando destes para evitar
provocar flood pode retardar a mensagem se forem
muitos comandos ao mesmo tempo, então deixaremos
o putserv apenas para comandos essenciais que
precisem ser rápidos como chutar alguém fazendo
flood no canal e usarem o puthelp para coisas
como estas mensagens que não tem tanta pressa
assim. O comando que iremos mandar para o
servidor será o NOTICE para evitar que seja
aberta uma nova janela em alguns clientes como o
mIRC. Se você quiser abrir a janela basta usar
PRIVMSG ao invés do NOTICE. Observe que NOTICE e
PRIVMSG são comandos de IRC e não de eggdrops,
um servidor não entende /msg... O formato do
NOTICE é NOTICE nick :texto (NÃO existe espaço
entre os : e o texto, cuidado com isto!). O nick
foi passado como o primeiro parâmetro pelo bind
e chamamos ele de nick, assim usaremos a variável
$nick e também $chan (nome do canal) e
completaremos o script:
bind
join - * msg_canal
proc msg_canal {nick host hand chan} {
puthelp "NOTICE
$nick :Oi $nick, bem vindo ao $chan!"
}
Observe uso
de espaços no começo da linha para facilitar a
leitura, eles não mudam em nada a forma como o
bot vê o script, mas facilita para nós humanos
lermos. Por isso a linha do puthelp começa um
pouco mais a direita que as outras.
Suponha que ao testar o script descobrimos que o
bot manda esta saudação para ele mesmo, então
vamos consertar isso evitando que a mensagem seja
mandada para o próprio bot. Para isso iremos
usar a variável interna $botnick que é
automaticamente configurada pelo próprio eggdrop
para representar o nick atual do bot. Mas para usá-la
temos que dizer que $botnick é uma variável
global, ou seja, que foi definida fora da
procedure. Por default em tcl apenas podemos usar
variáveis da própria procedure e por isso
usamos o comando global para dizer ao bot que $botnick
é uma variável global. Compararemos o $botnick
com o $nick que já utilizamos antes e se eles
forem iguais não faremos nada, ou seja, usaremos
o comando return para sair da procedure sem
executar o restante dela. Note que o return tem
que ser colocado antes do puthelp para evitar que
a mensagem seja mandada para o próprio bot.
Juntando tudo e usando o formato do if em tcl
teremos em nosso novo script:
bind
join - * msg_canal
proc msg_canal {nick host hand chan} {
global botnick
if { $nick == $botnick
} {
return
}
puthelp "NOTICE
$nick :Oi $nick, bem vindo ao $chan!"
}
Note que ==
são na verdade dois = juntos.
Suponha agora que não queremos que o bot mande a
mensagem para os ops do canal, ou seja para quem
tem a flag o no bot. Para isso usaremos o comando
matchattr que tem o formato matchattr handle1
flag1 e retorna verdadeiro se a pessoa com handle
handle1 tem a flag flag1. No nosso caso o handle
está na variável $hand e queremos verificar a
flag o. Assim faremos um novo if e teremos:
bind
join - * msg_canal
proc msg_canal {nick host hand chan} {
global botnick
if { $nick == $botnick
} {
return
}
if { [matchattr $hand
o] } {
return
}
puthelp "NOTICE
$nick :Oi $nick, bem vindo ao $chan!"
}
Para
finalizar vamos modificar um pouquinho o script
para que ele seja mais facilmente configurável
por outras pessoas. Para isso criaremos três
variáveis, uma determinará se os ops devem ou não
ser saudados, outra vai dizer o nome do canal e a
última vai dizer a mensagem. Para definir cada
variável usaremos o comando set, que é
simplesmente set variável valor, observe que NÃO
existe o sinal de = como em algumas outras
linguagens. Então vamos precisar a máscara do
comando bind de * para $canal* para pegar
qualquer join no canal definido por $canal.
Trocaremos a mensagem "Oi $nick, bem vindo
ao $chan" por $canal_msg. Por fim mudaremos
o segundo if para incluir a configuração que
chamaremos de $saudar_ops, para isso usaremos o
&& que corresponde ao E (AND) em tcl. Ou
seja, $saudar_ops == 0 && [matchattr $hand
o] será verdadeiro se e somente se $saudar_ops
for zero E a pessoa entrando for um op. Mudando
tudo isso e acrescentando os comentários
chegaremos ao script final, que nada mais é do
que o script on_join que é um dos scripts mais
baixados deste site.
Com isso acabamos o nosso primeiro script.
Esperamos que você tenha aprendido um pouco
sobre como escrever tcls para eggdrops. No futuro
colocaremos um pouco mais sobre o assunto aqui,
mas para se tornar um craque no assunto
aconselhamos você a ler o tcl-commands.doc e
treinar muito.
Autor: José Gonçalves
Neves Neto
|
|