# HG changeset patch # User souliane # Date 1395346698 -3600 # Node ID a9401694d2dccca07e4a40d8fb51af5bf161b66c # Parent 1a759096ccbd3e40c111706aefc009ca265c579d bridge, frontends: display presence with the highest priority + reset your own presence when you (dis)connect diff -r 1a759096ccbd -r a9401694d2dc frontends/src/bridge/DBus.py --- a/frontends/src/bridge/DBus.py Fri Mar 21 16:27:09 2014 +0100 +++ b/frontends/src/bridge/DBus.py Thu Mar 20 21:18:18 2014 +0100 @@ -200,8 +200,8 @@ def setParam(self, name, value, category, security_limit=-1, profile_key="@DEFAULT@"): return self.db_core_iface.setParam(name, value, category, security_limit, profile_key) - def setPresence(self, to_jid='', show='', priority=0, statuses={}, profile_key="@DEFAULT@"): - return self.db_core_iface.setPresence(to_jid, show, priority, statuses, profile_key) + def setPresence(self, to_jid='', show='', statuses={}, profile_key="@DEFAULT@"): + return self.db_core_iface.setPresence(to_jid, show, statuses, profile_key) def subscription(self, sub_type, entity, profile_key="@DEFAULT@"): return self.db_core_iface.subscription(sub_type, entity, profile_key) diff -r 1a759096ccbd -r a9401694d2dc frontends/src/primitivus/primitivus --- a/frontends/src/primitivus/primitivus Fri Mar 21 16:27:09 2014 +0100 +++ b/frontends/src/primitivus/primitivus Thu Mar 20 21:18:18 2014 +0100 @@ -608,6 +608,7 @@ def setStatusOnline(self, online=True, show="", statuses={}): if not online or not statuses: + self.status_bar.setPresenceStatus(show if online else 'unavailable', '') return try: self.status_bar.setPresenceStatus(show, statuses['default']) diff -r 1a759096ccbd -r a9401694d2dc frontends/src/quick_frontend/quick_app.py --- a/frontends/src/quick_frontend/quick_app.py Fri Mar 21 16:27:09 2014 +0100 +++ b/frontends/src/quick_frontend/quick_app.py Thu Mar 20 21:18:18 2014 +0100 @@ -179,10 +179,10 @@ priority = presences[contact][res][1] statuses = presences[contact][res][2] self.presenceUpdate(jabber_id, show, priority, statuses, profile) - data = self.bridge.getEntityData(contact, ['avatar', 'nick'], profile) - for key in ('avatar', 'nick'): - if key in data: - self.entityDataUpdated(contact, key, data[key], profile) + data = self.bridge.getEntityData(contact, ['avatar', 'nick'], profile) + for key in ('avatar', 'nick'): + if key in data: + self.entityDataUpdated(contact, key, data[key], profile) #The waiting subscription requests waitingSub = self.bridge.getWaitingSub(profile) @@ -313,7 +313,7 @@ self.setStatusOnline(True, show, statuses) return - self.contact_list.updatePresence(from_jid, show, priority, statuses) + presences = self.profiles[profile].setdefault('presences', {}) if show != 'unavailable': @@ -321,13 +321,32 @@ if from_jid.bare in self.profiles[profile]['watched'] and not from_jid.bare in self.profiles[profile]['onlineContact']: self.showAlert(_("Watched jid [%s] is connected !") % from_jid.bare) + presences[jabber_id] = {'show': show, 'priority': priority, 'statuses': statuses} self.profiles[profile]['onlineContact'].add(from_jid) # FIXME onlineContact is useless with CM, must be removed #TODO: vcard data (avatar) if show == "unavailable" and from_jid in self.profiles[profile]['onlineContact']: + try: + del presences[jabber_id] + except KeyError: + pass self.profiles[profile]['onlineContact'].remove(from_jid) + # check if the contact is connected with another resource, use the one with highest priority + jids = [jid for jid in presences if JID(jid).bare == from_jid.bare] + if jids: + max_jid = max(jids, key=lambda jid: presences[jid]['priority']) + data = presences[max_jid] + max_priority = data['priority'] + if show == "unavailable": # do not check the priority here, because 'unavailable' has a dummy one + from_jid = JID(max_jid) + show, priority, statuses = data['show'], data['priority'], data['statuses'] + if not jids or priority >= max_priority: + # case 1: not jids means all resources are disconnected, send the 'unavailable' presence + # case 2: update (or confirm) with the values of the resource which takes precedence + self.contact_list.updatePresence(from_jid, show, priority, statuses) + def roomJoined(self, room_jid, room_nicks, user_nick, profile): """Called when a MUC room is joined""" if not self.check_profile(profile): diff -r 1a759096ccbd -r a9401694d2dc src/bridge/DBus.py --- a/src/bridge/DBus.py Fri Mar 21 16:27:09 2014 +0100 +++ b/src/bridge/DBus.py Thu Mar 20 21:18:18 2014 +0100 @@ -396,10 +396,10 @@ return self._callback("setParam", unicode(name), unicode(value), unicode(category), security_limit, unicode(profile_key)) @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, - in_signature='ssia{ss}s', out_signature='', + in_signature='ssa{ss}s', out_signature='', async_callbacks=None) - def setPresence(self, to_jid='', show='', priority=0, statuses={}, profile_key="@DEFAULT@"): - return self._callback("setPresence", unicode(to_jid), unicode(show), priority, statuses, unicode(profile_key)) + def setPresence(self, to_jid='', show='', statuses={}, profile_key="@DEFAULT@"): + return self._callback("setPresence", unicode(to_jid), unicode(show), statuses, unicode(profile_key)) @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, in_signature='sss', out_signature='', diff -r 1a759096ccbd -r a9401694d2dc src/bridge/bridge_constructor/bridge_template.ini --- a/src/bridge/bridge_constructor/bridge_template.ini Fri Mar 21 16:27:09 2014 +0100 +++ b/src/bridge/bridge_constructor/bridge_template.ini Thu Mar 20 21:18:18 2014 +0100 @@ -357,19 +357,17 @@ [setPresence] type=method category=core -sig_in=ssia{ss}s +sig_in=ssa{ss}s sig_out= param_0_default='' param_1_default='' -param_2_default=0 -param_3_default={} -param_4_default="@DEFAULT@" +param_2_default={} +param_3_default="@DEFAULT@" doc=Set presence information for the profile doc_param_0=to_jid: the JID to who we send the presence data (emtpy string for broadcast) doc_param_1=show: as for [presenceUpdate] -doc_param_2=priority: as for [presenceUpdate] -doc_param_3=statuses: as for [presenceUpdate] -doc_param_4=%(doc_profile_key)s +doc_param_2=statuses: as for [presenceUpdate] +doc_param_3=%(doc_profile_key)s [subscription] type=method diff -r 1a759096ccbd -r a9401694d2dc src/core/sat_main.py --- a/src/core/sat_main.py Fri Mar 21 16:27:09 2014 +0100 +++ b/src/core/sat_main.py Thu Mar 20 21:18:18 2014 +0100 @@ -574,15 +574,16 @@ extra=mess_data['extra'], profile=profile) - def _setPresence(self, to="", show="", priority=0, statuses=None, profile_key=C.PROF_KEY_NONE): - return self.setPresence(jid.JID(to) if to else None, show, priority, statuses, profile_key) + def _setPresence(self, to="", show="", statuses=None, profile_key=C.PROF_KEY_NONE): + return self.setPresence(jid.JID(to) if to else None, show, statuses, profile_key) - def setPresence(self, to_jid=None, show="", priority=0, statuses=None, profile_key=C.PROF_KEY_NONE): + def setPresence(self, to_jid=None, show="", statuses=None, profile_key=C.PROF_KEY_NONE): """Send our presence information""" if statuses is None: statuses = {} profile = self.memory.getProfileName(profile_key) assert(profile) + priority = int(self.memory.getParamA("Priority", "Connection", profile_key=profile)) self.profiles[profile].presence.available(to_jid, show, statuses, priority) #XXX: FIXME: temporary fix to work around openfire 3.7.0 bug (presence is not broadcasted to generating resource) if '' in statuses: