emdee@spm.plastiras.org
2717f4f6e5
Some checks are pending
CI / Python ${{ matrix.python-version }} (3.10) (push) Waiting to run
CI / Python ${{ matrix.python-version }} (3.7) (push) Waiting to run
CI / Python ${{ matrix.python-version }} (3.8) (push) Waiting to run
CI / Python ${{ matrix.python-version }} (3.9) (push) Waiting to run
95 lines
3.5 KiB
Python
95 lines
3.5 KiB
Python
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
|
|
|
|
import logging
|
|
|
|
from messenger.messenger import *
|
|
import utils.util as util
|
|
from file_transfers.file_transfers import *
|
|
|
|
global LOG
|
|
LOG = logging.getLogger('app.'+__name__)
|
|
|
|
from av.calls import LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG, LOG_TRACE
|
|
|
|
class FileTransfersMessagesService:
|
|
|
|
def __init__(self, contacts_manager, messages_items_factory, profile, main_screen):
|
|
self._contacts_manager = contacts_manager
|
|
self._messages_items_factory = messages_items_factory
|
|
self._profile = profile
|
|
self._messages = main_screen.messages
|
|
|
|
def add_incoming_transfer_message(self, friend, accepted, size, file_name, file_number):
|
|
assert friend
|
|
author = MessageAuthor(friend.name, MESSAGE_AUTHOR['FRIEND'])
|
|
# accepted is really started
|
|
status = FILE_TRANSFER_STATE['RUNNING'] if accepted else FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']
|
|
tm = TransferMessage(author, util.get_unix_time(), status, size, file_name, friend.number, file_number)
|
|
|
|
if self._is_friend_active(friend.number):
|
|
self._create_file_transfer_item(tm)
|
|
self._messages.scrollToBottom()
|
|
else:
|
|
friend.actions = True
|
|
|
|
friend.append_message(tm)
|
|
|
|
return tm
|
|
|
|
def add_outgoing_transfer_message(self, friend, size, file_name, file_number):
|
|
assert friend
|
|
author = MessageAuthor(self._profile.name, MESSAGE_AUTHOR['ME'])
|
|
status = FILE_TRANSFER_STATE['OUTGOING_NOT_STARTED']
|
|
tm = TransferMessage(author, util.get_unix_time(), status, size, file_name, friend.number, file_number)
|
|
|
|
if self._is_friend_active(friend.number):
|
|
self._create_file_transfer_item(tm)
|
|
self._messages.scrollToBottom()
|
|
|
|
friend.append_message(tm)
|
|
|
|
return tm
|
|
|
|
def add_inline_message(self, transfer, index) -> None:
|
|
"""callback"""
|
|
if not self._is_friend_active(transfer.friend_number):
|
|
return
|
|
if transfer is None or not hasattr(transfer, 'data') or \
|
|
not transfer.data:
|
|
LOG_ERROR(f"add_inline_message empty data")
|
|
return
|
|
count = self._messages.count()
|
|
if count + index + 1 >= 0:
|
|
# assumes .data
|
|
self._create_inline_item(transfer, count + index + 1)
|
|
|
|
def add_unsent_file_message(self, friend, file_path, data):
|
|
assert friend
|
|
author = MessageAuthor(self._profile.name, MESSAGE_AUTHOR['ME'])
|
|
size = os.path.getsize(file_path) if data is None else len(data)
|
|
tm = UnsentFileMessage(file_path, data, util.get_unix_time(), author, size, friend.number)
|
|
friend.append_message(tm)
|
|
|
|
if self._is_friend_active(friend.number):
|
|
self._create_unsent_file_item(tm)
|
|
self._messages.scrollToBottom()
|
|
|
|
return tm
|
|
|
|
# Private methods
|
|
|
|
def _is_friend_active(self, friend_number:int) -> bool:
|
|
if not self._contacts_manager.is_active_a_friend():
|
|
return False
|
|
|
|
return friend_number == self._contacts_manager.get_active_number()
|
|
|
|
def _create_file_transfer_item(self, tm):
|
|
return self._messages_items_factory.create_file_transfer_item(tm)
|
|
|
|
def _create_inline_item(self, data, position):
|
|
return self._messages_items_factory.create_inline_item(data, False, position)
|
|
|
|
def _create_unsent_file_item(self, tm):
|
|
return self._messages_items_factory.create_unsent_file_item(tm)
|