spread presence handler into classes that really need it
This commit is contained in:
parent
180178608d
commit
2476506338
|
@ -1115,6 +1115,8 @@ ConnectionJingle, ConnectionIBBytestream):
|
||||||
self._nec_gmail_new_mail_received)
|
self._nec_gmail_new_mail_received)
|
||||||
gajim.ged.register_event_handler('ping-received', ged.CORE,
|
gajim.ged.register_event_handler('ping-received', ged.CORE,
|
||||||
self._nec_ping_received)
|
self._nec_ping_received)
|
||||||
|
gajim.ged.register_event_handler('presence-received', ged.CORE,
|
||||||
|
self._nec_presence_received)
|
||||||
|
|
||||||
def build_http_auth_answer(self, iq_obj, answer):
|
def build_http_auth_answer(self, iq_obj, answer):
|
||||||
if not self.connection or self.connected < 2:
|
if not self.connection or self.connected < 2:
|
||||||
|
@ -1743,6 +1745,131 @@ ConnectionJingle, ConnectionIBBytestream):
|
||||||
gajim.nec.push_incoming_event(NetworkEvent('raw-pres-received',
|
gajim.nec.push_incoming_event(NetworkEvent('raw-pres-received',
|
||||||
conn=self, iq_obj=prs))
|
conn=self, iq_obj=prs))
|
||||||
|
|
||||||
|
def _nec_presence_received(self, obj):
|
||||||
|
account = obj.conn.name
|
||||||
|
jid = obj.jid
|
||||||
|
resource = obj.resource or ''
|
||||||
|
|
||||||
|
statuss = ['offline', 'error', 'online', 'chat', 'away', 'xa', 'dnd',
|
||||||
|
'invisible']
|
||||||
|
obj.old_show = 0
|
||||||
|
obj.new_show = statuss.index(obj.show)
|
||||||
|
|
||||||
|
obj.contact_list = []
|
||||||
|
|
||||||
|
highest = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
||||||
|
obj.was_highest = (highest and highest.resource == resource)
|
||||||
|
|
||||||
|
# Update contact
|
||||||
|
obj.contact_list = gajim.contacts.get_contacts(account, jid)
|
||||||
|
obj.contact = None
|
||||||
|
resources = []
|
||||||
|
for c in obj.contact_list:
|
||||||
|
resources.append(c.resource)
|
||||||
|
if c.resource == resource:
|
||||||
|
obj.contact = c
|
||||||
|
break
|
||||||
|
|
||||||
|
if obj.contact:
|
||||||
|
obj.old_show = statuss.index(obj.contact.show)
|
||||||
|
# nick changed
|
||||||
|
if obj.contact_nickname is not None and \
|
||||||
|
obj.contact.contact_name != obj.contact_nickname:
|
||||||
|
obj.contact.contact_name = obj.contact_nickname
|
||||||
|
obj.need_redraw = True
|
||||||
|
# gajim.interface.roster.draw_contact(jid, account)
|
||||||
|
|
||||||
|
if obj.old_show == obj.new_show and obj.contact.status == \
|
||||||
|
obj.status and obj.contact.priority == obj.prio: # no change
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
obj.contact = gajim.contacts.get_first_contact_from_jid(account,
|
||||||
|
jid)
|
||||||
|
if not obj.contact:
|
||||||
|
# Presence of another resource of our jid
|
||||||
|
# Create self contact and add to roster
|
||||||
|
if resource == obj.conn.server_resource:
|
||||||
|
return
|
||||||
|
# Ignore offline presence of unknown self resource
|
||||||
|
if obj.new_show < 2:
|
||||||
|
return
|
||||||
|
obj.contact = gajim.contacts.create_self_contact(jid=jid,
|
||||||
|
account=account, show=obj.show, status=obj.status,
|
||||||
|
priority=obj.prio, keyID=obj.keyID,
|
||||||
|
resource=obj.resource)
|
||||||
|
gajim.contacts.add_contact(account, obj.contact)
|
||||||
|
obj.contact_list.append(obj.contact)
|
||||||
|
else:
|
||||||
|
obj.old_show = statuss.index(obj.contact.show)
|
||||||
|
if (resources != [''] and (len(obj.contact_list) != 1 or \
|
||||||
|
obj.contact_list[0].show != 'offline')) and \
|
||||||
|
not gajim.jid_is_transport(jid):
|
||||||
|
# Another resource of an existing contact connected
|
||||||
|
obj.old_show = 0
|
||||||
|
obj.contact = gajim.contacts.copy_contact(obj.contact)
|
||||||
|
obj.contact_list.append(obj.contact)
|
||||||
|
obj.contact.resource = resource
|
||||||
|
|
||||||
|
obj.need_add_in_roster = True
|
||||||
|
# gajim.interface.roster.add_contact(jid, account)
|
||||||
|
|
||||||
|
if not gajim.jid_is_transport(jid) and len(obj.contact_list) == 1:
|
||||||
|
# It's not an agent
|
||||||
|
if obj.old_show == 0 and obj.new_show > 1:
|
||||||
|
if not jid in gajim.newly_added[account]:
|
||||||
|
gajim.newly_added[account].append(jid)
|
||||||
|
if jid in gajim.to_be_removed[account]:
|
||||||
|
gajim.to_be_removed[account].remove(jid)
|
||||||
|
elif obj.old_show > 1 and obj.new_show == 0 and \
|
||||||
|
obj.conn.connected > 1:
|
||||||
|
if not jid in gajim.to_be_removed[account]:
|
||||||
|
gajim.to_be_removed[account].append(jid)
|
||||||
|
if jid in gajim.newly_added[account]:
|
||||||
|
gajim.newly_added[account].remove(jid)
|
||||||
|
obj.need_redraw = True
|
||||||
|
# self.roster.draw_contact(jid, account)
|
||||||
|
|
||||||
|
obj.contact.show = obj.show
|
||||||
|
obj.contact.status = obj.status
|
||||||
|
obj.contact.priority = obj.prio
|
||||||
|
obj.contact.keyID = obj.keyID
|
||||||
|
if obj.timestamp:
|
||||||
|
obj.contact.last_status_time = obj.timestamp
|
||||||
|
elif not gajim.block_signed_in_notifications[account]:
|
||||||
|
# We're connected since more that 30 seconds
|
||||||
|
obj.contact.last_status_time = localtime()
|
||||||
|
obj.contact.contact_nickname = obj.contact_nickname
|
||||||
|
|
||||||
|
if gajim.jid_is_transport(jid):
|
||||||
|
return
|
||||||
|
|
||||||
|
# It isn't an agent
|
||||||
|
# reset chatstate if needed:
|
||||||
|
# (when contact signs out or has errors)
|
||||||
|
if obj.show in ('offline', 'error'):
|
||||||
|
obj.contact.our_chatstate = obj.contact.chatstate = \
|
||||||
|
obj.contact.composing_xep = None
|
||||||
|
|
||||||
|
# TODO: This causes problems when another
|
||||||
|
# resource signs off!
|
||||||
|
self.stop_all_active_file_transfers(obj.contact)
|
||||||
|
|
||||||
|
# disable encryption, since if any messages are
|
||||||
|
# lost they'll be not decryptable (note that
|
||||||
|
# this contradicts XEP-0201 - trying to get that
|
||||||
|
# in the XEP, though)
|
||||||
|
|
||||||
|
# there won't be any sessions here if the contact terminated
|
||||||
|
# their sessions before going offline (which we do)
|
||||||
|
for sess in self.get_sessions(jid):
|
||||||
|
if obj.fjid != str(sess.jid):
|
||||||
|
continue
|
||||||
|
if sess.control:
|
||||||
|
sess.control.no_autonegotiation = False
|
||||||
|
if sess.enable_encryption:
|
||||||
|
sess.terminate_e2e()
|
||||||
|
self.delete_session(jid, sess.thread_id)
|
||||||
|
|
||||||
def _StanzaArrivedCB(self, con, obj):
|
def _StanzaArrivedCB(self, con, obj):
|
||||||
self.last_io = gajim.idlequeue.current_time()
|
self.last_io = gajim.idlequeue.current_time()
|
||||||
|
|
||||||
|
|
|
@ -604,6 +604,10 @@ class PresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.conn = self.base_event.conn
|
self.conn = self.base_event.conn
|
||||||
self.iq_obj = self.base_event.iq_obj
|
self.iq_obj = self.base_event.iq_obj
|
||||||
|
|
||||||
|
self.need_add_in_roster = False
|
||||||
|
self.need_redraw = False
|
||||||
|
|
||||||
self.ptype = self.iq_obj.getType()
|
self.ptype = self.iq_obj.getType()
|
||||||
if self.ptype == 'available':
|
if self.ptype == 'available':
|
||||||
self.ptype = None
|
self.ptype = None
|
||||||
|
@ -627,6 +631,10 @@ class PresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
_('Nickname not allowed: %s') % resource, None, False, None,
|
_('Nickname not allowed: %s') % resource, None, False, None,
|
||||||
[]))
|
[]))
|
||||||
return
|
return
|
||||||
|
jid_list = gajim.contacts.get_jid_list(self.conn.name)
|
||||||
|
# if self.jid not in jid_list and self.jid != gajim.get_jid_from_account(
|
||||||
|
# self.conn.name):
|
||||||
|
# return
|
||||||
self.timestamp = None
|
self.timestamp = None
|
||||||
self.get_id()
|
self.get_id()
|
||||||
self.is_gc = False # is it a GC presence ?
|
self.is_gc = False # is it a GC presence ?
|
||||||
|
@ -957,5 +965,5 @@ class PresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
self.conn.server_resource:
|
self.conn.server_resource:
|
||||||
# We got our own presence
|
# We got our own presence
|
||||||
self.conn.dispatch('STATUS', self.show)
|
self.conn.dispatch('STATUS', self.show)
|
||||||
else:
|
elif self.jid in jid_list:
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -995,12 +995,17 @@ _('Please fill in the data of the contact you want to add in account %s') % acco
|
||||||
message_buffer.set_text(helpers.get_subscription_request_msg(
|
message_buffer.set_text(helpers.get_subscription_request_msg(
|
||||||
self.account))
|
self.account))
|
||||||
|
|
||||||
|
gajim.ged.register_event_handler('presence-received', ged.GUI1,
|
||||||
|
self._nec_presence_received)
|
||||||
|
|
||||||
def on_add_new_contact_window_destroy(self, widget):
|
def on_add_new_contact_window_destroy(self, widget):
|
||||||
if self.account:
|
if self.account:
|
||||||
location = gajim.interface.instances[self.account]
|
location = gajim.interface.instances[self.account]
|
||||||
else:
|
else:
|
||||||
location = gajim.interface.instances
|
location = gajim.interface.instances
|
||||||
del location['add_contact']
|
del location['add_contact']
|
||||||
|
gajim.ged.remove_event_handler('presence-received', ged.GUI1,
|
||||||
|
self._nec_presence_received)
|
||||||
|
|
||||||
def on_register_button_clicked(self, widget):
|
def on_register_button_clicked(self, widget):
|
||||||
jid = self.protocol_jid_combobox.get_active_text().decode('utf-8')
|
jid = self.protocol_jid_combobox.get_active_text().decode('utf-8')
|
||||||
|
@ -1154,6 +1159,14 @@ _('Please fill in the data of the contact you want to add in account %s') % acco
|
||||||
self.connected_label.show()
|
self.connected_label.show()
|
||||||
self.add_button.set_sensitive(False)
|
self.add_button.set_sensitive(False)
|
||||||
|
|
||||||
|
def _nec_presence_received(self, obj):
|
||||||
|
if gajim.jid_is_transport(obj.jid):
|
||||||
|
if obj.old_show == 0 and obj.new_show > 1:
|
||||||
|
self.transport_signed_in(obj.jid)
|
||||||
|
elif obj.old_show > 1 and obj.new_show == 0:
|
||||||
|
self.transport_signed_out(obj.jid)
|
||||||
|
|
||||||
|
|
||||||
class AboutDialog:
|
class AboutDialog:
|
||||||
"""
|
"""
|
||||||
Class for about dialog
|
Class for about dialog
|
||||||
|
|
|
@ -290,249 +290,76 @@ class Interface:
|
||||||
#
|
#
|
||||||
# Contact changed show
|
# Contact changed show
|
||||||
|
|
||||||
# FIXME: Drop and rewrite...
|
|
||||||
|
|
||||||
statuss = ['offline', 'error', 'online', 'chat', 'away', 'xa', 'dnd',
|
|
||||||
'invisible']
|
|
||||||
|
|
||||||
account = obj.conn.name
|
account = obj.conn.name
|
||||||
jid = obj.jid
|
jid = obj.jid
|
||||||
show = obj.show
|
show = obj.show
|
||||||
status = obj.status
|
status = obj.status
|
||||||
resource = obj.resource or ''
|
resource = obj.resource or ''
|
||||||
priority = obj.prio
|
|
||||||
keyID = obj.keyID
|
|
||||||
timestamp = obj.timestamp
|
|
||||||
contact_nickname = obj.contact_nickname
|
|
||||||
|
|
||||||
obj.old_show = 0
|
|
||||||
obj.new_show = statuss.index(show)
|
|
||||||
|
|
||||||
lcontact = []
|
|
||||||
|
|
||||||
highest = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
|
||||||
was_highest = (highest and highest.resource == resource)
|
|
||||||
|
|
||||||
# Update contact
|
|
||||||
jid_list = gajim.contacts.get_jid_list(account)
|
jid_list = gajim.contacts.get_jid_list(account)
|
||||||
if jid in jid_list or jid == gajim.get_jid_from_account(account):
|
|
||||||
lcontact = gajim.contacts.get_contacts(account, jid)
|
|
||||||
contact1 = None
|
|
||||||
resources = []
|
|
||||||
for c in lcontact:
|
|
||||||
resources.append(c.resource)
|
|
||||||
if c.resource == resource:
|
|
||||||
contact1 = c
|
|
||||||
break
|
|
||||||
|
|
||||||
if contact1:
|
# unset custom status
|
||||||
if contact1.show in statuss:
|
if (obj.old_show == 0 and obj.new_show > 1) or \
|
||||||
obj.old_show = statuss.index(contact1.show)
|
(obj.old_show > 1 and obj.new_show == 0 and obj.conn.connected > 1):
|
||||||
# nick changed
|
if account in self.status_sent_to_users and \
|
||||||
if contact_nickname is not None and \
|
jid in self.status_sent_to_users[account]:
|
||||||
contact1.contact_name != contact_nickname:
|
del self.status_sent_to_users[account][jid]
|
||||||
contact1.contact_name = contact_nickname
|
|
||||||
self.roster.draw_contact(jid, account)
|
|
||||||
|
|
||||||
if obj.old_show == obj.new_show and contact1.status == status \
|
|
||||||
and contact1.priority == priority: # no change
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
contact1 = gajim.contacts.get_first_contact_from_jid(account,
|
|
||||||
jid)
|
|
||||||
if not contact1:
|
|
||||||
# Presence of another resource of our
|
|
||||||
# jid
|
|
||||||
# Create self contact and add to roster
|
|
||||||
if resource == obj.conn.server_resource:
|
|
||||||
return
|
|
||||||
# Ignore offline presence of unknown self resource
|
|
||||||
if obj.new_show < 2:
|
|
||||||
return
|
|
||||||
contact1 = gajim.contacts.create_self_contact(jid=jid,
|
|
||||||
account=account, show=show, status=status,
|
|
||||||
priority=priority, keyID=keyID, resource=resource)
|
|
||||||
obj.old_show = 0
|
|
||||||
gajim.contacts.add_contact(account, contact1)
|
|
||||||
lcontact.append(contact1)
|
|
||||||
elif contact1.show in statuss:
|
|
||||||
obj.old_show = statuss.index(contact1.show)
|
|
||||||
if (resources != [''] and (len(lcontact) != 1 or \
|
|
||||||
lcontact[0].show != 'offline')) and \
|
|
||||||
not gajim.jid_is_transport(jid):
|
|
||||||
# Another resource of an existing contact connected
|
|
||||||
obj.old_show = 0
|
|
||||||
contact1 = gajim.contacts.copy_contact(contact1)
|
|
||||||
lcontact.append(contact1)
|
|
||||||
contact1.resource = resource
|
|
||||||
|
|
||||||
self.roster.add_contact(contact1.jid, account)
|
|
||||||
|
|
||||||
if not gajim.jid_is_transport(contact1.jid) and len(lcontact) == 1:
|
|
||||||
# It's not an agent
|
|
||||||
if obj.old_show == 0 and obj.new_show > 1:
|
|
||||||
if not contact1.jid in gajim.newly_added[account]:
|
|
||||||
gajim.newly_added[account].append(contact1.jid)
|
|
||||||
if contact1.jid in gajim.to_be_removed[account]:
|
|
||||||
gajim.to_be_removed[account].remove(contact1.jid)
|
|
||||||
gobject.timeout_add_seconds(5,
|
|
||||||
self.roster.remove_newly_added, contact1.jid, account)
|
|
||||||
elif obj.old_show > 1 and obj.new_show == 0 and \
|
|
||||||
obj.conn.connected > 1:
|
|
||||||
if not contact1.jid in gajim.to_be_removed[account]:
|
|
||||||
gajim.to_be_removed[account].append(contact1.jid)
|
|
||||||
if contact1.jid in gajim.newly_added[account]:
|
|
||||||
gajim.newly_added[account].remove(contact1.jid)
|
|
||||||
self.roster.draw_contact(contact1.jid, account)
|
|
||||||
gobject.timeout_add_seconds(5,
|
|
||||||
self.roster.remove_to_be_removed, contact1.jid, account)
|
|
||||||
|
|
||||||
# unset custom status
|
|
||||||
if (obj.old_show == 0 and obj.new_show > 1) or \
|
|
||||||
(obj.old_show > 1 and obj.new_show == 0 and obj.conn.connected > 1):
|
|
||||||
if account in self.status_sent_to_users and \
|
|
||||||
jid in self.status_sent_to_users[account]:
|
|
||||||
del self.status_sent_to_users[account][jid]
|
|
||||||
|
|
||||||
contact1.show = show
|
|
||||||
contact1.status = status
|
|
||||||
contact1.priority = priority
|
|
||||||
contact1.keyID = keyID
|
|
||||||
if timestamp:
|
|
||||||
contact1.last_status_time = timestamp
|
|
||||||
elif not gajim.block_signed_in_notifications[account]:
|
|
||||||
# We're connected since more that 30 seconds
|
|
||||||
contact1.last_status_time = time.localtime()
|
|
||||||
contact1.contact_nickname = contact_nickname
|
|
||||||
|
|
||||||
if gajim.jid_is_transport(jid):
|
if gajim.jid_is_transport(jid):
|
||||||
# It must be an agent
|
# It must be an agent
|
||||||
if jid in jid_list:
|
|
||||||
# Update existing iter and group counting
|
|
||||||
self.roster.draw_contact(jid, account)
|
|
||||||
self.roster.draw_group(_('Transports'), account)
|
|
||||||
if obj.new_show > 1 and jid in gajim.transport_avatar[account]:
|
|
||||||
# transport just signed in.
|
|
||||||
# request avatars
|
|
||||||
for jid_ in gajim.transport_avatar[account][jid]:
|
|
||||||
obj.conn.request_vcard(jid_)
|
|
||||||
# transport just signed in/out, don't show
|
|
||||||
# popup notifications for 30s
|
|
||||||
account_jid = account + '/' + jid
|
|
||||||
gajim.block_signed_in_notifications[account_jid] = True
|
|
||||||
gobject.timeout_add_seconds(30,
|
|
||||||
self.unblock_signed_in_notifications, account_jid)
|
|
||||||
locations = (self.instances, self.instances[account])
|
|
||||||
for location in locations:
|
|
||||||
if 'add_contact' in location:
|
|
||||||
if obj.old_show == 0 and obj.new_show > 1:
|
|
||||||
location['add_contact'].transport_signed_in(jid)
|
|
||||||
break
|
|
||||||
elif obj.old_show > 1 and obj.new_show == 0:
|
|
||||||
location['add_contact'].transport_signed_out(jid)
|
|
||||||
break
|
|
||||||
elif jid in jid_list:
|
|
||||||
# It isn't an agent
|
|
||||||
# reset chatstate if needed:
|
|
||||||
# (when contact signs out or has errors)
|
|
||||||
if show in ('offline', 'error'):
|
|
||||||
contact1.our_chatstate = contact1.chatstate = \
|
|
||||||
contact1.composing_xep = None
|
|
||||||
|
|
||||||
# TODO: This causes problems when another
|
# transport just signed in/out, don't show
|
||||||
# resource signs off!
|
# popup notifications for 30s
|
||||||
obj.conn.stop_all_active_file_transfers(contact1)
|
account_jid = account + '/' + jid
|
||||||
|
gajim.block_signed_in_notifications[account_jid] = True
|
||||||
|
gobject.timeout_add_seconds(30,
|
||||||
|
self.unblock_signed_in_notifications, account_jid)
|
||||||
|
|
||||||
# disable encryption, since if any messages are
|
|
||||||
# lost they'll be not decryptable (note that
|
|
||||||
# this contradicts XEP-0201 - trying to get that
|
|
||||||
# in the XEP, though)
|
|
||||||
|
|
||||||
# there won't be any sessions here if the contact terminated
|
|
||||||
# their sessions before going offline (which we do)
|
|
||||||
for sess in obj.conn.get_sessions(jid):
|
|
||||||
if obj.fjid != str(sess.jid):
|
|
||||||
continue
|
|
||||||
if sess.control:
|
|
||||||
sess.control.no_autonegotiation = False
|
|
||||||
if sess.enable_encryption:
|
|
||||||
sess.terminate_e2e()
|
|
||||||
obj.conn.delete_session(jid, sess.thread_id)
|
|
||||||
|
|
||||||
self.roster.chg_contact_status(contact1, show, status, account)
|
|
||||||
# Notifications
|
|
||||||
if obj.old_show < 2 and obj.new_show > 1:
|
|
||||||
show_notif = True
|
|
||||||
for c in lcontact:
|
|
||||||
if c.resource == resource:
|
|
||||||
# we look for other connected resources
|
|
||||||
continue
|
|
||||||
if c.show not in ('offline', 'error'):
|
|
||||||
show_notif = False
|
|
||||||
break
|
|
||||||
if show_notif:
|
|
||||||
# no other resource is connected, let's look in metacontacts
|
|
||||||
family = gajim.contacts.get_metacontacts_family(account,
|
|
||||||
jid)
|
|
||||||
for info in family:
|
|
||||||
acct_ = info['account']
|
|
||||||
jid_ = info['jid']
|
|
||||||
c_ = gajim.contacts.get_contact_with_highest_priority(
|
|
||||||
acct_, jid_)
|
|
||||||
if not c_:
|
|
||||||
continue
|
|
||||||
if c_.show not in ('offline', 'error'):
|
|
||||||
show_notif = False
|
|
||||||
break
|
|
||||||
if show_notif:
|
|
||||||
notify.notify('contact_connected', jid, account,
|
|
||||||
status)
|
|
||||||
|
|
||||||
elif obj.old_show > 1 and obj.new_show < 2:
|
|
||||||
show_notif = True
|
|
||||||
for c in lcontact:
|
|
||||||
if c.resource == resource:
|
|
||||||
# we look for other connected resources
|
|
||||||
continue
|
|
||||||
if c.show not in ('offline', 'error'):
|
|
||||||
show_notif = False
|
|
||||||
break
|
|
||||||
if show_notif:
|
|
||||||
# no other resource is connected, let's look in metacontacts
|
|
||||||
family = gajim.contacts.get_metacontacts_family(account,
|
|
||||||
jid)
|
|
||||||
for info in family:
|
|
||||||
acct_ = info['account']
|
|
||||||
jid_ = info['jid']
|
|
||||||
c_ = gajim.contacts.get_contact_with_highest_priority(
|
|
||||||
acct_, jid_)
|
|
||||||
if not c_:
|
|
||||||
continue
|
|
||||||
if c_.show not in ('offline', 'error'):
|
|
||||||
show_notif = False
|
|
||||||
break
|
|
||||||
if show_notif:
|
|
||||||
notify.notify('contact_disconnected', jid, account, status)
|
|
||||||
# Status change (not connected/disconnected or
|
|
||||||
# error (<1))
|
|
||||||
elif obj.new_show > 1:
|
|
||||||
notify.notify('status_change', jid, account, [obj.new_show,
|
|
||||||
status])
|
|
||||||
else:
|
else:
|
||||||
# FIXME: MSN transport (CMSN1.2.1 and PyMSN) don't
|
# It isn't an agent
|
||||||
# follow the XEP, still the case in 2008.
|
# Notifications
|
||||||
# It's maybe a GC_NOTIFY (specialy for MSN gc)
|
obj.show_notif = True
|
||||||
self.handle_event_gc_notify(account, (jid, show, status,
|
for c in obj.contact_list:
|
||||||
resource, None, None, None, None, None, [], None, None))
|
if c.resource == resource:
|
||||||
|
# we look for other connected resources
|
||||||
|
continue
|
||||||
|
if c.show not in ('offline', 'error'):
|
||||||
|
obj.show_notif = False
|
||||||
|
break
|
||||||
|
if obj.show_notif:
|
||||||
|
# no other resource is connected, let's look in metacontacts
|
||||||
|
family = gajim.contacts.get_metacontacts_family(account,
|
||||||
|
jid)
|
||||||
|
for info in family:
|
||||||
|
acct_ = info['account']
|
||||||
|
jid_ = info['jid']
|
||||||
|
c_ = gajim.contacts.get_contact_with_highest_priority(
|
||||||
|
acct_, jid_)
|
||||||
|
if not c_:
|
||||||
|
continue
|
||||||
|
if c_.show not in ('offline', 'error'):
|
||||||
|
obj.show_notif = False
|
||||||
|
break
|
||||||
|
if show_notif:
|
||||||
|
if obj.old_show < 2 and obj.new_show > 1:
|
||||||
|
notify.notify('contact_connected', jid, account, status)
|
||||||
|
|
||||||
|
elif obj.old_show > 1 and obj.new_show < 2:
|
||||||
|
notify.notify('contact_disconnected', jid, account, status)
|
||||||
|
# Status change (not connected/disconnected or
|
||||||
|
# error (<1))
|
||||||
|
elif obj.new_show > 1:
|
||||||
|
notify.notify('status_change', jid, account, [obj.new_show,
|
||||||
|
status])
|
||||||
|
|
||||||
highest = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
highest = gajim.contacts.get_contact_with_highest_priority(account, jid)
|
||||||
is_highest = (highest and highest.resource == resource)
|
is_highest = (highest and highest.resource == resource)
|
||||||
|
|
||||||
# disconnect the session from the ctrl if the highest resource has
|
# disconnect the session from the ctrl if the highest resource has
|
||||||
# changed
|
# changed
|
||||||
if (was_highest and not is_highest) or (not was_highest and is_highest):
|
if (obj.was_highest and not is_highest) or \
|
||||||
|
(not obj.was_highest and is_highest):
|
||||||
ctrl = self.msg_win_mgr.get_control(jid, account)
|
ctrl = self.msg_win_mgr.get_control(jid, account)
|
||||||
|
|
||||||
if ctrl:
|
if ctrl:
|
||||||
ctrl.no_autonegotiation = False
|
ctrl.no_autonegotiation = False
|
||||||
ctrl.set_session(None)
|
ctrl.set_session(None)
|
||||||
|
|
|
@ -62,6 +62,7 @@ from common.exceptions import GajimGeneralException
|
||||||
from common import i18n
|
from common import i18n
|
||||||
from common import pep
|
from common import pep
|
||||||
from common import location_listener
|
from common import location_listener
|
||||||
|
from common import ged
|
||||||
|
|
||||||
from message_window import MessageWindowMgr
|
from message_window import MessageWindowMgr
|
||||||
|
|
||||||
|
@ -1382,7 +1383,7 @@ class RosterWindow:
|
||||||
self.tree.set_model(None)
|
self.tree.set_model(None)
|
||||||
# disable sorting
|
# disable sorting
|
||||||
self.model.set_sort_column_id(-2, gtk.SORT_ASCENDING)
|
self.model.set_sort_column_id(-2, gtk.SORT_ASCENDING)
|
||||||
|
|
||||||
def _after_fill(self):
|
def _after_fill(self):
|
||||||
self.model.set_sort_column_id(1, gtk.SORT_ASCENDING)
|
self.model.set_sort_column_id(1, gtk.SORT_ASCENDING)
|
||||||
self.tree.set_model(self.modelfilter)
|
self.tree.set_model(self.modelfilter)
|
||||||
|
@ -1411,7 +1412,7 @@ class RosterWindow:
|
||||||
self._iters = {}
|
self._iters = {}
|
||||||
# for merged mode
|
# for merged mode
|
||||||
self._iters['MERGED'] = {'account': None, 'groups': {}}
|
self._iters['MERGED'] = {'account': None, 'groups': {}}
|
||||||
|
|
||||||
for acct in gajim.contacts.get_accounts():
|
for acct in gajim.contacts.get_accounts():
|
||||||
self._iters[acct] = {'account': None, 'groups': {}, 'contacts': {}}
|
self._iters[acct] = {'account': None, 'groups': {}, 'contacts': {}}
|
||||||
self.add_account(acct)
|
self.add_account(acct)
|
||||||
|
@ -2437,6 +2438,41 @@ class RosterWindow:
|
||||||
else:
|
else:
|
||||||
on_continue('', None)
|
on_continue('', None)
|
||||||
|
|
||||||
|
def _nec_presence_received(self, obj):
|
||||||
|
account = obj.conn.name
|
||||||
|
jid = obj.jid
|
||||||
|
|
||||||
|
if obj.need_add_in_roster:
|
||||||
|
self.add_contact(jid, account)
|
||||||
|
|
||||||
|
jid_list = gajim.contacts.get_jid_list(account)
|
||||||
|
if jid in jid_list or jid == gajim.get_jid_from_account(account):
|
||||||
|
if not gajim.jid_is_transport(jid) and len(obj.contact_list) == 1:
|
||||||
|
if obj.old_show == 0 and obj.new_show > 1:
|
||||||
|
gobject.timeout_add_seconds(5, self.remove_newly_added, jid,
|
||||||
|
account)
|
||||||
|
elif obj.old_show > 1 and obj.new_show == 0 and \
|
||||||
|
obj.conn.connected > 1:
|
||||||
|
gobject.timeout_add_seconds(5, self.remove_to_be_removed,
|
||||||
|
jid, account)
|
||||||
|
|
||||||
|
if obj.need_redraw:
|
||||||
|
self.draw_contact(jid, account)
|
||||||
|
|
||||||
|
if gajim.jid_is_transport(jid) and jid in jid_list:
|
||||||
|
# It must be an agent
|
||||||
|
# Update existing iter and group counting
|
||||||
|
self.draw_contact(jid, account)
|
||||||
|
self.draw_group(_('Transports'), account)
|
||||||
|
if obj.new_show > 1 and jid in gajim.transport_avatar[account]:
|
||||||
|
# transport just signed in.
|
||||||
|
# request avatars
|
||||||
|
for jid_ in gajim.transport_avatar[account][jid]:
|
||||||
|
obj.conn.request_vcard(jid_)
|
||||||
|
|
||||||
|
self.chg_contact_status(obj.contact, obj.show, obj.status, account)
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### Menu and GUI callbacks
|
### Menu and GUI callbacks
|
||||||
### FIXME: order callbacks in itself...
|
### FIXME: order callbacks in itself...
|
||||||
|
@ -6148,3 +6184,6 @@ class RosterWindow:
|
||||||
accel_group = gtk.accel_groups_from_object(self.window)[0]
|
accel_group = gtk.accel_groups_from_object(self.window)[0]
|
||||||
accel_group.connect_group(gtk.keysyms.j, gtk.gdk.CONTROL_MASK,
|
accel_group.connect_group(gtk.keysyms.j, gtk.gdk.CONTROL_MASK,
|
||||||
gtk.ACCEL_MASK, self.on_ctrl_j)
|
gtk.ACCEL_MASK, self.on_ctrl_j)
|
||||||
|
|
||||||
|
gajim.ged.register_event_handler('presence-received', ged.GUI1,
|
||||||
|
self._nec_presence_received)
|
Loading…
Reference in New Issue