Properly detect/send presence when updating buddy

This commit is contained in:
moyamo 2015-12-02 22:51:29 +02:00
parent 5a8874c9b9
commit c44baf892d

View file

@ -58,7 +58,7 @@ class BuddyList(dict):
self.logger = logging.getLogger(self.__class__.__name__) self.logger = logging.getLogger(self.__class__.__name__)
self.synced = False self.synced = False
def load(self, buddies): def _load(self, buddies):
for buddy in buddies: for buddy in buddies:
number = buddy.buddyName number = buddy.buddyName
nick = buddy.alias nick = buddy.alias
@ -67,6 +67,7 @@ class BuddyList(dict):
image_hash = buddy.iconHash image_hash = buddy.iconHash
self[number] = Buddy(self.owner, number, nick, statusMsg, self[number] = Buddy(self.owner, number, nick, statusMsg,
groups, image_hash) groups, image_hash)
self.logger.debug("Update roster") self.logger.debug("Update roster")
# old = self.buddies.keys() # old = self.buddies.keys()
@ -76,12 +77,7 @@ class BuddyList(dict):
contacts = self.keys() contacts = self.keys()
if self.synced == False: if self.synced == False:
if self.session.loggedIn:
self.session.sendSync(contacts, delta = False, interactive = True) 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 self.synced = True
# add = set(new) - set(old) # add = set(new) - set(old)
@ -97,23 +93,20 @@ class BuddyList(dict):
# self.unsubscribePresence(number) # self.unsubscribePresence(number)
# #
for number in contacts: for number in contacts:
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] buddy = self[number]
if number != 'bot':
self.backend.handleBuddyChanged(self.user, number, buddy.nick, self.backend.handleBuddyChanged(self.user, number, buddy.nick,
buddy.groups, protocol_pb2.STATUS_NONE, buddy.groups, protocol_pb2.STATUS_NONE,
iconHash = buddy.image_hash if buddy.image_hash is not None else "") iconHash = buddy.image_hash if buddy.image_hash is not None else "")
self.session.subscribePresence(number)
def load(self, buddies):
if self.session.loggedIn:
self._load(buddies)
else:
self.session.loginQueue.append(lambda: self._load(buddies))
def update(self, number, nick, groups, image_hash): def update(self, number, nick, groups, image_hash):
if number in self: if number in self:
buddy = self[number] buddy = self[number]
@ -125,8 +118,14 @@ class BuddyList(dict):
self[number] = buddy self[number] = buddy
self.logger.debug("Roster add: %s", buddy) self.logger.debug("Roster add: %s", buddy)
if buddy.presence == 0:
status = protocol_pb2.STATUS_NONE
elif buddy.presence == 'unavailable':
status = protocol_pb2.STATUS_AWAY
else:
status = protocol_pb2.STATUS_ONLINE
self.backend.handleBuddyChanged(self.user, number, buddy.nick, self.backend.handleBuddyChanged(self.user, number, buddy.nick,
buddy.groups, protocol_pb2.STATUS_NONE, buddy.groups, status,
iconHash = buddy.image_hash if buddy.image_hash is not None else "") iconHash = buddy.image_hash if buddy.image_hash is not None else "")
return buddy return buddy