From 2895f78ec7684346d4871123730634693a21d9d8 Mon Sep 17 00:00:00 2001 From: moyamo Date: Wed, 6 Jan 2016 17:26:59 +0200 Subject: [PATCH] Use the result of Sync to delete invalid numbers --- buddy.py | 29 ++++++++++++++++++++--------- yowsupwrapper.py | 16 +++++++++++----- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/buddy.py b/buddy.py index b7afa55..d769590 100644 --- a/buddy.py +++ b/buddy.py @@ -60,7 +60,6 @@ class BuddyList(dict): self.session = session self.user = user self.logger = logging.getLogger(self.__class__.__name__) - self.synced = False def _load(self, buddies): for buddy in buddies: @@ -77,20 +76,32 @@ class BuddyList(dict): contacts = self.keys() contacts.remove('bot') - if self.synced == False: - self.session.sendSync(contacts, delta = False, interactive = True) - self.synced = True + self.session.sendSync(contacts, delta=False, interactive=True, + success=self.onSync) self.logger.debug("Roster add: %s", str(list(contacts))) for number in contacts: buddy = self[number] - self.backend.handleBuddyChanged(self.user, number, buddy.nick, - buddy.groups, protocol_pb2.STATUS_NONE, - iconHash = buddy.image_hash if buddy.image_hash is not None else "") + self.updateSpectrum(buddy) + + def onSync(self, existing, nonexisting, invalid): + """We should only presence subscribe to existing numbers""" + + for number in existing: self.session.subscribePresence(number) - self.logger.debug("%s is requesting statuses of: %s", self.user, contacts) - self.session.requestStatuses(contacts, success = self.onStatus) + self.logger.debug("%s is requesting statuses of: %s", self.user, existing) + self.session.requestStatuses(existing, success = self.onStatus) + + self.logger.debug("Removing nonexisting buddies %s", nonexisting) + for number in nonexisting: + self.remove(number) + del self[number] + + self.logger.debug("Removing invalid buddies %s", invalid) + for number in invalid: + self.remove(number) + del self[number] def onStatus(self, contacts): self.logger.debug("%s received statuses of: %s", self.user, contacts) diff --git a/yowsupwrapper.py b/yowsupwrapper.py index 048ba98..14e2256 100644 --- a/yowsupwrapper.py +++ b/yowsupwrapper.py @@ -271,12 +271,12 @@ class YowsupApp(object): ChatstateProtocolEntity.STATE_PAUSED, jid ) self.sendEntity(state) - - def sendSync(self, contacts, delta = False, interactive = True): + + def sendSync(self, contacts, delta = False, interactive = True, success = None, failure = None): """ You need to sync new contacts before you interact with them, failure to do so could result in a temporary ban. - + Args: - contacts: ([str]) a list of phone numbers of the contacts you wish to sync @@ -285,13 +285,19 @@ class YowsupApp(object): contact list. - interactive: (bool; default: True) Set to false if you are sure this is the first time registering + - success: (func) - Callback; Takes three arguments: existing numbers, + non-existing numbers, invalid numbers. """ # TODO: Implement callbacks mode = GetSyncIqProtocolEntity.MODE_DELTA if delta else GetSyncIqProtocolEntity.MODE_FULL context = GetSyncIqProtocolEntity.CONTEXT_INTERACTIVE if interactive else GetSyncIqProtocolEntity.CONTEXT_REGISTRATION iq = GetSyncIqProtocolEntity(contacts, mode, context) - self.sendIq(iq) - + def onSuccess(response, request): + success(response.inNumbers.keys(), response.outNumbers.keys(), response.invalidNumbers) + + self.sendIq(iq, onSuccess = onSuccess, onError = failure) + + def requestStatuses(self, contacts, success = None, failure = None): """ Request the statuses of a number of users.