184 lines
6.2 KiB
Python
184 lines
6.2 KiB
Python
import contact
|
|
from messages import *
|
|
from history import *
|
|
import util
|
|
|
|
|
|
class Friend(contact.Contact):
|
|
"""
|
|
Friend in list of friends. Can be hidden, properties 'has unread messages' and 'has alias' added
|
|
"""
|
|
|
|
def __init__(self, message_getter, number, *args):
|
|
"""
|
|
:param message_getter: gets messages from db
|
|
:param number: number of friend.
|
|
"""
|
|
super(Friend, self).__init__(*args)
|
|
self._number = number
|
|
self._new_messages = False
|
|
self._visible = True
|
|
self._alias = False
|
|
self._message_getter = message_getter
|
|
self._corr = []
|
|
self._unsaved_messages = 0
|
|
self._history_loaded = False
|
|
self._receipts = 0
|
|
|
|
def __del__(self):
|
|
self.set_visibility(False)
|
|
del self._widget
|
|
if hasattr(self, '_message_getter'):
|
|
del self._message_getter
|
|
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
# History support
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
|
|
def get_receipts(self):
|
|
return self._receipts
|
|
|
|
receipts = property(get_receipts)
|
|
|
|
def inc_receipts(self):
|
|
self._receipts += 1
|
|
|
|
def dec_receipt(self):
|
|
if self._receipts:
|
|
self._receipts -= 1
|
|
self.mark_as_sent()
|
|
|
|
def load_corr(self, first_time=True):
|
|
"""
|
|
:param first_time: friend became active, load first part of messages
|
|
"""
|
|
if (first_time and self._history_loaded) or (not hasattr(self, '_message_getter')):
|
|
return
|
|
data = self._message_getter.get(PAGE_SIZE)
|
|
if data is not None and len(data):
|
|
data.reverse()
|
|
else:
|
|
return
|
|
data = map(lambda tupl: TextMessage(*tupl), data)
|
|
self._corr = data + self._corr
|
|
self._history_loaded = True
|
|
|
|
def get_corr_for_saving(self):
|
|
"""
|
|
Get data to save in db
|
|
:return: list of unsaved messages or []
|
|
"""
|
|
if hasattr(self, '_message_getter'):
|
|
del self._message_getter
|
|
messages = filter(lambda x: x.get_type() <= 1, self._corr)
|
|
return map(lambda x: x.get_data(), messages[-self._unsaved_messages:]) if self._unsaved_messages else []
|
|
|
|
def get_corr(self):
|
|
return self._corr[:]
|
|
|
|
def append_message(self, message):
|
|
"""
|
|
:param message: text or file transfer message
|
|
"""
|
|
self._corr.append(message)
|
|
if message.get_type() <= 1:
|
|
self._unsaved_messages += 1
|
|
|
|
def get_last_message_text(self):
|
|
messages = filter(lambda x: x.get_type() <= 1 and x.get_owner() != MESSAGE_OWNER['FRIEND'], self._corr)
|
|
if messages:
|
|
return messages[-1].get_data()[0]
|
|
else:
|
|
return ''
|
|
|
|
def unsent_messages(self):
|
|
"""
|
|
:return list of unsent messages
|
|
"""
|
|
messages = filter(lambda x: x.get_owner() == MESSAGE_OWNER['NOT_SENT'], self._corr)
|
|
return messages
|
|
|
|
def mark_as_sent(self):
|
|
try:
|
|
message = filter(lambda x: x.get_owner() == MESSAGE_OWNER['NOT_SENT'], self._corr)[0]
|
|
message.mark_as_sent()
|
|
except Exception as ex:
|
|
util.log('Mark as sent ex: ' + str(ex))
|
|
|
|
def clear_corr(self):
|
|
"""
|
|
Clear messages list
|
|
"""
|
|
if hasattr(self, '_message_getter'):
|
|
del self._message_getter
|
|
# don't delete data about active file transfer
|
|
self._corr = filter(lambda x: x.get_type() in (2, 3) and x.get_status() >= 2, self._corr)
|
|
self._unsaved_messages = 0
|
|
|
|
def update_transfer_data(self, file_number, status, inline=None):
|
|
"""
|
|
Update status of active transfer and load inline if needed
|
|
"""
|
|
try:
|
|
tr = filter(lambda x: x.get_type() == MESSAGE_TYPE['FILE_TRANSFER'] and x.is_active(file_number),
|
|
self._corr)[0]
|
|
tr.set_status(status)
|
|
if inline: # inline was loaded
|
|
i = self._corr.index(tr)
|
|
self._corr.insert(i, inline)
|
|
return i - len(self._corr)
|
|
except:
|
|
pass
|
|
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
# Alias support
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
|
|
def set_name(self, value):
|
|
"""
|
|
Set new name or ignore if alias exists
|
|
:param value: new name
|
|
"""
|
|
if not self._alias:
|
|
super(Friend, self).set_name(value)
|
|
|
|
def set_alias(self, alias):
|
|
self._alias = bool(alias)
|
|
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
# Visibility in friends' list
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
|
|
def get_visibility(self):
|
|
return self._visible
|
|
|
|
def set_visibility(self, value):
|
|
self._visible = value
|
|
|
|
visibility = property(get_visibility, set_visibility)
|
|
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
# Unread messages from friend
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
|
|
def get_messages(self):
|
|
return self._new_messages
|
|
|
|
def set_messages(self, value):
|
|
self._widget.connection_status.messages = self._new_messages = value
|
|
self._widget.connection_status.repaint()
|
|
|
|
messages = property(get_messages, set_messages)
|
|
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
# Friend's number (can be used in toxcore)
|
|
# -----------------------------------------------------------------------------------------------------------------
|
|
|
|
def get_number(self):
|
|
return self._number
|
|
|
|
def set_number(self, value):
|
|
self._number = value
|
|
|
|
number = property(get_number, set_number)
|