tcl
  #EGGHELP -BRASIRC-----------BOTnet-BR-PT
 

 

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

 
  #EGGHELP -BRASIRC-----------BOTnet-BR-PT

STARMEDIA        CERRAR