diff --git a/buddy.py b/buddy.py index 0eff8cf..6323911 100644 --- a/buddy.py +++ b/buddy.py @@ -76,7 +76,12 @@ class BuddyList(dict): contacts = self.keys() if self.synced == False: - self.session.sendSync(contacts, delta = False, interactive = True) + if self.session.loggedIn: + self.session.sendSync(contacts, delta = False, interactive = True) + else: + self.session.loginQueue.append( + lambda: self.session.sendSync(contacts, delta = False, interactive = True) + ) self.synced = True # add = set(new) - set(old) @@ -92,7 +97,17 @@ class BuddyList(dict): # self.unsubscribePresence(number) # for number in contacts: - self.session.subscribePresence(number) + self.logger.debug("Attempting to subscribe to %s", number) + if self.session.loggedIn and number != 'bot': + self.session.subscribePresence(number) + elif number != 'bot': + # Bah! Python scoping rules aren't nice. This function is needed + # preserve the value of number + def deferredLogin(number): + self.session.loginQueue.append( + lambda: self.session.subscribePresence(number) + ) + deferredLogin(number) buddy = self[number] self.backend.handleBuddyChanged(self.user, number, buddy.nick, buddy.groups, protocol_pb2.STATUS_NONE, diff --git a/session.py b/session.py index c7f2934..074cbdf 100644 --- a/session.py +++ b/session.py @@ -74,12 +74,14 @@ class Session(YowsupApp): self.groups = {} self.gotGroupList = False + # Functions to exectute when logged in via yowsup + self.loginQueue = [] self.joinRoomQueue = [] self.presenceRequested = [] self.offlineQueue = [] self.msgIDs = { } self.groupOfflineQueue = { } - self.shouldBeConnected = False + self.loggedIn = False self.timer = None self.password = None @@ -102,6 +104,7 @@ class Session(YowsupApp): def logout(self): self.logger.info("%s logged out", self.user) super(Session, self).logout() + self.loggedIn = False def login(self, password): self.logger.info("%s attempting login", self.user) @@ -245,16 +248,19 @@ class Session(YowsupApp): #self.bot.call("welcome") self.initialized = True self.sendPresence(True) + for func in self.loginQueue: + func() self.logger.debug('Requesting groups list') self.requestGroupsList(self._updateGroups) + self.loggedIn = True # Called by superclass def onAuthFailed(self, reason): self.logger.info("Auth failed: %s (%s)", self.user, reason) self.backend.handleDisconnected(self.user, 0, reason) self.password = None - self.shouldBeConnected = False + self.loggedIn = False # Called by superclass def onDisconnect(self): diff --git a/yowsupwrapper.py b/yowsupwrapper.py index ef1928b..d7c3a79 100644 --- a/yowsupwrapper.py +++ b/yowsupwrapper.py @@ -216,6 +216,7 @@ class YowsupApp(object): - phone_number: (str) The cellphone number of the person to subscribe to """ + self.logger.debug("Subscribing to Presence updates from %s", (phone_number)) jid = phone_number + '@s.whatsapp.net' entity = SubscribePresenceProtocolEntity(jid) self.sendEntity(entity)