Mercurial > libervia-backend
diff src/plugins/plugin_xep_0163.py @ 283:68cd30d982a5
core: added plugins for PubSub et PEP (first drafts)
- plugin for XEP 0060, 0163 and 0107, based on Wokkel's pubsub
- XEP 0115 plugin has been fixed, so generateHash can be called when features have changed (can be usefull to filter PEP)
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 03 Feb 2011 18:06:25 +0100 |
parents | |
children | 3b382fa0ac28 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/plugins/plugin_xep_0163.py Thu Feb 03 18:06:25 2011 +0100 @@ -0,0 +1,82 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +SAT plugin for Personal Eventing Protocol (xep-0163) +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 wokkel import disco +from wokkel.formats import Mood + +NS_USER_MOOD = 'http://jabber.org/protocol/mood' + +PLUGIN_INFO = { +"name": "Personal Eventing Protocol Plugin", +"import_name": "XEP_0163", +"type": "XEP", +"protocols": ["XEP-0163", "XEP-0107"], +"dependencies": ["XEP-0060"], +"main": "XEP_0163", +"handler": "no", +"description": _("""Implementation of Personal Eventing Protocol""") +} + +class XEP_0163(): + + def __init__(self, host): + info(_("PEP plugin initialization")) + self.host = host + self.pep_events=set() + host.trigger.add("PubSub Disco Info", self.disoInfoTrigger) + host.bridge.addSignal("personalEvent", ".communication", signature='ssa{ss}s') #args: from (jid), type(MOOD, TUNE, etc), data, profile + self.addPEPEvent("MOOD", NS_USER_MOOD, self.userMoodCB) + + def disoInfoTrigger(self, disco_info, profile): + """Add info from managed PEP + @param disco_info: list of disco feature as returned by PubSub, + will be filled with PEP features + @param profile: profile we are handling""" + disco_info.extend(map(disco.DiscoFeature, self.pep_events)) + return True + + def addPEPEvent(self, event_type, name, callback): + """Add a Personal Eventing Protocol event manager + @param event_type: type of the event (always uppercase), can be MOOD, TUNE, etc + @param name: namespace of the node (e.g. http://jabber.org/protocol/mood for User Mood) + @param callback: method to call when this event occur""" + self.pep_events.add(name) + self.pep_events.add(name+"+notify") + self.host.plugins["XEP_0060"].addManagedNode(name, callback) + + def userMoodCB(self, itemsEvent, profile): + try: + mood_elem = filter(lambda x:x.name == "mood", itemsEvent.items[0].children)[0] + except KeyError: + error(_("Can't find mood element in mood event")) + return + _mood = Mood.fromXml(mood_elem) + if not _mood: + error(_("Error while parsing mood element")) + return + self.host.bridge.personalEvent(itemsEvent.sender.full(), "MOOD", {"mood":_mood.value or "", "text":_mood.text or ""}, profile) +