gtk

TerraChat 0.3

Terra Chat - Código

A nova versão do terrachat não tem nenhuma novidade em termos de funcionalidade. A única mudança é que agora estou utilizando o LWP::UserAgent para baixar a página ao invés de fazer chamada ao wget. Ou seja, se você conseguir instalar essa parafernália de módulos em outro Sistema Operacional, o terrachat agora tem ótimas chances de funcionar.

Ah, ele pode servir de base pra outros projetos similares também. De repente alguém aí quer um monitor de salas do chat do UOL ou um monitor de resultados das loterias, sei lá... :-P Não tem muitos comentários, mas o código é bem enxuto. E qualquer coisa, se quiserem mexer no código, podem colocar dúvidas por aqui.

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

Special: 
Subscribe to RSS - gtk

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