diff --git a/toxygen/app.py b/toxygen/app.py index 53c4dff..87d3c60 100644 --- a/toxygen/app.py +++ b/toxygen/app.py @@ -289,22 +289,23 @@ class App: def _create_dependencies(self): self._smiley_loader = SmileyLoader(self._settings) self._ms = MainWindow(self._settings, self._tray) + self._calls_manager = CallsManager(self._tox.AV, self._settings) db = Database(self._path.replace('.tox', '.db'), self._toxes) - profile = Profile(self._profile_manager, self._tox, self._ms, self._file_transfer_handler) - self._plugin_loader = PluginLoader(self._tox, self._toxes, profile, self._settings) # plugins support + + profile = Profile(self._profile_manager, self._tox, self._ms) + self._plugin_loader = PluginLoader(self._tox, self._toxes, profile, self._settings) items_factory = ItemsFactory(self._settings, self._plugin_loader, self._smiley_loader, self._ms) self._friend_factory = FriendFactory(self._profile_manager, self._settings, self._tox, db, items_factory) self._contacts_provider = ContactProvider(self._tox, self._friend_factory) - widgets_factory = WidgetsFactory(self._settings, profile, self._contacts_manager, self._file_transfer_handler, - self._smiley_loader, self._plugin_loader, self._toxes, self._version) self._contacts_manager = ContactsManager(self._tox, self._settings, self._ms, self._profile_manager, self._contacts_provider, db) + self._file_transfer_handler = FileTransfersHandler(self._tox, self._settings, self._contacts_provider) + widgets_factory = WidgetsFactory(self._settings, profile, self._contacts_manager, self._file_transfer_handler, + self._smiley_loader, self._plugin_loader, self._toxes, self._version) self._messenger = Messenger(self._tox, self._plugin_loader, self._ms, self._contacts_manager, - self._contacts_provider, items_factory) + self._contacts_provider, items_factory, profile) self._tray = tray.init_tray(profile, self._settings, self._ms) self._ms.set_dependencies(widgets_factory, self._tray, self._contacts_manager, self._messenger, profile) - self._calls_manager = CallsManager(self._tox.AV, self._settings) - self._file_transfer_handler = FileTransfersHandler(self._tox, self._settings, self._contacts_provider) self._tray.show() self._ms.show() diff --git a/toxygen/bootstrap/bootstrap.py b/toxygen/bootstrap/bootstrap.py index ccce1c7..2e5d3dc 100644 --- a/toxygen/bootstrap/bootstrap.py +++ b/toxygen/bootstrap/bootstrap.py @@ -1,6 +1,6 @@ import random import urllib.request -from util.util import log, curr_directory, join_path +from util.util import * from PyQt5 import QtNetwork, QtCore import json diff --git a/toxygen/contacts/contacts_manager.py b/toxygen/contacts/contacts_manager.py index e468ecc..8fb1b92 100644 --- a/toxygen/contacts/contacts_manager.py +++ b/toxygen/contacts/contacts_manager.py @@ -4,7 +4,6 @@ from contacts.friend import Friend from PyQt5 import QtCore, QtGui from messenger.messages import * from wrapper.toxcore_enums_and_consts import * -from network.tox_dns import tox_dns from history.history_loader import HistoryLoader diff --git a/toxygen/contacts/profile.py b/toxygen/contacts/profile.py index 4949175..cfeae94 100644 --- a/toxygen/contacts/profile.py +++ b/toxygen/contacts/profile.py @@ -1,7 +1,5 @@ from contacts.friend import * from user_data.settings import * -from wrapper.toxcore_enums_and_consts import * -from util.util import log from history.database import * from file_transfers.file_transfers import * import time @@ -14,7 +12,7 @@ class Profile(basecontact.BaseContact): """ Profile of current toxygen user. Contains friends list, tox instance """ - def __init__(self, profile_manager, tox, screen, file_transfer_handler): + def __init__(self, profile_manager, tox, screen): """ :param tox: tox instance :param screen: ref to main screen @@ -25,7 +23,6 @@ class Profile(basecontact.BaseContact): tox.self_get_status_message(), screen.user_info, tox.self_get_address()) - self._file_transfer_handler = file_transfer_handler self._screen = screen self._messages = screen.messages self._tox = tox @@ -83,30 +80,6 @@ class Profile(basecontact.BaseContact): # Friend connection status callbacks # ----------------------------------------------------------------------------------------------------------------- - def send_files(self, friend_number): - friend = self.get_friend_by_number(friend_number) - friend.remove_invalid_unsent_files() - files = friend.get_unsent_files() - try: - for fl in files: - data = fl.get_data() - if data[1] is not None: - self.send_inline(data[1], data[0], friend_number, True) - else: - self.send_file(data[0], friend_number, True) - friend.clear_unsent_files() - for key in list(self._paused_file_transfers.keys()): - data = self._paused_file_transfers[key] - if not os.path.exists(data[0]): - del self._paused_file_transfers[key] - elif data[1] == friend_number and not data[2]: - self.send_file(data[0], friend_number, True, key) - del self._paused_file_transfers[key] - if friend_number == self.get_active_number() and self.is_active_a_friend(): - self.update() - except Exception as ex: - print('Exception in file sending: ' + str(ex)) - def friend_exit(self, friend_number): """ Friend with specified number quit @@ -133,20 +106,6 @@ class Profile(basecontact.BaseContact): while i < self._messages.count() and not self._messages.itemWidget(self._messages.item(i)).mark_as_sent(): i += 1 - def send_messages(self, friend_number): - """ - Send 'offline' messages to friend - """ - friend = self.get_friend_by_number(friend_number) - friend.load_corr() - messages = friend.get_unsent_messages() - try: - for message in messages: - self.split_and_send(friend_number, message.get_data()[-1], message.get_data()[0].encode('utf-8')) - friend.inc_receipts() - except Exception as ex: - log('Sending pending messages failed with ' + str(ex)) - def delete_message(self, message_id): friend = self.get_curr_friend() friend.delete_message(time) diff --git a/toxygen/file_transfers/file_transfers.py b/toxygen/file_transfers/file_transfers.py index 5aab6f9..937ab12 100644 --- a/toxygen/file_transfers/file_transfers.py +++ b/toxygen/file_transfers/file_transfers.py @@ -172,7 +172,7 @@ class SendAvatar(SendTransfer): else: with open(path, 'rb') as fl: avatar_hash = Tox.hash(fl.read()) - super(SendAvatar, self).__init__(path, tox, friend_number, TOX_FILE_KIND['AVATAR'], avatar_hash) + super().__init__(path, tox, friend_number, TOX_FILE_KIND['AVATAR'], avatar_hash) class SendFromBuffer(FileTransfer): diff --git a/toxygen/file_transfers/file_transfers_handler.py b/toxygen/file_transfers/file_transfers_handler.py index e7a0308..12bc60d 100644 --- a/toxygen/file_transfers/file_transfers_handler.py +++ b/toxygen/file_transfers/file_transfers_handler.py @@ -2,6 +2,8 @@ from file_transfers.file_transfers import * from messenger.messages import * from history.database import MESSAGE_AUTHOR import os +from ui.list_items import * +from PyQt5 import QtWidgets import util.util as util @@ -99,7 +101,7 @@ class FileTransfersHandler: :param already_cancelled: was cancelled by friend """ i = self._get_friend_by_number(friend_number).update_transfer_data(file_number, - TOX_FILE_TRANSFER_STATE['CANCELLED']) + TOX_FILE_TRANSFER_STATE['CANCELLED']) if (friend_number, file_number) in self._file_transfers: tr = self._file_transfers[(friend_number, file_number)] if not already_cancelled: @@ -130,7 +132,7 @@ class FileTransfersHandler: tr = self._file_transfers[(friend_number, file_number)] tr.pause(by_friend) t = TOX_FILE_TRANSFER_STATE['PAUSED_BY_FRIEND'] if by_friend else TOX_FILE_TRANSFER_STATE['PAUSED_BY_USER'] - self.get_friend_by_number(friend_number).update_transfer_data(file_number, t) + self._get_friend_by_number(friend_number).update_transfer_data(file_number, t) def resume_transfer(self, friend_number, file_number, by_friend=False): """ @@ -175,7 +177,7 @@ class FileTransfersHandler: self._tox.file_control(friend_number, file_number, TOX_FILE_CONTROL['RESUME']) if item is not None: rt.set_state_changed_handler(item.update_transfer_state) - self.get_friend_by_number(friend_number).update_transfer_data(file_number, + self._get_friend_by_number(friend_number).update_transfer_data(file_number, TOX_FILE_TRANSFER_STATE['RUNNING']) def send_screenshot(self, data): @@ -192,7 +194,7 @@ class FileTransfersHandler: def send_inline(self, data, file_name, friend_number=None, is_resend=False): friend_number = friend_number or self.get_active_number() - friend = self.get_friend_by_number(friend_number) + friend = self._get_friend_by_number(friend_number) if friend.status is None and not is_resend: m = UnsentFile(file_name, data, time.time()) friend.append_message(m) @@ -224,7 +226,7 @@ class FileTransfersHandler: :param file_id: file id of transfer """ friend_number = self.get_active_number() if number is None else number - friend = self.get_friend_by_number(friend_number) + friend = self._get_friend_by_number(friend_number) if friend.status is None and not is_resend: m = UnsentFile(path, None, time.time()) friend.append_message(m) @@ -265,13 +267,13 @@ class FileTransfersHandler: transfer = self._file_transfers[(friend_number, file_number)] t = type(transfer) if t is ReceiveAvatar: - self.get_friend_by_number(friend_number).load_avatar() + self._get_friend_by_number(friend_number).load_avatar() if friend_number == self.get_active_number() and self.is_active_a_friend(): self.set_active(None) - elif t is ReceiveToBuffer or (t is SendFromBuffer and self._settings.get_instance()['allow_inline']): # inline image + elif t is ReceiveToBuffer or (t is SendFromBuffer and self._settings['allow_inline']): # inline image print('inline') inline = InlineImage(transfer.get_data()) - i = self.get_friend_by_number(friend_number).update_transfer_data(file_number, + i = self._get_friend_by_number(friend_number).update_transfer_data(file_number, TOX_FILE_TRANSFER_STATE['FINISHED'], inline) if friend_number == self.get_active_number() and self.is_active_a_friend(): @@ -284,11 +286,35 @@ class FileTransfersHandler: self._messages.setItemWidget(elem, item) self._messages.scrollToBottom() elif t is not SendAvatar: - self.get_friend_by_number(friend_number).update_transfer_data(file_number, + self._get_friend_by_number(friend_number).update_transfer_data(file_number, TOX_FILE_TRANSFER_STATE['FINISHED']) del self._file_transfers[(friend_number, file_number)] del transfer + def send_files(self, friend_number): + friend = self._get_friend_by_number(friend_number) + friend.remove_invalid_unsent_files() + files = friend.get_unsent_files() + try: + for fl in files: + data = fl.get_data() + if data[1] is not None: + self.send_inline(data[1], data[0], friend_number, True) + else: + self.send_file(data[0], friend_number, True) + friend.clear_unsent_files() + for key in list(self._paused_file_transfers.keys()): + data = self._paused_file_transfers[key] + if not os.path.exists(data[0]): + del self._paused_file_transfers[key] + elif data[1] == friend_number and not data[2]: + self.send_file(data[0], friend_number, True, key) + del self._paused_file_transfers[key] + if friend_number == self.get_active_number() and self.is_active_a_friend(): + self.update() + except Exception as ex: + print('Exception in file sending: ' + str(ex)) + # ----------------------------------------------------------------------------------------------------------------- # Avatars support # ----------------------------------------------------------------------------------------------------------------- @@ -313,7 +339,7 @@ class FileTransfersHandler: self._file_transfers[(friend_number, file_number)] = ra ra.set_transfer_finished_handler(self.transfer_finished) else: - self.get_friend_by_number(friend_number).load_avatar() + self._get_friend_by_number(friend_number).load_avatar() if self.get_active_number() == friend_number and self.is_active_a_friend(): self.set_active(None) diff --git a/toxygen/history/database.py b/toxygen/history/database.py index d7c10eb..188e85b 100644 --- a/toxygen/history/database.py +++ b/toxygen/history/database.py @@ -163,6 +163,9 @@ class Database: db.close() def messages_getter(self, tox_id): + if not self.friend_exists_in_db(tox_id): + self.add_friend_to_db(tox_id) + return Database.MessageGetter(self._path, tox_id) # ----------------------------------------------------------------------------------------------------------------- diff --git a/toxygen/main.py b/toxygen/main.py index 1171aac..5ecbd77 100644 --- a/toxygen/main.py +++ b/toxygen/main.py @@ -1,6 +1,6 @@ import app from user_data.settings import * -from util.util import remove, get_libs_directory +import util.util as util import argparse @@ -10,8 +10,8 @@ __version__ = '0.5.0' def clean(): """Removes all windows libs from libs folder""" - directory = get_libs_directory() - remove(directory) + directory = util.get_libs_directory() + util.remove(directory) def reset(): diff --git a/toxygen/messenger/messages.py b/toxygen/messenger/messages.py index 41c046d..830e72e 100644 --- a/toxygen/messenger/messages.py +++ b/toxygen/messenger/messages.py @@ -48,6 +48,11 @@ class Message: message_id = property(get_message_id) + def get_type(self): + return self._type + + type = property(get_type) + def get_widget(self): if self._widget is None: self._widget = self._create_widget() diff --git a/toxygen/messenger/messenger.py b/toxygen/messenger/messenger.py index 8cb25e1..cb17398 100644 --- a/toxygen/messenger/messenger.py +++ b/toxygen/messenger/messenger.py @@ -5,13 +5,14 @@ from messenger.messages import * class Messenger(util.ToxSave): - def __init__(self, tox, plugin_loader, screen, contacts_manager, contacts_provider, items_factory): + def __init__(self, tox, plugin_loader, screen, contacts_manager, contacts_provider, items_factory, profile): super().__init__(tox) self._plugin_loader = plugin_loader self._screen = screen self._contacts_manager = contacts_manager self._contacts_provider = contacts_provider self._items_factory = items_factory + self._profile = profile # ----------------------------------------------------------------------------------------------------------------- # Private methods @@ -33,17 +34,16 @@ class Messenger(util.ToxSave): :param message: text of message """ t = util.get_unix_time() + friend = self._get_friend_by_number(friend_number) + text_message = TextMessage(0, message, MessageAuthor(friend.name, MESSAGE_AUTHOR['FRIEND']), t, message_type) if self._contacts_manager.is_friend_active(friend_number): # add message to list - self.create_message_item(message, t, MESSAGE_AUTHOR['FRIEND'], message_type) + self._create_message_item(text_message) self._screen.messages.scrollToBottom() - self._contacts_manager.get_curr_contact().append_message( - TextMessage(message, MESSAGE_AUTHOR['FRIEND'], t, message_type)) + self._contacts_manager.get_curr_contact().append_message(text_message) else: - friend = self.get_friend_by_number(friend_number) friend.inc_messages() - friend.append_message( - TextMessage(message, MESSAGE_AUTHOR['FRIEND'], t, message_type)) + friend.append_message(text_message) if not friend.visibility: self._contacts_manager.update_filtration() @@ -67,7 +67,7 @@ class Messenger(util.ToxSave): text = text[4:] else: message_type = TOX_MESSAGE_TYPE['NORMAL'] - friend = self.get_friend_by_number(friend_number) + friend = self._get_friend_by_number(friend_number) messages = self._split_message(text.encode('utf-8')) t = util.get_unix_time() for message in messages: @@ -76,13 +76,30 @@ class Messenger(util.ToxSave): friend.inc_receipts() else: message_id = 0 - message = TextMessage(message_id, text, MESSAGE_AUTHOR['NOT_SENT'], t, message_type) + message_author = MessageAuthor(self._profile.name, MESSAGE_AUTHOR['NOT_SENT']) + message = TextMessage(message_id, text, message_author, t, message_type) friend.append_message(message) if self._contacts_manager.is_friend_active(friend_number): self._create_message_item(message) self._screen.messageEdit.clear() self._screen.messages.scrollToBottom() + def send_messages(self, friend_number): + """ + Send 'offline' messages to friend + """ + friend = self._get_friend_by_number(friend_number) + friend.load_corr() + messages = friend.get_unsent_messages() + try: + for message in messages: + tox_messages = self._split_message(message.text) + for tox_message in tox_messages: + self._tox.friend_send_message(friend_number, message.message_type, tox_message) + friend.inc_receipts() + except Exception as ex: + util.log('Sending pending messages failed with ' + str(ex)) + # ----------------------------------------------------------------------------------------------------------------- # Typing notifications # ----------------------------------------------------------------------------------------------------------------- @@ -131,5 +148,5 @@ class Messenger(util.ToxSave): return messages - def get_friend_by_number(self, friend_number): + def _get_friend_by_number(self, friend_number): return self._contacts_provider.get_friend_by_number(friend_number) diff --git a/toxygen/middleware/callbacks.py b/toxygen/middleware/callbacks.py index 69a7f68..2d09c82 100644 --- a/toxygen/middleware/callbacks.py +++ b/toxygen/middleware/callbacks.py @@ -55,20 +55,20 @@ def friend_status(contacts_manager, file_transfer_handler, profile, settings): return wrapped -def friend_connection_status(profile, settings, plugin_loader): +def friend_connection_status(contacts_manager, profile, settings, plugin_loader, file_transfer_handler): def wrapped(tox, friend_number, new_status, user_data): """ Check friend's connection status (offline, udp, tcp) """ print("Friend #{} connection status: {}".format(friend_number, new_status)) - friend = profile.get_friend_by_number(friend_number) + friend = contacts_manager.get_friend_by_number(friend_number) if new_status == TOX_CONNECTION['NONE']: invoke_in_main_thread(profile.friend_exit, friend_number) - invoke_in_main_thread(profile.update_filtration) + invoke_in_main_thread(contacts_manager.update_filtration) if settings['sound_notifications'] and profile.status != TOX_USER_STATUS['BUSY']: sound_notification(SOUND_NOTIFICATION['FRIEND_CONNECTION_STATUS']) elif friend.status is None: - invoke_in_main_thread(profile.send_avatar, friend_number) + invoke_in_main_thread(file_transfer_handler.send_avatar, friend_number) invoke_in_main_thread(plugin_loader.friend_online, friend_number) return wrapped @@ -133,9 +133,9 @@ def friend_request(contacts_manager): return wrapped -def friend_typing(contacts_manager): +def friend_typing(messenger): def wrapped(tox, friend_number, typing, user_data): - invoke_in_main_thread(contacts_manager.friend_typing, friend_number, typing) + invoke_in_main_thread(messenger.friend_typing, friend_number, typing) return wrapped @@ -392,11 +392,12 @@ def init_callbacks(tox, profile, settings, plugin_loader, contacts_manager, # friend callbacks tox.callback_friend_status(friend_status(contacts_manager, file_transfer_handler, profile, settings), 0) tox.callback_friend_message(friend_message(messenger, contacts_manager, profile, settings, main_window, tray), 0) - tox.callback_friend_connection_status(friend_connection_status(profile, settings, plugin_loader), 0) + tox.callback_friend_connection_status(friend_connection_status(contacts_manager, profile, settings, plugin_loader, + file_transfer_handler), 0) tox.callback_friend_name(friend_name(contacts_manager), 0) tox.callback_friend_status_message(friend_status_message(contacts_manager, messenger), 0) tox.callback_friend_request(friend_request(contacts_manager), 0) - tox.callback_friend_typing(friend_typing(contacts_manager), 0) + tox.callback_friend_typing(friend_typing(messenger), 0) tox.callback_friend_read_receipt(friend_read_receipt(contacts_manager), 0) # file transfer diff --git a/toxygen/network/tox_dns.py b/toxygen/network/tox_dns.py index d3d48a1..1a525bc 100644 --- a/toxygen/network/tox_dns.py +++ b/toxygen/network/tox_dns.py @@ -1,59 +1,65 @@ import json import urllib.request -from util.util import log -from user_data import settings +import util.util as util from PyQt5 import QtNetwork, QtCore -def tox_dns(email): - """ - TOX DNS 4 - :param email: data like 'groupbot@toxme.io' - :return: tox id on success else None - """ - site = email.split('@')[1] - data = {"action": 3, "name": "{}".format(email)} - urls = ('https://{}/api'.format(site), 'http://{}/api'.format(site)) - s = settings.Settings.get_instance() - if not s['proxy_type']: # no proxy - for url in urls: - try: - return send_request(url, data) - except Exception as ex: - log('TOX DNS ERROR: ' + str(ex)) - else: # proxy - netman = QtNetwork.QNetworkAccessManager() - proxy = QtNetwork.QNetworkProxy() - proxy.setType(QtNetwork.QNetworkProxy.Socks5Proxy if s['proxy_type'] == 2 else QtNetwork.QNetworkProxy.HttpProxy) - proxy.setHostName(s['proxy_host']) - proxy.setPort(s['proxy_port']) - netman.setProxy(proxy) - for url in urls: - try: - request = QtNetwork.QNetworkRequest() - request.setUrl(QtCore.QUrl(url)) - request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/json") - reply = netman.post(request, bytes(json.dumps(data), 'utf-8')) +class ToxDns: - while not reply.isFinished(): - QtCore.QThread.msleep(1) - QtCore.QCoreApplication.processEvents() - data = bytes(reply.readAll().data()) - result = json.loads(str(data, 'utf-8')) - if not result['c']: - return result['tox_id'] - except Exception as ex: - log('TOX DNS ERROR: ' + str(ex)) + def __init__(self, settings): + self._settings = settings - return None # error + @staticmethod + def _send_request(url, data): + req = urllib.request.Request(url) + req.add_header('Content-Type', 'application/json') + response = urllib.request.urlopen(req, bytes(json.dumps(data), 'utf-8')) + res = json.loads(str(response.read(), 'utf-8')) + if not res['c']: + return res['tox_id'] + else: + raise LookupError() + def lookup(self, email): + """ + TOX DNS 4 + :param email: data like 'groupbot@toxme.io' + :return: tox id on success else None + """ + site = email.split('@')[1] + data = {"action": 3, "name": "{}".format(email)} + urls = ('https://{}/api'.format(site), 'http://{}/api'.format(site)) + if not self._settings['proxy_type']: # no proxy + for url in urls: + try: + return self._send_request(url, data) + except Exception as ex: + util.log('TOX DNS ERROR: ' + str(ex)) + else: # proxy + netman = QtNetwork.QNetworkAccessManager() + proxy = QtNetwork.QNetworkProxy() + if self._settings['proxy_type'] == 2: + proxy.setType(QtNetwork.QNetworkProxy.Socks5Proxy) + else: + proxy.setType(QtNetwork.QNetworkProxy.HttpProxy) + proxy.setHostName(self._settings['proxy_host']) + proxy.setPort(self._settings['proxy_port']) + netman.setProxy(proxy) + for url in urls: + try: + request = QtNetwork.QNetworkRequest() + request.setUrl(QtCore.QUrl(url)) + request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/json") + reply = netman.post(request, bytes(json.dumps(data), 'utf-8')) -def send_request(url, data): - req = urllib.request.Request(url) - req.add_header('Content-Type', 'application/json') - response = urllib.request.urlopen(req, bytes(json.dumps(data), 'utf-8')) - res = json.loads(str(response.read(), 'utf-8')) - if not res['c']: - return res['tox_id'] - else: - raise LookupError() + while not reply.isFinished(): + QtCore.QThread.msleep(1) + QtCore.QCoreApplication.processEvents() + data = bytes(reply.readAll().data()) + result = json.loads(str(data, 'utf-8')) + if not result['c']: + return result['tox_id'] + except Exception as ex: + util.log('TOX DNS ERROR: ' + str(ex)) + + return None # error diff --git a/toxygen/ui/av_widgets.py b/toxygen/ui/av_widgets.py index 676df78..6fe3f13 100644 --- a/toxygen/ui/av_widgets.py +++ b/toxygen/ui/av_widgets.py @@ -5,7 +5,7 @@ import util import pyaudio import wave from user_data import settings -from util.util import curr_directory +from util.util import * class IncomingCallWidget(widgets.CenteredWidget): diff --git a/toxygen/ui/items_factory.py b/toxygen/ui/items_factory.py index 10ca02b..fe3e4e4 100644 --- a/toxygen/ui/items_factory.py +++ b/toxygen/ui/items_factory.py @@ -1,6 +1,8 @@ from ui.list_items import * from ui.messages_widgets import * +# rename methods + class ItemsFactory: @@ -9,6 +11,11 @@ class ItemsFactory: self._smiley_loader = smiley_loader self._messages = main_screen.messages self._friends_list = main_screen.friends_list + self._message_edit = main_screen.messageEdit + + def _create_message_browser(self, text, width, message_type, parent=None): + return MessageBrowser(self._settings, self._message_edit, self._smiley_loader, self._plugin_loader, + text, width, message_type, parent) def friend_item(self): item = ContactItem(self._settings) @@ -18,8 +25,8 @@ class ItemsFactory: self._friends_list.setItemWidget(elem, item) return item - def message_item(self, message, pixmap=None): - item = MessageItem(message, self._messages) + def message_item(self, message, append=True, pixmap=None): + item = MessageItem(self._settings, self._create_message_browser, message, self._messages) if pixmap is not None: item.set_avatar(pixmap) elem = QtWidgets.QListWidgetItem() diff --git a/toxygen/ui/list_items.py b/toxygen/ui/list_items.py index a947919..84ba1b4 100644 --- a/toxygen/ui/list_items.py +++ b/toxygen/ui/list_items.py @@ -2,7 +2,7 @@ from wrapper.toxcore_enums_and_consts import * from PyQt5 import QtCore, QtGui, QtWidgets from contacts import profile from file_transfers.file_transfers import TOX_FILE_TRANSFER_STATE, PAUSED_FILE_TRANSFERS, DO_NOT_SHOW_ACCEPT_BUTTON, ACTIVE_FILE_TRANSFERS, SHOW_PROGRESS_BAR -from util.util import curr_directory, convert_time, curr_time +from util.util import * from ui.widgets import DataLabel, create_menu import html as h import smileys diff --git a/toxygen/ui/menu.py b/toxygen/ui/menu.py index b694574..b4fc083 100644 --- a/toxygen/ui/menu.py +++ b/toxygen/ui/menu.py @@ -1,7 +1,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets from user_data.settings import * from contacts.profile import Profile -from util.util import curr_directory, copy, get_stickers_directory, join_path +from util.util import * from ui.widgets import CenteredWidget, DataLabel, LineEdit, RubberBandWindow import pyaudio from user_data import toxes diff --git a/toxygen/ui/messages_widgets.py b/toxygen/ui/messages_widgets.py index 0d65c8a..fbd3154 100644 --- a/toxygen/ui/messages_widgets.py +++ b/toxygen/ui/messages_widgets.py @@ -6,9 +6,10 @@ import util.util as util import ui.menu as menu import html as h import re +from messenger.messages import MESSAGE_AUTHOR -class MessageEdit(QtWidgets.QTextBrowser): +class MessageBrowser(QtWidgets.QTextBrowser): def __init__(self, settings, message_edit, smileys_loader, plugin_loader, text, width, message_type, parent=None): super().__init__(parent) @@ -122,7 +123,7 @@ class MessageItem(QtWidgets.QWidget): """ Message in messages list """ - def __init__(self, settings, text_message, parent=None): + def __init__(self, settings, message_browser_factory_method, text_message, parent=None): QtWidgets.QWidget.__init__(self, parent) self.name = widgets.DataLabel(self) self.name.setGeometry(QtCore.QRect(2, 2, 95, 23)) @@ -132,25 +133,26 @@ class MessageItem(QtWidgets.QWidget): font.setPointSize(11) font.setBold(True) self.name.setFont(font) - self.name.setText(text_message.user) + self.name.setText(text_message.author.name) self.time = QtWidgets.QLabel(self) self.time.setGeometry(QtCore.QRect(parent.width() - 60, 0, 50, 25)) font.setPointSize(10) font.setBold(False) self.time.setFont(font) - self._time = time - if not sent: + self._time = text_message.time + if text_message.author.type == MESSAGE_AUTHOR['NOT_SENT']: movie = QtGui.QMovie(util.join_path(util.get_images_directory(), 'spinner.gif')) self.time.setMovie(movie) movie.start() self.t = True else: - self.time.setText(util.convert_time(time)) + self.time.setText(util.convert_time(text_message.time)) self.t = False - self.message = MessageEdit(text, parent.width() - 160, message_type, self) - if message_type != TOX_MESSAGE_TYPE['NORMAL']: + self.message = message_browser_factory_method(text_message.text, parent.width() - 160, + text_message.type, self) + if text_message.type != TOX_MESSAGE_TYPE['NORMAL']: self.name.setStyleSheet("QLabel { color: #5CB3FF; }") self.message.setAlignment(QtCore.Qt.AlignCenter) self.time.setStyleSheet("QLabel { color: #5CB3FF; }") diff --git a/toxygen/ui/tray.py b/toxygen/ui/tray.py index ebdbd33..859eade 100644 --- a/toxygen/ui/tray.py +++ b/toxygen/ui/tray.py @@ -1,6 +1,6 @@ from PyQt5 import QtWidgets, QtGui, QtCore from util.ui import tr -from util.util import get_images_directory +from util.util import * import os.path diff --git a/toxygen/user_data/settings.py b/toxygen/user_data/settings.py index 09fe373..8952956 100644 --- a/toxygen/user_data/settings.py +++ b/toxygen/user_data/settings.py @@ -1,6 +1,6 @@ import json import os -from util.util import log, get_base_directory, get_platform, join_path +from util.util import * import pyaudio import smileys.smileys as smileys