From 6743bb5d9498ce6a9bc96be66b0527743942b459 Mon Sep 17 00:00:00 2001 From: mathieui Date: Fri, 27 Apr 2012 22:30:01 +0200 Subject: Add the new subscription handlers and update on_message() and disconnect() --- src/core.py | 103 +++++++++++++++++++++++++++++++----------------------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/src/core.py b/src/core.py index d8c2355d..23a82fe6 100644 --- a/src/core.py +++ b/src/core.py @@ -850,8 +850,8 @@ class Core(object): conversation = self.get_tab_of_conversation_with_jid(jid, create=True) self.events.trigger('conversation_msg', message, conversation) body = xhtml.get_body_from_message_stanza(message) - if roster.get_contact_by_jid(jid.bare): - remote_nick = roster.get_contact_by_jid(jid.bare).name or jid.user + if jid.bare in roster: + remote_nick = roster[jid.bare].name or jid.user else: remote_nick = jid.user delay_tag = message.find('{urn:xmpp:delay}delay') @@ -892,60 +892,64 @@ class Core(object): def on_roster_update(self, iq): """ - A subscription changed, or we received a roster item - after a roster request, etc - """ - for item in iq.findall('{jabber:iq:roster}query/{jabber:iq:roster}item'): - jid = item.attrib['jid'] - contact = roster.get_contact_by_jid(jid) - if not contact: - contact = Contact(jid) - roster.add_contact(contact, jid) - if 'ask' in item.attrib: - contact.ask = item.attrib['ask'] - else: - contact.ask = None - if 'name' in item.attrib: - contact.name = item.attrib['name'] + The roster was received. + """ + for item in iq['roster']: + jid = item['jid'] + if item['subscription'] == 'remove': + del roster[jid] else: - contact.name = None - if item.attrib['subscription']: - contact.subscription = item.attrib['subscription'] - groups = item.findall('{jabber:iq:roster}group') - roster.edit_groups_of_contact(contact, [group.text for group in groups]) - if item.attrib['subscription'] == 'remove': - roster.remove_contact(contact.bare_jid) + roster.update_contact_groups(jid) if isinstance(self.current_tab(), tabs.RosterInfoTab): self.refresh_window() - def on_changed_subscription(self, presence): - """ - Triggered whenever a presence stanza with a type of subscribe, subscribed, unsubscribe, or unsubscribed is received. - """ + def on_subscription_request(self, presence): + """subscribe received""" jid = presence['from'].bare - contact = roster.get_contact_by_jid(jid) - if presence['type'] == 'subscribe': - if not contact: - contact = Contact(jid) - roster.add_contact(contact, jid) - log.debug("CONTACT: %s", contact) - if contact.subscription in ('from', 'both'): - log.debug('FROM OR BOTH') - return - elif contact.subscription in ('to'): - log.debug('TO') - self.xmpp.sendPresence(pto=jid, ptype='subscribed') - self.xmpp.sendPresence(pto=jid, ptype='') - return - roster.edit_groups_of_contact(contact, []) - contact.ask = 'asked' + contact = roster[jid] + if contact.subscription in ('from', 'both'): + return + elif contact.subscription == 'to': + self.xmpp.sendPresence(pto=jid, ptype='subscribed') + self.xmpp.sendPresence(pto=jid) + else: + roster.update_contact_groups(contact) + contact.pending_in = True + self.information('%s wants to subscribe to your presence' % jid, 'Roster') + self.get_tab_by_number(0).state = 'highlight' + if isinstance(self.current_tab(), tabs.RosterInfoTab): + self.refresh_window() + + def on_subscription_authorized(self, presence): + """subscribed received""" + jid = presence['from'].bare + contact = roster[jid] + if contact.pending_out: + contact.pending_out = False + if isinstance(self.current_tab(), tabs.RosterInfoTab): + self.refresh_window() + + def on_subscription_remove(self, presence): + """unsubscribe received""" + jid = presence['from'].bare + contact = roster[jid] + if contact.subscription in ('to', 'both'): + self.information('%s does not want to receive your status anymore.' % jid, 'Roster') self.get_tab_by_number(0).state = 'highlight' - self.information('%s wants to subscribe to your presence'%jid, 'Roster') - elif presence['type'] == 'unsubscribed': - self.information('%s unsubscribed you from his presence'%jid, 'Roster') - elif presence['type'] == 'unsubscribe': - self.information('%s unsubscribed from your presence'%jid, 'Roster') + if isinstance(self.current_tab(), tabs.RosterInfoTab): + self.refresh_window() + def on_subscription_removed(self, presence): + """unsubscribed received""" + jid = presence['from'].bare + contact = roster[jid] + if contact.subscription in ('both', 'from'): + self.information('%s does not want you to receive his status anymore.'%jid, 'Roster') + self.get_tab_by_number(0).state = 'highlight' + elif contact.pending_out: + self.information('%s rejected your contact proposal.' % jid, 'Roster') + self.get_tab_by_number(0).state = 'highlight' + contact.pending_out = False if isinstance(self.current_tab(), tabs.RosterInfoTab): self.refresh_window() @@ -2165,7 +2169,6 @@ class Core(object): for tab in self.tabs: if isinstance(tab, tabs.MucTab) and tab.joined: tab.command_part(msg) - roster.empty() self.save_config() # Ugly fix thanks to gmail servers self.xmpp.disconnect(reconnect) -- cgit v1.2.3