Terra Chat Monitor

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?!

AnexoTamanho
Plain text icon tcmonitor-pl.txt835 bytes
Special: 
Avalie: 
No votes yet

Comentar


Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll: cannot open shared object file: No such file or directory in Unknown on line 0