transpub/buddy.py

164 lines
4.9 KiB
Python
Raw Normal View History

2015-12-29 19:03:14 +00:00
__author__ = u"Steffen Vogel"
__copyright__ = u"Copyright 2015, Steffen Vogel"
__license__ = u"GPLv3"
__maintainer__ = u"Steffen Vogel"
__email__ = u"post@steffenvogel.de"
2013-08-01 23:45:51 +00:00
2015-12-29 19:03:14 +00:00
u"""
2013-08-01 23:45:51 +00:00
This file is part of transWhat
transWhat is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
any later version.
transwhat is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with transWhat. If not, see <http://www.gnu.org/licenses/>.
"""
2013-06-28 17:46:25 +00:00
from Spectrum2 import protocol_pb2
import logging
import time
2013-06-28 17:46:25 +00:00
class Buddy():
2015-12-01 19:33:02 +00:00
def __init__(self, owner, number, nick, statusMsg, groups, image_hash):
2013-06-28 17:46:25 +00:00
self.nick = nick
self.owner = owner
self.number = number
self.groups = groups
2015-12-29 19:03:14 +00:00
self.image_hash = image_hash if image_hash is not None else u""
2015-12-27 21:09:27 +00:00
self.statusMsg = u""
2015-11-10 16:04:20 +00:00
self.lastseen = 0
self.presence = 0
2013-06-28 17:46:25 +00:00
def update(self, nick, groups, image_hash):
2013-06-28 17:46:25 +00:00
self.nick = nick
self.groups = groups
if image_hash is not None:
self.image_hash = image_hash
2013-06-28 17:46:25 +00:00
def __str__(self):
2015-12-29 19:03:14 +00:00
return u"%s (nick=%s)" % (self.number, self.nick)
2013-06-28 17:46:25 +00:00
class BuddyList(dict):
2015-12-01 21:21:38 +00:00
def __init__(self, owner, backend, user, session):
2015-12-01 19:33:02 +00:00
self.owner = owner
2015-12-01 19:54:58 +00:00
self.backend = backend
2015-12-01 21:21:38 +00:00
self.session = session
2015-12-01 19:54:58 +00:00
self.user = user
self.logger = logging.getLogger(self.__class__.__name__)
self.synced = False
def _load(self, buddies):
2015-12-01 19:33:02 +00:00
for buddy in buddies:
number = buddy.buddyName
nick = buddy.alias
2015-12-29 19:03:14 +00:00
statusMsg = buddy.statusMessage.decode(u'utf-8')
2015-12-01 19:33:02 +00:00
groups = [g for g in buddy.group]
image_hash = buddy.iconHash
self[number] = Buddy(self.owner, number, nick, statusMsg,
groups, image_hash)
2015-12-29 19:03:14 +00:00
self.logger.debug(u"Update roster")
2015-12-01 19:54:58 +00:00
# old = self.buddies.keys()
# self.buddies.load()
# new = self.buddies.keys()
# contacts = new
contacts = self.keys()
2015-12-29 19:03:14 +00:00
contacts.remove(u'bot')
2015-12-01 19:54:58 +00:00
if self.synced == False:
self.session.sendSync(contacts, delta = False, interactive = True)
2015-12-01 19:54:58 +00:00
self.synced = True
# add = set(new) - set(old)
# remove = set(old) - set(new)
2015-12-29 19:03:14 +00:00
# self.logger.debug(u"Roster remove: %s", str(list(remove)))
self.logger.debug(u"Roster add: %s", str(list(contacts)))
2015-12-01 19:54:58 +00:00
# for number in remove:
2015-12-29 19:03:14 +00:00
# self.backend.handleBuddyChanged(self.user, number, u"", [],
2015-12-01 19:54:58 +00:00
# protocol_pb2.STATUS_NONE)
# self.backend.handleBuddyRemoved(self.user, number)
# self.unsubscribePresence(number)
#
2015-12-01 21:21:38 +00:00
for number in contacts:
buddy = self[number]
self.backend.handleBuddyChanged(self.user, number, buddy.nick,
buddy.groups, protocol_pb2.STATUS_NONE,
2015-12-29 19:03:14 +00:00
iconHash = buddy.image_hash if buddy.image_hash is not None else u"")
self.session.subscribePresence(number)
2015-12-29 19:03:14 +00:00
self.logger.debug(u"%s is requesting statuses of: %s", self.user, contacts)
self.session.requestStatuses(contacts, success = self.onStatus)
def onStatus(self, contacts):
2015-12-29 19:03:14 +00:00
self.logger.debug(u"%s received statuses of: %s", self.user, contacts)
for number, (status, time) in contacts.iteritems():
buddy = self[number]
2015-12-29 19:03:14 +00:00
buddy.statusMsg = status.decode(u'utf-8')
self.updateSpectrum(buddy)
2015-12-01 19:54:58 +00:00
2013-06-28 17:46:25 +00:00
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):
2013-06-28 17:46:25 +00:00
if number in self:
buddy = self[number]
buddy.update(nick, groups, image_hash)
2013-06-28 17:46:25 +00:00
else:
2015-12-01 21:21:38 +00:00
self.session.sendSync([number], delta = True, interactive = True)
self.session.subscribePresence(number)
2015-12-17 08:06:11 +00:00
self.session.requestStatuses([number], success = self.onStatus)
2015-12-29 19:03:14 +00:00
buddy = Buddy(self.owner, number, nick, u"", groups, image_hash)
2015-12-01 21:21:38 +00:00
self[number] = buddy
2015-12-29 19:03:14 +00:00
self.logger.debug(u"Roster add: %s", buddy)
2015-12-01 19:54:58 +00:00
self.updateSpectrum(buddy)
return buddy
def updateSpectrum(self, buddy):
if buddy.presence == 0:
status = protocol_pb2.STATUS_NONE
2015-12-29 19:03:14 +00:00
elif buddy.presence == u'unavailable':
status = protocol_pb2.STATUS_AWAY
else:
status = protocol_pb2.STATUS_ONLINE
statusmsg = buddy.statusMsg
if buddy.lastseen != 0:
timestamp = time.localtime(buddy.lastseen)
2015-12-29 19:03:14 +00:00
statusmsg += time.strftime(u"\n Last seen: %a, %d %b %Y %H:%M:%S", timestamp)
self.backend.handleBuddyChanged(self.user, buddy.number, buddy.nick,
buddy.groups, status, statusMessage = statusmsg,
2015-12-29 19:03:14 +00:00
iconHash = buddy.image_hash if buddy.image_hash is not None else u"")
2013-06-28 17:46:25 +00:00
def remove(self, number):
try:
buddy = self[number]
2015-12-01 21:21:38 +00:00
del self[number]
2015-12-29 19:03:14 +00:00
self.backend.handleBuddyChanged(self.user, number, u"", [],
2015-12-01 19:54:58 +00:00
protocol_pb2.STATUS_NONE)
self.backend.handleBuddyRemoved(self.user, number)
2015-12-01 21:21:38 +00:00
self.session.unsubscribePresence(number)
2015-12-01 19:54:58 +00:00
# TODO Sync remove
return buddy
except KeyError:
return None