Eggdrops - Criando scripts Tcl
Autor: zeldani | Publicado: 2017-02-22T19:22:00-03:00


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.&nbsp;A maioria das contas shells são pagas, mas existem algumas gratuítas como:&nbsp;Bitcoin Shell (owne jogando Pong!),&nbsp;xShellz&nbsp;ou&nbsp;aShellz.&nbsp;



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&nbsp;

$ 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 &amp;&amp; make install

5)&nbsp;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):&nbsp;
$ 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.&nbsp;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?&nbsp;(bot envia msg para o nick dizendo "Me da op?")

.+chan #freenode&nbsp;(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.&nbsp;Sua sintaxe é descrita em&nbsp;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).&nbsp;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.&nbsp;Os interpretadores Tcl mais usados são o wish (win) e o tclsh (modo texto).
Para executar seu script use:&nbsp;
$ tclsh seu_script.tcl
Ou adicione na primeira linha do seu programa:
#!/usr/bin/tclsh


Comandos Tcl:






Variáveis:&nbsp;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.&nbsp;Sintaxe: set &lt;string&gt; &lt;valor&gt; ou unset &lt;string&gt;.&nbsp;
Substituições:&nbsp;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:&nbsp;Uma lista é uma string na qual os elementos estão separados por espaços. Ex: set lista {1 2 3}.
Arrays:&nbsp;É uma variável com um índice que é uma string. Ex: set cor(pikachu) amarelo
Interpretações:&nbsp;O Tcl usa os seguintes caracteres para definir eventos:

" " &nbsp;: 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.
{ } &nbsp;: 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.
#&nbsp;: 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 &nbsp;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:&nbsp;O comando proc cria um novo comando.&nbsp;Sintaxe:&nbsp;proc &lt;nome&gt; { &lt;parametros&gt; } { &lt;corpo&gt; }, 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 &lt;mensagem&gt;. 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".&nbsp;O comando bind faz o bot reagir a um evento como sendo um comando, mensagem ou ctcp.&nbsp;Sintaxe:&nbsp;bind &lt;tipo&gt; &lt;flags&gt; &lt;comando&gt; &lt;processo&gt;, onde:
tipo:&nbsp;É o evento que o bot irá reagir.&nbsp;
flags: Se refere as flags dadas pelos usuários ao Eggdrop. Possui a forma &lt;flag global&gt;|&lt;flag do canal&gt;.
comando:&nbsp;É o parâmetro a ser executado.
processo:&nbsp;É qual processo o bot deve executar pelo bind. Ex: bind msg &lt;flags&gt; hello &lt;processo&gt; 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 "&lt;texto&gt;" ou putloglev &lt;niveis&gt; &lt;canal&gt; "&lt;texto&gt;".


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 &lt;texto&gt; [opcoes], na qual:
texto: É o comando ou parâmetros a serem enviados ao servidor IRC. Ex: puthelp "PRIVMSG &lt;nickname/canal&gt; :&lt;mensagem&gt;".


opcoes: São os parâmetros do comando.
Mudando o modo do canal:&nbsp;Pode ser feito manualmente com o comando putserv ou pushmode, que é mais rápido. Sintaxe: pushmode &lt;canal&gt; &lt;modo&gt; [parâmetros]
Kickando usuarios:&nbsp;Existem 2 comandos para isso: putserv e putkick. Sintaxe: putkick &lt;canal&gt; &lt;nickname(s)&gt; [texto].


Colocando a mão na massa:

O script abaixo vai colocar o modo "op"&nbsp;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" } {&nbsp;
  &nbsp; pushmode $chan +o $nick
&nbsp; &nbsp; &nbsp;  &nbsp; puthelp "PRIVMSG $chan :zeldani eh o meu nick favorito. &lt;3"&nbsp;
&nbsp; &nbsp;  } else {&nbsp;
  &nbsp; pushmode $chan +v $nick
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;puthelp "PRIVMSG $chan :Ahoy pirate $nick!"&nbsp;
 }
 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/