Inicio   defunct.gatopelao.org(Terminales / Xen / freeNX / etc)
agenda(2)  barrufet(5)  debian(1)  linux(1)  network(2)  rediris(3)  statusnet(3)  storage(2)  xen(4)  xmpp(1)  
weblog gatopelao

Wed, 09 Dec 2009

xmpp bot

Llevaba demasiado tiempo con ganas de programar un bot. Ahora que ha salido una razon para hacerlo, me he puesto.

Tenemos un servidor jabber y todos lo usamos mucho desde hace ya unos cuantos años. Ultimamente la gente me ha pedido una manera de enviar un mensaje a un grupo de personas. Los chat rooms son incomodas porque tienes que ir al propósito a la sala para participar. Necesitamos un mecanismo para enviar a la broadcast.

Todos los usuarios y los grupos de usuarios están definidos en un LDAP. El servidor jabber también usa LDAP para saber y autentificar los usuarios.
El bot consulta LDAP para saber los miembros de cada grupo.

La funcionalidad es básica. Con escribirle 'help' al bot nos contesta:

Puedo enviar tus mensajes a un grupo de usuarios. Para saber cuales son tus grupos teclea:
grupos

Para saber los usuarios que pertenecen a un grupo teclea
'users' seguido por el nombre del grupo ej:
users nombre_de_grupo

Para enviar un mensaje a un grupo, empieza el mensaje por el nombre del grupo. ej:
nombre_de_grupo Lunes de nuevo, que palo.

Está programado en python.

He usado la librería xmpppy y no ha sido nada dificil.

Lo único que me ha faltado del ejemplo bot.py es que el bot aceptase subscripciones automáticamente. He encontrado la respuesta en http://grumplicio.us/nihongobot.py

def presenceCB(conn,pres):
    type=pres.getType()
    user=pres.getFrom()
    if type=='subscribe':
        conn.send(xmpp.Presence(user,'subscribed'))
    if type=='unsubscribe':
        conn.send(xmpp.Presence(user,'unsubscribed'))
y lo registramos
conn.RegisterHandler('presence',presenceCB)

Para que los usuarios puedan identificar los grupos con más facilidad, se colora con XHTML
def addColor(message,groupname):
        color=ldapcache.getGroupColor(groupname)
        html_tag="<span style='background: %s;'>%s</span>" % (color,groupname)
        text= message.getBody()

        markedup=replace(text, groupname, html_tag, 1)
        markedup=markedup.encode('utf-8')
        payload=xmpp.simplexml.XML2Node('<body xmlns="%s">%s</body>' %  (XML_NAMESPACE, markedup))
        message.addChild('html', {}, [payload], xmpp.NS_XHTML_IM)

Tengo un pequeño classe que cachea los resultados del LDAP. Para trabajar con LDAP empleo ldaphelper.py que me ayuda a cargar el objeto ldapcache.

El código está aquí.

[/xmpp] permanent link


June.2010(2)   May.2010(2)   March.2010(1)   January.2010(1)   December.2009(3)   November.2009(4)   October.2009(11)  
Blog software: Blosxom.com The unofficial Blosxum user group
RSS Feed rss feed