CPAN é mesmo uma maravilha... Quem programa em Perl é abençoado com uma ótima ferramenta de instalação de recursos para usar em seus programas... Sempre me admiro com o CPAN.
Antes de mais nada, este artigo é um tanto técnico. Para quem programa soluções simples para o dia-a-dia. Programa no sentido de criação de código-fonte mesmo.
O Problema
Comecei a frequentar sala do Chat do Terra. É legal, mas tem alguns problemas para quem acessa fazendo outras coisas.
- Você não sabe quando alguém entrou no chat, se você estiver em outra janela;
- Você não sabe quando alguém no chat falou com você.
Claro, isso não é um problema só do serviço de Chat do Terra, mas de todo webchat que eu conheço.
A Idéia
Resolvi o primeiro problema em algumas horas. O segundo é mais complicado...
A idéia é bem simples: sabe a bandeja? Também chamada de System Tray? Onde ficam o Gaim e outros programinhas quando abertos? Isso, a bandeja. Criar um programa que entre no Terra e veja quantas pessoas tem na sua sala favorita e então colocar na bandeja.
O projeto é o seguinte. No Chat do Terra tem uma página que lista as salas e diz quantas pessoas têm em cada sala naquele momento. Criamos um código que pegue essa página e extraia esse número dela.
Teoria
Vamos supor que você goste de Astronomia. O chat de Astronomia fica na sessão Diversos.
Se você vir o código deste arquivo, notará que há um Select de onde podemos pegar facilmente esta informação.
Assim, a estratégia é fazer download desse arquivo, filtrar especificamente este select e então atualizar o ícone na bandeja. Isso deve ocorrer a cada 25s, por exemplo.
Código
Para o código funcionar, você deve instalar o suporte a Gtk2::TrayIcon, Event e Glib::Event. Instalei isso tudo via CPAN, com o comando *cpan* para chamar o shell e comandos install para instalar isso efetivamente. Lembrando que usei Debian GNU/Linux, versão Sarge.
#!/usr/bin/perl
use Gtk2::TrayIcon;
use Glib::Event;
use Event;
# any order Gtk2->init;
Aqui você coloca a página onde está a sala de chat que te interessa.
my $terra_page = "diversos.htm";
Este código funciona só no Terra, mas para facilitar adaptações, uma variável com o endereço do servidor é um bom começo...
my $terra_server = "http://chat.terra.com.br:9781";
Aqui você coloca o nome exato da sala, com todos os espaços e maiúsculos que tem direito.
my $terra_room = "Arte";
my $icon= Gtk2::TrayIcon->new("test");
my $label= Gtk2::Label->new("#");
$icon->add($label);
$icon->show_all;
Este código é que faz o principal: pegar o arquivo e verificar quantas pessoas tem na sala de tempos em tempos. Aqui, a cada 25 segundos.
Event->timer (after => 1, interval => 25, cb => sub {
Se já houver arquivo, ele é apagado.
if ( -f $terra_page ) {
`rm $terra_page`;
}
Estou usando o wget para pegar o arquivo. Ele tem que estar instalado, portanto.
`wget $terra_server/$terra_page &> /dev/null`;
open(FILE, "< $terra_page");
$num = "#";
Esta é a sessão que pega mesmo o número de pessoas no arquivo. Parece complicado mas é bem simples. Nem usa tanta expressão regular quanto deveria... (daria pra fazer isso em bem menos linhas)
foreach $line() {
if ($line =~ /$terra_room /) {
@aux1 = split(/(/, $line);
@aux2 = split(/)/, $aux1[1]);
$num = int($aux2[0]);
}
}
close(FILE);
Aqui a gente atualiza o mostrador na bandeja.
$label->set_label($num);
});
Gtk2->main;
Pronto! E aqui está o resultado, no WindowMaker! Não é legal?!
Anexo | Tamanho |
---|---|
![]() | 835 bytes |
Comentar