Refactor Zeroconf presence
This commit is contained in:
parent
b37c578504
commit
d121bbf4ab
|
@ -144,28 +144,6 @@ class StreamConflictReceivedEvent(nec.NetworkIncomingEvent):
|
||||||
class PresenceReceivedEvent(nec.NetworkIncomingEvent):
|
class PresenceReceivedEvent(nec.NetworkIncomingEvent):
|
||||||
name = 'presence-received'
|
name = 'presence-received'
|
||||||
|
|
||||||
class ZeroconfPresenceReceivedEvent(nec.NetworkIncomingEvent):
|
|
||||||
name = 'presence-received'
|
|
||||||
|
|
||||||
def generate(self):
|
|
||||||
self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid)
|
|
||||||
self.resource = 'local'
|
|
||||||
self.prio = 0
|
|
||||||
self.keyID = None
|
|
||||||
self.idle_time = None
|
|
||||||
self.timestamp = 0
|
|
||||||
self.avatar_sha = None
|
|
||||||
self.need_add_in_roster = False
|
|
||||||
if self.show == 'offline':
|
|
||||||
self.ptype = 'unavailable'
|
|
||||||
else:
|
|
||||||
self.ptype = None
|
|
||||||
self.user_nick = ''
|
|
||||||
self.errcode = None
|
|
||||||
self.errmsg = ''
|
|
||||||
self.popup = False # Do we want to open chat window ?
|
|
||||||
return True
|
|
||||||
|
|
||||||
class OurShowEvent(nec.NetworkIncomingEvent):
|
class OurShowEvent(nec.NetworkIncomingEvent):
|
||||||
name = 'our-show'
|
name = 'our-show'
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,7 @@ class Presence:
|
||||||
raise nbxmpp.NodeProcessed
|
raise nbxmpp.NodeProcessed
|
||||||
|
|
||||||
def _update_contact(self, event, properties):
|
def _update_contact(self, event, properties):
|
||||||
|
# Note: A similar method also exists in connection_zeroconf
|
||||||
jid = properties.jid.getBare()
|
jid = properties.jid.getBare()
|
||||||
resource = properties.jid.getResource()
|
resource = properties.jid.getResource()
|
||||||
|
|
||||||
|
|
|
@ -131,9 +131,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf):
|
||||||
nickname=self.roster.getName(key), sub='both',
|
nickname=self.roster.getName(key), sub='both',
|
||||||
ask='no', groups=self.roster.getGroups(key),
|
ask='no', groups=self.roster.getGroups(key),
|
||||||
avatar_sha=None))
|
avatar_sha=None))
|
||||||
app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent(
|
self._on_presence(key)
|
||||||
None, conn=self, fjid=key, show=self.roster.getStatus(key),
|
|
||||||
status=self.roster.getMessage(key)))
|
|
||||||
#XXX open chat windows don't get refreshed (full name), add that
|
#XXX open chat windows don't get refreshed (full name), add that
|
||||||
return self.call_resolve_timeout
|
return self.call_resolve_timeout
|
||||||
|
|
||||||
|
@ -145,16 +143,98 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf):
|
||||||
nickname=self.roster.getName(jid), sub='both',
|
nickname=self.roster.getName(jid), sub='both',
|
||||||
ask='no', groups=self.roster.getGroups(jid),
|
ask='no', groups=self.roster.getGroups(jid),
|
||||||
avatar_sha=None))
|
avatar_sha=None))
|
||||||
app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent(
|
self._on_presence(jid)
|
||||||
None, conn=self, fjid=jid, show=self.roster.getStatus(jid),
|
|
||||||
status=self.roster.getMessage(jid)))
|
|
||||||
|
|
||||||
def _on_remove_service(self, jid):
|
def _on_remove_service(self, jid):
|
||||||
self.roster.delItem(jid)
|
self.roster.delItem(jid)
|
||||||
# 'NOTIFY' (account, (jid, status, status message, resource, priority,
|
# 'NOTIFY' (account, (jid, status, status message, resource, priority,
|
||||||
# keyID, timestamp))
|
# keyID, timestamp))
|
||||||
app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent(
|
self._on_presence(jid, show='offline', status='')
|
||||||
None, conn=self, fjid=jid, show='offline', status=''))
|
|
||||||
|
def _on_presence(self, jid, show=None, status=None):
|
||||||
|
if status is None:
|
||||||
|
status = self.roster.getMessage(jid)
|
||||||
|
if show is None:
|
||||||
|
show = self.roster.getStatus(jid)
|
||||||
|
|
||||||
|
ptype = 'unavailable' if show == 'offline' else None
|
||||||
|
|
||||||
|
event_attrs = {
|
||||||
|
'conn': self,
|
||||||
|
'keyID': None,
|
||||||
|
'prio': 0,
|
||||||
|
'need_add_in_roster': False,
|
||||||
|
'popup': False,
|
||||||
|
'ptype': ptype,
|
||||||
|
'jid': jid,
|
||||||
|
'resource': 'local',
|
||||||
|
'id_': None,
|
||||||
|
'fjid': jid,
|
||||||
|
'timestamp': 0,
|
||||||
|
'avatar_sha': None,
|
||||||
|
'user_nick': '',
|
||||||
|
'idle_time': None,
|
||||||
|
'show': show,
|
||||||
|
'new_show': show,
|
||||||
|
'old_show': 0,
|
||||||
|
'status': status,
|
||||||
|
'contact_list': [],
|
||||||
|
'contact': None,
|
||||||
|
}
|
||||||
|
|
||||||
|
event_ = NetworkEvent('presence-received', **event_attrs)
|
||||||
|
|
||||||
|
self._update_contact(event_)
|
||||||
|
|
||||||
|
app.nec.push_incoming_event(event_)
|
||||||
|
|
||||||
|
def _update_contact(self, event):
|
||||||
|
jid = event.jid
|
||||||
|
|
||||||
|
status_strings = ['offline', 'error', 'online', 'chat', 'away',
|
||||||
|
'xa', 'dnd', 'invisible']
|
||||||
|
|
||||||
|
event.new_show = status_strings.index(event.show)
|
||||||
|
|
||||||
|
contact = app.contacts.get_contact_strict(self.name, jid, '')
|
||||||
|
if contact is None:
|
||||||
|
contact = app.contacts.get_contact_strict(self.name, jid, 'local')
|
||||||
|
|
||||||
|
if contact.show in status_strings:
|
||||||
|
event.old_show = status_strings.index(contact.show)
|
||||||
|
|
||||||
|
# Update contact with presence data
|
||||||
|
contact.resource = 'local'
|
||||||
|
contact.show = event.show
|
||||||
|
contact.status = event.status
|
||||||
|
contact.priority = event.prio
|
||||||
|
attached_keys = app.config.get_per('accounts', self.name,
|
||||||
|
'attached_gpg_keys').split()
|
||||||
|
if jid in attached_keys:
|
||||||
|
contact.keyID = attached_keys[attached_keys.index(jid) + 1]
|
||||||
|
else:
|
||||||
|
# Do not override assigned key
|
||||||
|
contact.keyID = event.keyID
|
||||||
|
contact.idle_time = event.idle_time
|
||||||
|
|
||||||
|
event.contact = contact
|
||||||
|
|
||||||
|
# It's not an agent
|
||||||
|
if event.old_show == 0 and event.new_show > 1:
|
||||||
|
if not jid in app.newly_added[self.name]:
|
||||||
|
app.newly_added[self.name].append(jid)
|
||||||
|
if jid in app.to_be_removed[self.name]:
|
||||||
|
app.to_be_removed[self.name].remove(jid)
|
||||||
|
elif event.old_show > 1 and event.new_show == 0 and self.connected > 1:
|
||||||
|
if not jid in app.to_be_removed[self.name]:
|
||||||
|
app.to_be_removed[self.name].append(jid)
|
||||||
|
if jid in app.newly_added[self.name]:
|
||||||
|
app.newly_added[self.name].remove(jid)
|
||||||
|
|
||||||
|
if event.ptype == 'unavailable':
|
||||||
|
# TODO: This causes problems when another
|
||||||
|
# resource signs off!
|
||||||
|
self.stop_all_active_file_transfers(contact)
|
||||||
|
|
||||||
def _on_name_conflictCB(self, alt_name):
|
def _on_name_conflictCB(self, alt_name):
|
||||||
self.disconnect()
|
self.disconnect()
|
||||||
|
@ -208,9 +288,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf):
|
||||||
nickname=self.roster.getName(jid), sub='both',
|
nickname=self.roster.getName(jid), sub='both',
|
||||||
ask='no', groups=self.roster.getGroups(jid),
|
ask='no', groups=self.roster.getGroups(jid),
|
||||||
avatar_sha=None))
|
avatar_sha=None))
|
||||||
app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent(
|
self._on_presence(jid)
|
||||||
None, conn=self, fjid=jid, show=self.roster.getStatus(jid),
|
|
||||||
status=self.roster.getMessage(jid)))
|
|
||||||
|
|
||||||
self.connected = STATUS_LIST.index(show)
|
self.connected = STATUS_LIST.index(show)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue