# HG changeset patch # User Goffi # Date 1297127786 -3600 # Node ID 42438e43104a73f6488923802e401193dfd79587 # Parent f7bd973bba5abaf7ce6157abfed7a6cc32771825 Plugin XEP-0277: first draft of microblogging over ip /!\ new dependencies added /!\ - the xe and pyfeed dependencies were added (see setup.py) diff -r f7bd973bba5a -r 42438e43104a setup.py --- a/setup.py Tue Feb 08 00:01:53 2011 +0100 +++ b/setup.py Tue Feb 08 02:16:26 2011 +0100 @@ -203,7 +203,8 @@ ], scripts=['frontends/src/jp/jp', 'frontends/src/primitivus/primitivus', 'frontends/src/wix/wix'], zip_safe=False, - install_requires=['twisted', 'progressbar', 'urwid', 'beautifulsoup', 'mercurial', 'urwid-satext'], + dependency_links = ['http://www.blarg.net/%7Esteveha/pyfeed-0.7.4.tar.gz','http://www.blarg.net/%7Esteveha/xe-0.7.4.tar.gz'], + install_requires=['twisted', 'progressbar', 'urwid', 'beautifulsoup', 'mercurial', 'urwid-satext','pyfeed','xe'], cmdclass=dict(install=custom_install), ) #XXX: The Mercurial dependecy is just here to build the custom wokkel (with MUC branch), it must be removed # and replace by wokkel as soon as MUC branch is officially available in wokkel main branch. diff -r f7bd973bba5a -r 42438e43104a src/plugins/plugin_xep_0277.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/plugins/plugin_xep_0277.py Tue Feb 08 02:16:26 2011 +0100 @@ -0,0 +1,94 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +SAT plugin for microblogging over XMPP (xep-0277) +Copyright (C) 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +from logging import debug, info, error +from twisted.internet import protocol +from twisted.words.protocols.jabber import client, jid +from twisted.words.protocols.jabber import error as jab_error +import twisted.internet.error +from twisted.words.xish import domish +from sat.tools.xml_tools import ElementParser + +from wokkel import disco,pubsub +from feed.atom import Entry +import uuid +from time import time + +NS_MICROBLOG = 'urn:xmpp:microblog:0' + +PLUGIN_INFO = { +"name": "Microblogging over XMPP Plugin", +"import_name": "XEP-0277", +"type": "XEP", +"protocols": [], +"dependencies": ["XEP-0163"], +"main": "XEP_0277", +"handler": "no", +"description": _("""Implementation of microblogging Protocol""") +} + +class XEP_0277(): + + def __init__(self, host): + info(_("Microblogging plugin initialization")) + self.host = host + self.host.plugins["XEP-0163"].addPEPEvent("MICROBLOG", NS_MICROBLOG, self.microblogCB, self.sendMicroblog) + + def microblogCB(self, itemsEvent, profile): + _entry = None + for item in itemsEvent.items: + try: + entry_elt = filter (lambda x:x.name == "entry", item.children)[0] + except KeyError: + warning(_('No entry element in microblog item')) + return + _entry = Entry().import_xml(entry_elt.toXml().encode('utf-8')) + microblog_data={} + try: + microblog_data['content'] = _entry.title.text + microblog_data['timestamp'] = str(int(_entry.updated.tf)) + microblog_data['id'] = item['id'] + except AttributeError, KeyError: + error(_('Error while parsing atom entry for microblogging event')) + return + self.host.bridge.personalEvent(itemsEvent.sender.full(), "MICROBLOG", microblog_data, profile) + + def sendMicroblog(self, data, profile): + """Send XEP-0277's microblog data + @param data: must include content + @param profile: profile which send the mood""" + if not data.has_key('content'): + error(_("Microblog data must contain at least 'content' key")) + return 3 + content = data['content'] + if not content: + error(_("Microblog data's content value must not be empty")) + _uuid = unicode(uuid.uuid1()) + _entry = Entry() + _entry.title = content.encode('utf-8') + _entry.updated = time() + _entry.id = _uuid + _entry_elt = ElementParser()(str(_entry)) + item = pubsub.Item(payload=_entry_elt) + item['id'] = _uuid + self.host.plugins["XEP-0060"].publish(None, NS_MICROBLOG, [item], profile_key = profile) + return 0 +