comparison src/plugins/plugin_xep_0163.py @ 286:3b382fa0ac28

plugin xep-0163: added mood publishing
author Goffi <goffi@goffi.org>
date Fri, 04 Feb 2011 01:06:57 +0100
parents 68cd30d982a5
children 59a82af700e2
comparison
equal deleted inserted replaced
285:6422fcdd831c 286:3b382fa0ac28
22 from logging import debug, info, error 22 from logging import debug, info, error
23 from twisted.internet import protocol 23 from twisted.internet import protocol
24 from twisted.words.protocols.jabber import client, jid 24 from twisted.words.protocols.jabber import client, jid
25 from twisted.words.protocols.jabber import error as jab_error 25 from twisted.words.protocols.jabber import error as jab_error
26 import twisted.internet.error 26 import twisted.internet.error
27 from twisted.words.xish import domish
27 28
28 from wokkel import disco 29 from wokkel import disco,pubsub
29 from wokkel.formats import Mood 30 from wokkel.formats import Mood
30 31
31 NS_USER_MOOD = 'http://jabber.org/protocol/mood' 32 NS_USER_MOOD = 'http://jabber.org/protocol/mood'
33
34 MANAGED_EVENTS=['MOOD']
32 35
33 PLUGIN_INFO = { 36 PLUGIN_INFO = {
34 "name": "Personal Eventing Protocol Plugin", 37 "name": "Personal Eventing Protocol Plugin",
35 "import_name": "XEP_0163", 38 "import_name": "XEP_0163",
36 "type": "XEP", 39 "type": "XEP",
47 info(_("PEP plugin initialization")) 50 info(_("PEP plugin initialization"))
48 self.host = host 51 self.host = host
49 self.pep_events=set() 52 self.pep_events=set()
50 host.trigger.add("PubSub Disco Info", self.disoInfoTrigger) 53 host.trigger.add("PubSub Disco Info", self.disoInfoTrigger)
51 host.bridge.addSignal("personalEvent", ".communication", signature='ssa{ss}s') #args: from (jid), type(MOOD, TUNE, etc), data, profile 54 host.bridge.addSignal("personalEvent", ".communication", signature='ssa{ss}s') #args: from (jid), type(MOOD, TUNE, etc), data, profile
55 host.bridge.addMethod("sendPersonalEvent", ".communication", in_sign='sa{ss}s', out_sign='i', method=self.sendPersonalEvent) #args: type(MOOD, TUNE, etc), data, profile_key; return 0 or error_code
52 self.addPEPEvent("MOOD", NS_USER_MOOD, self.userMoodCB) 56 self.addPEPEvent("MOOD", NS_USER_MOOD, self.userMoodCB)
53 57
54 def disoInfoTrigger(self, disco_info, profile): 58 def disoInfoTrigger(self, disco_info, profile):
55 """Add info from managed PEP 59 """Add info from managed PEP
56 @param disco_info: list of disco feature as returned by PubSub, 60 @param disco_info: list of disco feature as returned by PubSub,
66 @param callback: method to call when this event occur""" 70 @param callback: method to call when this event occur"""
67 self.pep_events.add(name) 71 self.pep_events.add(name)
68 self.pep_events.add(name+"+notify") 72 self.pep_events.add(name+"+notify")
69 self.host.plugins["XEP_0060"].addManagedNode(name, callback) 73 self.host.plugins["XEP_0060"].addManagedNode(name, callback)
70 74
75 def sendPersonalEvent(self, event_type, data, profile_key='@DEFAULT@'):
76 """Send personal event after checking the data is alright
77 @param event_type: type of event (eg: MOOD, TUNE), must be in MANAGED_EVENTS
78 @param data: dict of {string:string} of event_type dependant data
79 @param profile_key: profile who send the event
80 @return: 0 if success, error code else"""
81 profile = self.host.memory.getProfileName(profile_key)
82 if not profile:
83 error(_('Trying to send personal event with an unknown profile key [%s]') % profile_key)
84 return 1
85 if not event_type in MANAGED_EVENTS:
86 error (_('Trying to send personal event for an unknown type'))
87 return 2
88 if event_type == "MOOD":
89 return self.sendMood(data, profile)
90
71 def userMoodCB(self, itemsEvent, profile): 91 def userMoodCB(self, itemsEvent, profile):
72 try: 92 try:
73 mood_elem = filter(lambda x:x.name == "mood", itemsEvent.items[0].children)[0] 93 mood_elem = filter(lambda x:x.name == "mood", itemsEvent.items[0].children)[0]
74 except KeyError: 94 except KeyError:
75 error(_("Can't find mood element in mood event")) 95 error(_("Can't find mood element in mood event"))
76 return 96 return
77 _mood = Mood.fromXml(mood_elem) 97 _mood = Mood.fromXml(mood_elem)
78 if not _mood: 98 if not _mood:
79 error(_("Error while parsing mood element")) 99 debug(_("No mood found"))
80 return 100 return
81 self.host.bridge.personalEvent(itemsEvent.sender.full(), "MOOD", {"mood":_mood.value or "", "text":_mood.text or ""}, profile) 101 self.host.bridge.personalEvent(itemsEvent.sender.full(), "MOOD", {"mood":_mood.value or "", "text":_mood.text or ""}, profile)
82 102
103 def sendMood(self, data, profile):
104 """Send XEP-0107's User Mood
105 @param data: must include mood and text
106 @param profile: profile which send the mood"""
107 try:
108 value = data['mood'].lower()
109 text = data['text'] if data.has_key('text') else ''
110 except KeyError:
111 error(_("Mood data must contain at least 'mood' key"))
112 return 3
113 _mood = UserMood(value, text)
114 item = pubsub.Item(payload=_mood)
115 jid, xmlstream = self.host.getJidNStream(profile)
116 assert(jid)
117 self.host.plugins["XEP_0060"].publish(None, NS_USER_MOOD, [item], profile_key = profile)
118 return 0
119
120 class UserMood(Mood, domish.Element):
121 """Improved wokkel Mood which is also a domish.Element"""
122
123 def __init__(self, value, text=None):
124 Mood.__init__(self, value, text)
125 domish.Element.__init__(self, (NS_USER_MOOD, 'mood'))
126 self.addElement(value)
127 if text:
128 self.addElement('text', content=text)
129