Pidgin / D-Bus / Python

9 Novembro, 2007

No Debian que uso, o aMSN dá um pau muito louco que nunca roda. Nem com o pacote, nem compilando, na hora que conecta, o amsn congela. Parece ser um problema com o modelo de threads utilizado no kernel 2.6 (que é o que utilizo).

Então, tive que passar a usar o gaim que detesto. E um dos motivos que eu detesto ele, é o fator de não ter notificação “Fulano de tal entrou no msn”. Sabia que tinha um plugin chamado guifications (ou algo assim), mas nunca fui muito atrás, de qualquer maneira.

Ontem, estava estudando o D-Bus, que é um sistema de comunicação entre processos numa mesma máquina, é um padrão de comunicação entre aplicações. Eu envio uma mensagem, a aplicação recebe e processa e vice-versa. Diferente do TCP, que transporta fluxo de bits, o D-Bus tranporta mensagens.

Enfim, descobri que o Pidgin (antigo gaim), tem um servidor D-Bus, ou seja, eu poderia acessar várias funções dele. Como já estava estudando o D-Bus (estava fazendo um programa que pesquisava cotações de ações escolhidas por mim e mostrava no desktop, com uma caixinha estilo as do msn). Resolvi então fazer meu próprio “plugin” para isso.

Então, minha linguagem escolhida foi o Python, por sua simplicidade e por já vir com bibilioteca de acesso ao dbus por padrão. O programinha avisa quando o usuário entra e tem também um botão para falar com ele no popup. A caixinha que sobe é estilo as do MSN, no canto inferior direito.

Como o Python é conciso por natureza, o código ficou bem enxuto com 41 linhas. Está bem simples ainda, depois ainda pretendo adicionar suporte ao KDE e XFCE e mostrar a foto da pessoa que entrou. Nesta parte, o pidgin é muito MAL documentado. Na realidade, não tem documentação.

O código segue abaixo, quem quiser utilizar, basta estar usando o gnome e ter o interpretador Python instalado e o pacote python-gobject (Bindings para a biblioteca GObject). Daí você roda o programa (em background, se quiser) e roda o pidgin. Pronto, nenhuma configuração é necessária.

import dbus
import dbus.glib
import gobject

bus = dbus.SessionBus()

obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
pidgin = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")

notify_obj = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
notify = dbus.Interface(notify_obj, "org.freedesktop.Notifications")

folks_cache = {}

def onSignOn(folkID):
    alias = pidgin.PurpleBuddyGetAlias(folkID)
    name = pidgin.PurpleBuddyGetName(folkID)

    alias = alias.replace('&', '&')
    alias = alias.replace('>', '>')
    alias = alias.replace('<', '<')

    text = "%s entrou." % alias

    notificationID = notify.Notify("DBus Test", 0, '/usr/share/icons/cab_view.png', '', \
text, ["newConversation", "Falar com o elemento"], {}, 9000)

    folks_cache[notificationID] = (pidgin.PurpleBuddyGetAccount(folkID), name)

def onClose(notificationID):
    if folks_cache.has(notificationID):
        del folks_cache[notificationID]

def onAction(notificationID, msgReceived):
    if msgReceived == "newConversation":
        pidgin.PurpleConversationNew(1, *folks_cache[notificationID])

bus.add_signal_receiver(onSignOn, dbus_interface="im.pidgin.purple.PurpleInterface", signal_name="BuddySignedOn")
bus.add_signal_receiver(onAction, dbus_interface="org.freedesktop.Notifications", signal_name="ActionInvoked")
bus.add_signal_receiver(onClose, dbus_interface="org.freedesktop.Notifications", signal_name="CloseNotification")

gobject.MainLoop().run()

Entry Filed under: Uncategorized. .

1 Comment Add your own

  • 1. Asafe  |  23 Fevereiro, 2009 at 9:47 pm

    Deu um erro e como não entendo de python…

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


Calendar

Novembro 2007
S T Q Q S S D
« Jun    
 1234
567891011
12131415161718
19202122232425
2627282930  

Most Recent Posts