Refactor Zeroconf presence

This commit is contained in:
Philipp Hörist 2019-01-02 16:10:30 +01:00
parent b37c578504
commit d121bbf4ab
3 changed files with 90 additions and 33 deletions

View File

@ -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'

View File

@ -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()

View File

@ -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)