Mercurial > libervia-backend
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 |