def handle_response(self, request, response): '''handle the response''' if response.status == 200: parser = XmlParser.DynamicParser(response.body) # Retrieve groups for group_dict in parser.groups: group_id = group_dict['groupId'] group_name = group_dict['name'] if group_id in self.session.groups: self.session.groups[group_id].name = group_name else: self.session.groups[group_id] = \ e3.Group(group_name, group_id) # Retrieve contacts for contact_dict in parser.contacts: if 'isMessengerUser' in contact_dict \ and 'passportName' in contact_dict \ and contact_dict['isMessengerUser'] == 'true': # valid email = contact_dict['passportName'].lower() if email in self.session.contacts.contacts: contact = self.session.contacts.contacts[email] else: contact = e3.Contact(email) self.session.contacts.contacts[email] = contact else: continue contact.identifier = contact_dict.get('contactId', '') contact.cid = contact_dict.get('CID', '') contact.groups = [] for guid in contact_dict['groupIds']: contact.groups.append(guid) group = self.session.groups[guid] if contact.account not in group.contacts: group.contacts.append(contact.account) for ann in contact_dict['Annotations']: if ann.get('Name', None) == 'AB.NickName': contact.alias = urllib.unquote(ann['Value']) break if not contact.nick: contact.nick = urllib.unquote(contact_dict.get( 'displayName', contact.account)) contact.attrs['mobile'] = \ contact_dict.get('isMobileIMEnabled', None) == 'true' contact.attrs['space'] = \ contact_dict.get('hasSpace', None) == 'true' log.debug('dynamic finished') self.session.contacts.me.identifier = \ response.body.split('<contactType>Me</contactType>')\ [1].split('</CID>')[0].split('<CID>')[1].strip() # get our nick try: nick = response.body.split('<contactType>Me</contactType>')\ [1].split('</displayName>')[0].split('<displayName>')[1] nick = common.unescape(nick) except IndexError: nick = self.session.contacts.me.account if not self.session.contacts.me.nick or \ self.session.contacts.me != self.session.account.account: self.session.contacts.me.nick = nick if self.on_login: # set our nick self.command_queue.put(Command('PRP', params=('MFN', urllib.quote(nick)))) self.session.add_event(e3.Event.EVENT_NICK_CHANGE_SUCCEED, nick) if not self.started_from_cache: self.command_queue.put(Command('BLP', params=('BL',))) accounts = self.session.contacts.pending.keys() for account in accounts: # account in pending that is already on some other role # (corrupted userlist) if account in self.session.contacts.contacts or account in self.session.contacts.reverse: del self.session.contacts.pending[account] # this line doen't work for accounts on corrupted userlists # RemovePendingContact(self.session, account).start() self.session.add_event(e3.Event.EVENT_CONTACT_LIST_READY) self.session.logger.add_contact_by_group( self.session.contacts.contacts, self.session.groups) if not self.started_from_cache: for adl in self.session.contacts.get_adls(): self.command_queue.put(Command('ADL', payload=adl)) GetProfile(self.session, self.session.contacts.me.identifier).start() else: log.debug('error requestion dynamic items')
def setAddressBookXml(self, xml): '''modify the structure with a new DynamicItems xml''' contacts = {} for (mail, contact) in self.contactManager.contacts.iteritems(): contacts[mail] = contact self.contactManager.groups = {} self.contactManager.noGroup.users = {} self.contactManager.contacts = {} #doc = minidom.parseString(xml) dinamicItems = XmlParser.DynamicParser(xml) # Retrieve groups for i in dinamicItems.groups: groupId = i['groupId'] name = i['name'] if groupId not in self.contactManager.groups: self.contactManager.setGroup(groupId, ContactData.Group(name, groupId)) self.emit('group-added', name, groupId) # Retrieve contacts for i in dinamicItems.contacts: if 'isMessengerUser' in i and 'passportName' in i and \ i['isMessengerUser'] == 'true': # valid email = i['passportName'].lower() contact = ContactData.Contact(email) else: continue try: contactId = i['contactId'] cid = i['CID'] contact.id = contactId contact.cid = cid groups = [] for guid in i['groupIds']: groups.append(guid) contact.groups = groups for j in i['Annotations']: try: if j['Name'] == 'AB.NickName': alias = j['Value'] contact.alias = urllib.unquote(alias) except: pass displayName = i['displayName'] contact.nick = urllib.unquote(displayName) isMobileIMEnabled = i['isMobileIMEnabled'] contact.mobile = isMobileIMEnabled == 'true' hasSpace = i['hasSpace'] contact.space = hasSpace == 'true' except KeyError: continue if email in contacts: contact.status = contacts[email].status contact.nick = contacts[email].nick contact.personalMessage = contacts[email].personalMessage contact.msnobj = contacts[email].msnobj contact.clientid = contacts[email].clientid # finally adds the contact self.contactManager.addContact(contact) self.emit('contact-added', contact.email, contact.id, contact.nick, contact.personalMessage, contact.status, contact.alias, contact.blocked) for group_id in contact.groups: self.emit('contact-added-to-group', contact.email, self.contactManager.getGroup(group_id).name) self.contactManager.updateMemberships()