changeset 293:42438e43104a

Plugin XEP-0277: first draft of microblogging over ip /!\ new dependencies added /!\ - the xe and pyfeed dependencies were added (see setup.py)
author Goffi <goffi@goffi.org>
date Tue, 08 Feb 2011 02:16:26 +0100
parents f7bd973bba5a
children 9821e3dde550
files setup.py src/plugins/plugin_xep_0277.py
diffstat 2 files changed, 96 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- /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 <http://www.gnu.org/licenses/>.
+"""
+
+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
+