From 90e379a6deab52f7acc23f3de18a1a6048fb8221 Mon Sep 17 00:00:00 2001 From: emdee Date: Thu, 13 Oct 2022 13:55:56 +0000 Subject: [PATCH] bugfixes --- toxygen/app.py | 12 ++-- toxygen/bootstrap/bootstrap.py | 2 + toxygen/contacts/contacts_manager.py | 7 ++- .../file_transfers_messages_service.py | 3 + toxygen/messenger/messenger.py | 61 ++++++++++++++----- toxygen/middleware/threads.py | 29 ++------- toxygen/middleware/tox_factory.py | 29 +++++---- toxygen/ui/main_screen.py | 12 ++-- toxygen/ui/main_screen_widgets.py | 3 +- 9 files changed, 92 insertions(+), 66 deletions(-) diff --git a/toxygen/app.py b/toxygen/app.py index 9ff6a76..340bca0 100644 --- a/toxygen/app.py +++ b/toxygen/app.py @@ -4,7 +4,7 @@ import sys import traceback from random import shuffle import threading -from time import sleep +from time import sleep, time from gevent import monkey; monkey.patch_all(); del monkey # noqa import gevent @@ -75,7 +75,7 @@ from user_data.backup_service import BackupService import styles.style # TODO: dynamic loading import wrapper_tests.support_testing as ts -from wrapper_tests.tests_wrapper import bootstrap_iNodeInfo +from wrapper_tests.tests_wrapper import test_bootstrap_iNmapInfo global LOG import logging @@ -846,10 +846,10 @@ class App: sleep(interval / 1000.0) def _test_tox(self): - self.test_net() + self.test_net(iMax=8) self._ms.log_console() - def test_net(self, oThread=None, iMax=4): + def test_net(self, oThread=None, iMax=6): LOG.debug("test_net " +self._oArgs.network) # bootstrap @@ -906,7 +906,7 @@ class App: self.loop(2) global iLAST_CONN - iLAST_CONN = time.time() + iLAST_CONN = time() def _test_env(self): _settings = self._settings @@ -961,7 +961,7 @@ class App: lElts = self._settings['current_nodes_tcp'] shuffle(lElts) try: - bootstrap_iNodeInfo(lElts) + test_bootstrap_iNmapInfo(lElts) except Exception as e: # json.decoder.JSONDecodeError LOG.error(f"test_tox ' +' : {e}") diff --git a/toxygen/bootstrap/bootstrap.py b/toxygen/bootstrap/bootstrap.py index a66f8c9..7df3eb1 100644 --- a/toxygen/bootstrap/bootstrap.py +++ b/toxygen/bootstrap/bootstrap.py @@ -21,6 +21,8 @@ LOG = logging.getLogger('app.'+'bootstrap') def download_nodes_list(settings, oArgs): if not settings['download_nodes_list']: return '' + if not ts.bAreWeConnected(): + return '' url = settings['download_nodes_url'] path = _get_nodes_path(oArgs=oArgs) # dont download blindly so we can edit the file and not block on startup diff --git a/toxygen/contacts/contacts_manager.py b/toxygen/contacts/contacts_manager.py index 1f6ddd6..26a3302 100644 --- a/toxygen/contacts/contacts_manager.py +++ b/toxygen/contacts/contacts_manager.py @@ -96,10 +96,13 @@ class ContactsManager(ToxSave): LOG.warn("No self._active_contact") return False if self._active_contact not in self._contacts: + LOG.debug(f"_active_contact={self._active_contact} len={len(self._contacts)}") return False if not self._contacts[self._active_contact]: + LOG.debug(f"{self._contacts[self._active_contact]} {contact.tox_id}") return False + LOG.debug(f"{self._contacts[self._active_contact].tox_id} == {contact.tox_id}") return self._contacts[self._active_contact].tox_id == contact.tox_id # ----------------------------------------------------------------------------------------------------------------- @@ -296,7 +299,7 @@ class ContactsManager(ToxSave): def get_or_create_group_peer_contact(self, group_number, peer_id): group = self.get_group_by_number(group_number) peer = group.get_peer_by_id(peer_id) - if peer: # broken + if peer: # broken? if not hasattr(peer, 'public_key') or not peer.public_key: LOG.error(f'no peer public_key ' + repr(dir(peer))) else: @@ -304,7 +307,7 @@ class ContactsManager(ToxSave): self.add_group_peer(group, peer) return self.get_contact_by_tox_id(peer.public_key) else: - LOG.warn(f'no peer group_number={group_number}') + LOG.warn(f'no peer group_number={group_number} peer_id={peer_id}') def check_if_contact_exists(self, tox_id): return any(filter(lambda c: c.tox_id == tox_id, self._contacts)) diff --git a/toxygen/file_transfers/file_transfers_messages_service.py b/toxygen/file_transfers/file_transfers_messages_service.py index 0657fca..d51f748 100644 --- a/toxygen/file_transfers/file_transfers_messages_service.py +++ b/toxygen/file_transfers/file_transfers_messages_service.py @@ -21,6 +21,7 @@ class FileTransfersMessagesService: 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']) 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) @@ -36,6 +37,7 @@ class FileTransfersMessagesService: 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) @@ -61,6 +63,7 @@ class FileTransfersMessagesService: self._create_inline_item(transfer.data, 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) diff --git a/toxygen/messenger/messenger.py b/toxygen/messenger/messenger.py index ccc494b..9dca1a5 100644 --- a/toxygen/messenger/messenger.py +++ b/toxygen/messenger/messenger.py @@ -1,7 +1,10 @@ # -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- import common.tox_save as tox_save +import utils.ui as util_ui + from messenger.messages import * from wrapper_tests.support_testing import assert_main_thread +from wrapper.toxcore_enums_and_consts import TOX_MAX_MESSAGE_LENGTH global LOG import logging @@ -60,34 +63,54 @@ class Messenger(tox_save.ToxSave): self._screen.messageEdit.clear() return - action_message_prefix = '/me ' - if text.startswith(action_message_prefix): - message_type = TOX_MESSAGE_TYPE['ACTION'] - text = text[len(action_message_prefix):] - else: - message_type = TOX_MESSAGE_TYPE['NORMAL'] - - if self._contacts_manager.is_active_a_friend(): - self.send_message_to_friend(text, message_type) - elif self._contacts_manager.is_active_a_group(): - self.send_message_to_group('~'+text, message_type) - elif self._contacts_manager.is_active_a_group_chat_peer(): - self.send_message_to_group_peer(text, message_type) + message_type = TOX_MESSAGE_TYPE['NORMAL'] + if False: # undocumented + action_message_prefix = '/me ' + if text.startswith(action_message_prefix): + message_type = TOX_MESSAGE_TYPE['ACTION'] + text = text[len(action_message_prefix):] + if len(text) > TOX_MAX_MESSAGE_LENGTH: + text = text[:TOX_MAX_MESSAGE_LENGTH] # 1372 + try: + if self._contacts_manager.is_active_a_friend(): + self.send_message_to_friend(text, message_type) + elif self._contacts_manager.is_active_a_group(): + self.send_message_to_group('~'+text, message_type) + elif self._contacts_manager.is_active_a_group_chat_peer(): + self.send_message_to_group_peer(text, message_type) + else: + LOG.warn(f'Unknown friend type for Messenger send_message') + except Exception as e: + LOG.error(f'Messenger send_message {e}') + import traceback + LOG.warn(traceback.format_exc()) + title = 'Messenger send_message Error' + text = 'Error: ' + str(e) + assert_main_thread() + util_ui.message_box(text, title) + def send_message_to_friend(self, text, message_type, friend_number=None): """ Send message :param text: message text :param friend_number: number of friend + from Qt callback """ if friend_number is None: friend_number = self._contacts_manager.get_active_number() - + if friend_number is None: + LOG.error(f"No _contacts_manager.get_active_number") + return if not text or friend_number < 0: return assert_main_thread() friend = self._get_friend_by_number(friend_number) + if not friend: + LOG.error(f"No self._get_friend_by_number") + return + assert friend messages = self._split_message(text.encode('utf-8')) t = util.get_unix_time() for message in messages: @@ -172,10 +195,14 @@ class Messenger(tox_save.ToxSave): group = self._get_group_by_public_key(group_peer_contact.group_pk) group_number = group.number - if not text or group_number < 0 or peer_id < 0: + if not text: return + if group.number < 0: + return + if peer_id and peer_id < 0: + return + assert_main_thread() - # FixMe: peer_id is None? group_peer_contact = self._contacts_manager.get_or_create_group_peer_contact(group_number, peer_id) # group_peer_contact now may be None @@ -309,6 +336,7 @@ class Messenger(tox_save.ToxSave): self._add_info_message(friend_number, text) def _add_info_message(self, friend_number, text): + assert friend friend = self._get_friend_by_number(friend_number) message = InfoMessage(text, util.get_unix_time()) friend.append_message(message) @@ -330,6 +358,7 @@ class Messenger(tox_save.ToxSave): self._screen.messages.scrollToBottom() self._contacts_manager.get_curr_contact().append_message(text_message) else: + LOG.debug("_add_message not is_contact_active(contact)") contact.inc_messages() contact.append_message(text_message) if not contact.visibility: diff --git a/toxygen/middleware/threads.py b/toxygen/middleware/threads.py index c5cf964..5e7ab7b 100644 --- a/toxygen/middleware/threads.py +++ b/toxygen/middleware/threads.py @@ -103,26 +103,14 @@ class InitThread(BaseThread): def run(self): LOG_DEBUG('InitThread run: ') try: - if self._is_first_start: + if self._is_first_start and ts.bAreWeConnected(): if self._settings['download_nodes_list']: LOG_INFO('downloading list of nodes') download_nodes_list(self._settings, oArgs=self._app._args) - if False: - lNodes = ts.generate_nodes() - LOG_INFO(f"bootstrapping {len(lNodes)!s} nodes") - for data in lNodes: - if self._stop_thread: - return - self._tox.bootstrap(*data) - self._tox.add_tcp_relay(*data) - else: + if ts.bAreWeConnected(): LOG_INFO(f"calling test_net nodes") - threading.Timer(1.0, - self._app.test_net, - args=list(), - kwargs=dict(oThread=self, iMax=4) - ).start() + self._app.test_net(oThread=self, iMax=4) if self._is_first_start: LOG_INFO('starting plugins') @@ -170,15 +158,8 @@ class ToxIterateThread(BaseQThread): self._tox.self_get_connection_status() == TOX_CONNECTION['NONE']: iLAST_CONN = time.time() LOG_INFO(f"ToxIterateThread calling test_net") - if True: - invoke_in_main_thread( - self._app.test_net, oThread=self, iMax=2) - else: - threading.Timer(1.0, - self._app.test_net, - args=list(), - kwargs=dict(lElts=None, oThread=self, iMax=2) - ).start() + invoke_in_main_thread( + self._app.test_net, oThread=self, iMax=2) class ToxAVIterateThread(BaseQThread): diff --git a/toxygen/middleware/tox_factory.py b/toxygen/middleware/tox_factory.py index 1b4d119..0ab4917 100644 --- a/toxygen/middleware/tox_factory.py +++ b/toxygen/middleware/tox_factory.py @@ -9,9 +9,6 @@ import os global LOG import logging LOG = logging.getLogger('app.'+'tox_factory') -def LOG_INFO(l): print('DBUG> '+l) -def LOG_DEBUG(l): print('DBUG> '+l) -def LOG_LOG(l): print('TRAC> '+l) from ctypes import * from utils import util @@ -30,6 +27,7 @@ def LOG_DEBUG(a): def LOG_TRACE(a): bVERBOSE = hasattr(__builtins__, 'app') and app.oArgs.loglevel < 10 if bVERBOSE: print('TRAC> '+a) +def LOG_LOG(a): print('TRAC> '+a) def tox_log_cb(iTox, level, file, line, func, message, *args): """ @@ -40,15 +38,20 @@ def tox_log_cb(iTox, level, file, line, func, message, *args): * @param message The log message. * @param user_data The user data pointer passed to tox_new in options. """ - file = str(file, 'UTF-8') - func = str(func, 'UTF-8') - message = str(message, 'UTF-8') - if file == 'network.c' and line == 660: return - # root WARNING 3network.c#944:b'send_packet'attempted to send message with network family 10 (probably IPv6) on IPv4 socket - if file == 'network.c' and line == 944: return - message = f"{file}#{line}:{func} {message}" - LOG_LOG(message) - + try: + if type(file) == bytes: + file = str(file, 'UTF-8') + if file == 'network.c' and line in [944, 660]: return + # root WARNING 3network.c#944:b'send_packet'attempted to send message with network family 10 (probably IPv6) on IPv4 socket + if type(func) == bytes: + func = str(func, 'UTF-8') + if type(message) == bytes: + message = str(message, 'UTF-8') + message = f"{file}#{line}:{func} {message}" + LOG_LOG(message) + except Exception as e: + LOG_ERROR("tox_log_cb {e}") + def tox_factory(data=None, settings=None, args=None, app=None): """ :param data: user data from .tox file. None = no saved data, create new profile @@ -102,7 +105,7 @@ def tox_factory(data=None, settings=None, args=None, app=None): tox_options._options_pointer, tox_options.self_logger_cb) else: - logging_WARN("No tox_options._options_pointer to add self_logger_cb" ) + LOG_WARN("No tox_options._options_pointer to add self_logger_cb" ) retval = wrapper.tox.Tox(tox_options) except Exception as e: diff --git a/toxygen/ui/main_screen.py b/toxygen/ui/main_screen.py index dc53731..339ebbd 100644 --- a/toxygen/ui/main_screen.py +++ b/toxygen/ui/main_screen.py @@ -733,8 +733,8 @@ class MainWindow(QtWidgets.QMainWindow): def test_tox(self): self._app._test_tox() - def test_socks(self): - self._app._test_socks() + def test_nmap(self): + self._app._test_nmap() def quit_program(self): try: @@ -904,9 +904,13 @@ class MainWindow(QtWidgets.QMainWindow): def show_search_field(self): if hasattr(self, 'search_field') and self.search_field.isVisible(): + #? + self.search_field.show() return - if self._contacts_manager.get_curr_friend() is None: - return + if not hasattr(self._contacts_manager, 'get_curr_friend') or \ + self._contacts_manager.get_curr_friend() is None: + #? return + pass self.search_field = self._widget_factory.create_search_screen(self.messages) x, y = self.messages.x(), self.messages.y() + self.messages.height() - 40 self.search_field.setGeometry(x, y, self.messages.width(), 40) diff --git a/toxygen/ui/main_screen_widgets.py b/toxygen/ui/main_screen_widgets.py index 623bdfc..a2dc110 100644 --- a/toxygen/ui/main_screen_widgets.py +++ b/toxygen/ui/main_screen_widgets.py @@ -48,8 +48,9 @@ class MessageArea(QtWidgets.QPlainTextEdit): self._messenger.send_typing(False) self._messenger.send_message() except Exception as e: + LOG.error(f"keyPressEvent ERROR send_message to {self._messenger}") util_ui.message_box(str(e), - util_ui.tr(f"ERROR send_message to {self._messenger}")) + util_ui.tr(f"keyPressEvent ERROR send_message to {self._messenger}")) elif event.key() == QtCore.Qt.Key_Up and not self.toPlainText(): self.appendPlainText(self._messenger.get_last_message())