22 de fev de 2017

Eggdrops - Criando scripts Tcl

Um Eggdrop é um dos IRC bots mais populares escrito em C, open source e roda em ambientes unix. Suas funcionalidades incluem: suporte a vários canais e scripts ou módulos Tcl, permitindo que você inclua novas funções ao seu bot.
  • O que é um IRC bot:
É um programa que controla 24h os canais do IRC (Internet Relay Chat), que é uma rede onde vários servidores são conectados uns aos outros. Os clientes IRC usam o protocolo RFC1459 para enviar comandos ao servidor. O bot serve para proteger o canal contra abusos, gravar logs, hospedar jogos, etc. Bastante útil em redes IRC onde não existe o ChanServ, evitando que o canal seja removido quando não há ninguém nele ou que alguém tome posse do canal.
  • Instalando um Eggdrop:
Primeiro você vai precisar de uma conta shell, que nada mais é do que uma conta em um servidor unix remoto que dá acesso a uma shell pela linha de comando, via telnet ou ssh. A maioria das contas shells são pagas, mas existem algumas gratuítas como: Bitcoin Shell (owne jogando Pong!), xShellz ou aShellz

1) Logue-se em sua conta shell e digite:
$ wget http://ftp.eggheads.org/pub/eggdrop/source/1.8/eggdrop-1.8.0.tar.gz
2) Descompacte e acesso o novo diretório.
$ tar -zxvf eggdrop-1.8.0.tar.gz 
$ cd eggdrop-1.8.0
3) Configure seu eggdrop.
$ ./configure
4) Depois compile todos os módulos (opcional) e gere o eggdrop.
# make config
# make && make install
5) Configure seu eggdrop:
# vim eggdrop.conf
* Para configurar, leia os comentários que está tudo explicado passo a passo. :)
6) Mude o nome do seu arquivo de configuração para o nome do seu bot:
# mv eggdrop.conf pikachu.conf
7) Execute seu eggdrop.
./eggdrop -m pikachu.conf

  • Comandos Eggdrop:
Conecte-se ao seu bot via telnet (usando o ip e porta configurada): 
$ telnet 201.13.117.66 3333
Em sua primeira conexão ele irá pedir para criar um novo usuário e senha, na qual você vai usar toda vez que conectar. Alguns exemplos de comandos:
.chanset #freenode +inactive (o bot vai sair do canal)
.chanset #freenode -inactive (o bot vai entrar novamente no canal)
.restart
.rehash
.msg nick Me da op? (bot envia msg para o nick dizendo "Me da op?")
.+chan #freenode (bot ira entrar no canal)
.say #freenode rawr (bot ira dizer "rawn" no canal)
.uptime
  • O que é Tcl?
Tcl (Tool Command Language) é uma linguagem de scripts/comandos baseada nas noções de string e substituição de strings, criada por John Ousterhout em 1988. Tk (Tool Kit) é sua biblioteca gráfica. Sua sintaxe é descrita em 12 regras, onde não existem palavras reservadas ou sintaxes internas para estruturas de controle ou condicionais. Ao invés disso, as operações são simples comandos (strings). Quando o interpretador Tcl inicia, há uma lista de comandos conhecidos que o interpretador usa para analisar uma linha, como: while, for, set, puts, expr, etc. Os interpretadores Tcl mais usados são o wish (win) e o tclsh (modo texto).
Para executar seu script use: 
$ tclsh seu_script.tcl
Ou adicione na primeira linha do seu programa:
#!/usr/bin/tclsh
  • Comandos Tcl:
Variáveis: No Tcl todas as variáveis são "strings", não fazendo distinção entre letras ou números. As strings podem ser definidas com o set ou unset. Sintaxe: set <string> <valor> ou unset <string>
Substituições: Para obter o resultado de um comando usamos os colchetes "[]".
Cálculos: O Tcl usa o comando "expr" para fazer operações matemáticas. Fechar os argumentos com chaves deixa o resultado mais rápido.
Listas: Uma lista é uma string na qual os elementos estão separados por espaços. Ex: set lista {1 2 3}.
Arrays: É uma variável com um índice que é uma string. Ex: set cor(pikachu) amarelo
Interpretações: O Tcl usa os seguintes caracteres para definir eventos:
" "  : Tudo entre as aspas é considerado texto.
[ ] : São usado para executar comandos. A primeira palavra dentro do colchetes é o comando a ser executado e o restante são parâmetros do comando.
{ }  : Usado para indicar quando algo inicia ou termina.
( ) : Usados para definir várias coisas, como para declarar que uma variável é um array e que para definir certas partes do comando if.
; : Quando o tcl vê um ; ele processa tudo antes dele e interpreta o restante como uma nova linha.
# : Comentário. Quando usado no começo da linha toda a linha é ignorada. Quando colocamos um ponto e vírgula antes ;# ele processa todo o código anterior e depois interpreta o # como uma nova linha de comentário.
\ : O Tcl vê o próximo caractere como texto. Em alguns casos pode começar com o \ seguido  por um número ou letra para criar um caractere especial, nesse caso a \ vai ser interpretada com um código especial e não será lido como texto. Ex: \037 será lido como sublinhado.
Procedimentos: O comando proc cria um novo comando. Sintaxe: proc <nome> { <parametros> } { <corpo> }, onde:
nome: É o nome do processo.
parametros: São as variáveis que o processo precisa como parâmetros, na qual precisamos especificar uma variável para cada parâmetro e as variáveis devem ser separadas por espaços. A única excessão é quando usamos "args" como último parâmetro, que vai virar uma lista chamada $args contendo todos os parâmetros posteriores.
corpo: São os comandos que o processo irá executar.
Você pode encerrar um processo com o "}" ou o comando "return". Sintaxe: return <mensagem>. A mensagem é a saída do processo, geralmente é usado 0 (saída silenciosa) ou 1 (o bot continua fazendo logs), mas também podemos usar um texto. Ex: proc teste { nick }{ return "Ola $nick."}
  • Tcl e comandos Eggdrop:
Os eggdrops operam em um sistema baseado em eventos, chamados de "binds"O comando bind faz o bot reagir a um evento como sendo um comando, mensagem ou ctcp. Sintaxe: bind <tipo> <flags> <comando> <processo>, onde:
tipo: É o evento que o bot irá reagir. 
flags: Se refere as flags dadas pelos usuários ao Eggdrop. Possui a forma <flag global>|<flag do canal>.
comando: É o parâmetro a ser executado.
processo: É qual processo o bot deve executar pelo bind. Ex: bind msg <flags> hello <processo> ira fazer o bot reagir quando ele receber a mensagem "hello" como primeira palavra.
  • Logging:
Existem 4 comandos para fazer o Eggdrop criar logs: putlog, putcmdlog, putxferlog e putloglev. A diferença entre cada comando consiste no nível de cada um. O putlog envia as mensagens de log para o nível o (other: misc, info e erros), o putcmdlog envia o log para o nível c (comandos que as pessoas usam via msg ou dcc), o putxferlog envia os logs para o nível x (transferência de arquivos) e o putloglev envia os logs para os níveis especificados. Sintaxe: putlog|putcmdlog|putxferlog "<texto>" ou putloglev <niveis> <canal> "<texto>".
  • Enviando comandos IRC:
Existem 3 comandos para enviar comandos ao servidor IRC: putserv, puthelp e putquick. Os comandos fazem a mesma coisa, o que difere são as filas. O putquick usa a fila mais rápida e é usado para enviar algo ao servidor imediatamente, o putserv usa a fila normal para mensagens do servidor e o puthelp usa as filas mais lentas, usado para enviar mensagens ou avisos para outras pessoas. Sintaxe: putquick|putserv|puthelp <texto> [opcoes], na qual:
texto: É o comando ou parâmetros a serem enviados ao servidor IRC. Ex: puthelp "PRIVMSG <nickname/canal> :<mensagem>".
opcoes: São os parâmetros do comando.
Mudando o modo do canal: Pode ser feito manualmente com o comando putserv ou pushmode, que é mais rápido. Sintaxe: pushmode <canal> <modo> [parâmetros]
Kickando usuarios: Existem 2 comandos para isso: putserv e putkick. Sintaxe: putkick <canal> <nickname(s)> [texto].
  • Colocando a mão na massa:
O script abaixo vai colocar o modo "op" ao nick especificado e "voice" a todos os usuários que entrarem no canal e enviar uma mensagem de boas vindas. Para adicionar o seu script tcl no eggdrop, basta colocar uma linha contendo "source script.tcl" no seu arquivo de configuração.

# Esse sera nosso primeiro script tcl!!
bind join - * join:voice_n_greet
proc join:voice_n_greet { nick host hand chan } {
if { $nick == "zeldani" } { 
  pushmode $chan +o $nick
        puthelp "PRIVMSG $chan :zeldani eh o meu nick favorito. <3" 
    } else { 
  pushmode $chan +v $nick
           puthelp "PRIVMSG $chan :Ahoy pirate $nick!" 
}
return 0
}

Agora já temos uma pequena noção sobre os Eggdrops e scripts Tcl.
Boa diversão! :)


* Fontes:
http://www.egghelp.org/whatis.htm
https://en.wikipedia.org/wiki/Shell_account
http://www.risingnet.net/tutorials/eggdrop-installation.html
http://mewbies.com/how_to_install_eggdrop_tutorial.htm
http://wiki.tcl.tk/299
http://www.ricardo-jorge.eti.br/download/tcl-tutor.pdf
http://www.dcc.fc.up.pt/~nam/aulas/9899/ig/tcl.html
https://www.tcl.tk/man/tcl8.5/tutorial/
http://johoho.eggheads.org/eggdrop/other/guide2tcl.html
http://suninet.the-demon.de/

0 comentários:

Postar um comentário