Fixes
This commit is contained in:
parent
a073dd9bc9
commit
1b8b26eafc
13 changed files with 152 additions and 65 deletions
|
@ -903,13 +903,14 @@ class App:
|
||||||
while i < iMax:
|
while i < iMax:
|
||||||
# if oThread and oThread._stop_thread: return
|
# if oThread and oThread._stop_thread: return
|
||||||
i = i + 1
|
i = i + 1
|
||||||
LOG.debug(f"bootstrapping status # {i}")
|
LOG.debug(f"bootstrapping status proxy={self._oArgs.proxy_type} # {i}")
|
||||||
self._test_bootstrap(lUdpElts)
|
if self._oArgs.proxy_type == 0:
|
||||||
if hasattr(self._oArgs, 'proxy_type') and self._oArgs.proxy_type > 0:
|
self._test_bootstrap(lUdpElts)
|
||||||
|
else:
|
||||||
|
self._test_bootstrap([lUdpElts[0]])
|
||||||
LOG.debug(f"relaying status # {i}")
|
LOG.debug(f"relaying status # {i}")
|
||||||
self._test_relays(self._settings['current_nodes_tcp'])
|
self._test_relays(self._settings['current_nodes_tcp'])
|
||||||
status = self._tox.self_get_connection_status()
|
status = self._tox.self_get_connection_status()
|
||||||
LOG.debug(f"connecting status # {i}" +' : ' +repr(status))
|
|
||||||
if status > 0:
|
if status > 0:
|
||||||
LOG.info(f"Connected # {i}" +' : ' +repr(status))
|
LOG.info(f"Connected # {i}" +' : ' +repr(status))
|
||||||
break
|
break
|
||||||
|
@ -956,8 +957,8 @@ class App:
|
||||||
LOG.debug(f"_test_relays {len(lElts)}")
|
LOG.debug(f"_test_relays {len(lElts)}")
|
||||||
ts.bootstrap_tcp(lElts[:iNODES], [self._tox])
|
ts.bootstrap_tcp(lElts[:iNODES], [self._tox])
|
||||||
|
|
||||||
def _test_socks(self, lElts=None):
|
def _test_nmap(self, lElts=None):
|
||||||
LOG.debug("_test_socks")
|
LOG.debug("_test_nmap")
|
||||||
if not self._tox: return
|
if not self._tox: return
|
||||||
title = 'Extended Test Suite'
|
title = 'Extended Test Suite'
|
||||||
text = 'Run the Extended Test Suite?\nThe program may freeze for 1-10 minutes.'
|
text = 'Run the Extended Test Suite?\nThe program may freeze for 1-10 minutes.'
|
||||||
|
@ -968,14 +969,19 @@ class App:
|
||||||
if not reply: return
|
if not reply: return
|
||||||
|
|
||||||
if lElts is None:
|
if lElts is None:
|
||||||
lElts = self._settings['current_nodes_tcp']
|
if self._oArgs.proxy_type == 0:
|
||||||
|
sProt = "udp4"
|
||||||
|
lElts = self._settings['current_nodes_tcp']
|
||||||
|
else:
|
||||||
|
sProt = "tcp4"
|
||||||
|
lElts = self._settings['current_nodes_tcp']
|
||||||
shuffle(lElts)
|
shuffle(lElts)
|
||||||
try:
|
try:
|
||||||
bootstrap_iNodeInfo(lElts)
|
ts.bootstrap_iNmapInfo(lElts, self._oArgs, sProt)
|
||||||
|
self._ms.log_console()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# json.decoder.JSONDecodeError
|
LOG.error(f"test_nmap ' +' : {e}")
|
||||||
LOG.error(f"test_tox ' +' : {e}")
|
LOG.error('_test_nmap(): ' \
|
||||||
LOG.error('_test_tox(): ' \
|
|
||||||
+'\n' + traceback.format_exc())
|
+'\n' + traceback.format_exc())
|
||||||
title = 'Test Suite Error'
|
title = 'Test Suite Error'
|
||||||
text = 'Error: ' + str(e)
|
text = 'Error: ' + str(e)
|
||||||
|
@ -986,7 +992,7 @@ class App:
|
||||||
|
|
||||||
def _test_main(self):
|
def _test_main(self):
|
||||||
from tests.tests_socks import main as tests_main
|
from tests.tests_socks import main as tests_main
|
||||||
LOG.debug("_test_socks")
|
LOG.debug("_test_main")
|
||||||
if not self._tox: return
|
if not self._tox: return
|
||||||
title = 'Extended Test Suite'
|
title = 'Extended Test Suite'
|
||||||
text = 'Run the Extended Test Suite?\nThe program may freeze for 20-60 minutes.'
|
text = 'Run the Extended Test Suite?\nThe program may freeze for 20-60 minutes.'
|
||||||
|
|
|
@ -299,6 +299,7 @@ class AV(common.tox_save.ToxAvSave):
|
||||||
self._video_width = s['video']['width']
|
self._video_width = s['video']['width']
|
||||||
self._video_height = s['video']['height']
|
self._video_height = s['video']['height']
|
||||||
|
|
||||||
|
# dunno
|
||||||
if True or s['video']['device'] == -1:
|
if True or s['video']['device'] == -1:
|
||||||
self._video = screen_sharing.DesktopGrabber(s['video']['x'],
|
self._video = screen_sharing.DesktopGrabber(s['video']['x'],
|
||||||
s['video']['y'],
|
s['video']['y'],
|
||||||
|
@ -404,6 +405,7 @@ class AV(common.tox_save.ToxAvSave):
|
||||||
if self._calls[friend_num].out_audio:
|
if self._calls[friend_num].out_audio:
|
||||||
try:
|
try:
|
||||||
# app.av.calls ERROR Error send_audio: One of the frame parameters was invalid. E.g. the resolution may be too small or too large, or the audio sampling rate may be unsupported
|
# app.av.calls ERROR Error send_audio: One of the frame parameters was invalid. E.g. the resolution may be too small or too large, or the audio sampling rate may be unsupported
|
||||||
|
# app.av.calls ERROR Error send_audio audio_send_frame: This client is currently not in a call with the friend.
|
||||||
self._toxav.audio_send_frame(friend_num,
|
self._toxav.audio_send_frame(friend_num,
|
||||||
pcm,
|
pcm,
|
||||||
count,
|
count,
|
||||||
|
@ -412,9 +414,9 @@ class AV(common.tox_save.ToxAvSave):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.error(f"Error send_audio audio_send_frame: {e}")
|
LOG.error(f"Error send_audio audio_send_frame: {e}")
|
||||||
LOG.debug(f"send_audio self._audio_rate_tox={self._audio_rate_tox} self._audio_channels={self._audio_channels}")
|
LOG.debug(f"send_audio self._audio_rate_tox={self._audio_rate_tox} self._audio_channels={self._audio_channels}")
|
||||||
invoke_in_main_thread(util_ui.message_box,
|
# invoke_in_main_thread(util_ui.message_box,
|
||||||
str(e),
|
# str(e),
|
||||||
util_ui.tr("Error send_audio audio_send_frame"))
|
# util_ui.tr("Error send_audio audio_send_frame"))
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def send_audio(self):
|
def send_audio(self):
|
||||||
|
@ -432,9 +434,10 @@ class AV(common.tox_save.ToxAvSave):
|
||||||
else:
|
else:
|
||||||
self.send_audio_data(pcm, count)
|
self.send_audio_data(pcm, count)
|
||||||
except:
|
except:
|
||||||
pass
|
LOG_DEBUG(f"error send_audio {i}")
|
||||||
|
else:
|
||||||
|
LOG_TRACE(f"send_audio {i}")
|
||||||
i += 1
|
i += 1
|
||||||
LOG.debug(f"send_audio {i}")
|
|
||||||
sleep(0.01)
|
sleep(0.01)
|
||||||
|
|
||||||
def send_video(self):
|
def send_video(self):
|
||||||
|
@ -454,7 +457,7 @@ class AV(common.tox_save.ToxAvSave):
|
||||||
LOG.warn(f"send_video video_send_frame _video.read result={result} frame={frame}")
|
LOG.warn(f"send_video video_send_frame _video.read result={result} frame={frame}")
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
LOG.debug(f"send_video video_send_frame _video.read result={result}")
|
LOG_TRACE(f"send_video video_send_frame _video.read result={result}")
|
||||||
height, width, channels = frame.shape
|
height, width, channels = frame.shape
|
||||||
friends = []
|
friends = []
|
||||||
for friend_num in self._calls:
|
for friend_num in self._calls:
|
||||||
|
@ -463,7 +466,7 @@ class AV(common.tox_save.ToxAvSave):
|
||||||
if len(friends) == 0:
|
if len(friends) == 0:
|
||||||
LOG.warn(f"send_video video_send_frame no friends")
|
LOG.warn(f"send_video video_send_frame no friends")
|
||||||
else:
|
else:
|
||||||
LOG.debug(f"send_video video_send_frame {friends}")
|
LOG_TRACE(f"send_video video_send_frame {friends}")
|
||||||
friend_num = friends[0]
|
friend_num = friends[0]
|
||||||
try:
|
try:
|
||||||
y, u, v = self.convert_bgr_to_yuv(frame)
|
y, u, v = self.convert_bgr_to_yuv(frame)
|
||||||
|
|
|
@ -141,11 +141,14 @@ class Contact(basecontact.BaseContact):
|
||||||
return list(messages)
|
return list(messages)
|
||||||
|
|
||||||
def mark_as_sent(self, tox_message_id):
|
def mark_as_sent(self, tox_message_id):
|
||||||
|
message = list(filter(lambda m: m.author is not None
|
||||||
|
and m.author.type == MESSAGE_AUTHOR['NOT_SENT']
|
||||||
|
and m.tox_message_id == tox_message_id,
|
||||||
|
self._corr))[0]
|
||||||
try:
|
try:
|
||||||
message = list(filter(lambda m: m.author is not None and m.author.type == MESSAGE_AUTHOR['NOT_SENT']
|
|
||||||
and m.tox_message_id == tox_message_id, self._corr))[0]
|
|
||||||
message.mark_as_sent()
|
message.mark_as_sent()
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
|
# wrapped C/C++ object of type QLabel has been deleted
|
||||||
LOG.error(f"Mark as sent: {ex!s}")
|
LOG.error(f"Mark as sent: {ex!s}")
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -6,6 +6,18 @@ global LOG
|
||||||
import logging
|
import logging
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# callbacks can be called in any thread so were being careful
|
||||||
|
def LOG_ERROR(l): print('EROR< '+l)
|
||||||
|
def LOG_WARN(l): print('WARN< '+l)
|
||||||
|
def LOG_INFO(l):
|
||||||
|
bIsVerbose = hasattr(__builtins__, 'app') and app.oArgs.loglevel <= 20-1
|
||||||
|
if bIsVerbose: print('INFO< '+l)
|
||||||
|
def LOG_DEBUG(l):
|
||||||
|
bIsVerbose = hasattr(__builtins__, 'app') and app.oArgs.loglevel <= 10-1
|
||||||
|
if bIsVerbose: print('DBUG< '+l)
|
||||||
|
def LOG_TRACE(l):
|
||||||
|
bIsVerbose = hasattr(__builtins__, 'app') and app.oArgs.loglevel < 10-1
|
||||||
|
pass # print('TRACE+ '+l)
|
||||||
|
|
||||||
class ContactProvider(tox_save.ToxSave):
|
class ContactProvider(tox_save.ToxSave):
|
||||||
|
|
||||||
|
@ -24,6 +36,7 @@ class ContactProvider(tox_save.ToxSave):
|
||||||
try:
|
try:
|
||||||
public_key = self._tox.friend_get_public_key(friend_number)
|
public_key = self._tox.friend_get_public_key(friend_number)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
LOG_WARN(f"get_friend_by_number NO {friend_number} {e} ")
|
||||||
return None
|
return None
|
||||||
return self.get_friend_by_public_key(public_key)
|
return self.get_friend_by_public_key(public_key)
|
||||||
|
|
||||||
|
@ -33,6 +46,7 @@ class ContactProvider(tox_save.ToxSave):
|
||||||
return friend
|
return friend
|
||||||
friend = self._friend_factory.create_friend_by_public_key(public_key)
|
friend = self._friend_factory.create_friend_by_public_key(public_key)
|
||||||
self._add_to_cache(public_key, friend)
|
self._add_to_cache(public_key, friend)
|
||||||
|
LOG_INFO(f"get_friend_by_public_key ADDED {friend} ")
|
||||||
|
|
||||||
return friend
|
return friend
|
||||||
|
|
||||||
|
@ -40,6 +54,7 @@ class ContactProvider(tox_save.ToxSave):
|
||||||
try:
|
try:
|
||||||
friend_numbers = self._tox.self_get_friend_list()
|
friend_numbers = self._tox.self_get_friend_list()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
LOG_WARN(f"get_all_friends NO {friend_numbers} {e} ")
|
||||||
return None
|
return None
|
||||||
friends = map(lambda n: self.get_friend_by_number(n), friend_numbers)
|
friends = map(lambda n: self.get_friend_by_number(n), friend_numbers)
|
||||||
|
|
||||||
|
@ -50,38 +65,70 @@ class ContactProvider(tox_save.ToxSave):
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
def get_all_groups(self):
|
def get_all_groups(self):
|
||||||
|
"""from callbacks"""
|
||||||
try:
|
try:
|
||||||
group_numbers = range(self._tox.group_get_number_groups())
|
len_groups = self._tox.group_get_number_groups()
|
||||||
|
group_numbers = range(len_groups)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return None
|
return None
|
||||||
groups = map(lambda n: self.get_group_by_number(n), group_numbers)
|
groups = list(map(lambda n: self.get_group_by_number(n), group_numbers))
|
||||||
|
# failsafe in case there are bogus None groups?
|
||||||
return list(groups)
|
fgroups = list(filter(lambda x: x, groups))
|
||||||
|
if len(fgroups) != len_groups:
|
||||||
|
LOG_WARN(f"are there are bogus None groups in libtoxcore? {len(fgroups)} != {len_groups}")
|
||||||
|
for group_num in group_numbers:
|
||||||
|
group = self.get_group_by_number(group_num)
|
||||||
|
if group is None:
|
||||||
|
LOG_ERROR(f"there are bogus None groups in libtoxcore {group_num}!")
|
||||||
|
# fixme: do something
|
||||||
|
groups = fgroups
|
||||||
|
return groups
|
||||||
|
|
||||||
def get_group_by_number(self, group_number):
|
def get_group_by_number(self, group_number):
|
||||||
|
group = None
|
||||||
try:
|
try:
|
||||||
if True:
|
LOG_INFO(f"group_get_number {group_number} ")
|
||||||
# original code
|
# original code
|
||||||
public_key = self._tox.group_get_chat_id(group_number)
|
chat_id = self._tox.group_get_chat_id(group_number)
|
||||||
# LOG.info(f"group_get_chat_id {group_number} {public_key}")
|
if not chat_id:
|
||||||
return self.get_group_by_public_key(public_key)
|
LOG_ERROR(f"get_group_by_number NULL number ({group_number})")
|
||||||
else:
|
else:
|
||||||
# guessing
|
LOG_INFO(f"group_get_number {group_number} {chat_id}")
|
||||||
chat_id = self._tox.group_get_chat_id(group_number)
|
group = self.get_group_by_chat_id(chat_id)
|
||||||
# LOG.info(f"group_get_chat_id {group_number} {chat_id}")
|
if not group:
|
||||||
group = self.get_contact_by_tox_id(chat_id)
|
LOG_ERROR(f"get_group_by_number NULL group ({chat_id})")
|
||||||
return group
|
if group is None:
|
||||||
|
|
||||||
|
LOG_WARN(f"get_group_by_number leaving ({group_number})")
|
||||||
|
#? iRet = self._tox.group_leave(group_number)
|
||||||
|
# invoke in main thread?
|
||||||
|
# self._contacts_manager.delete_group(group_number)
|
||||||
|
return group
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.warn(f"group_get_chat_id {group_number} {e}")
|
LOG_WARN(f"group_get_number {group_number} {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_group_by_chat_id(self, chat_id):
|
||||||
|
group = self._get_contact_from_cache(chat_id)
|
||||||
|
if group is not None:
|
||||||
|
return group
|
||||||
|
group = self._group_factory.create_group_by_chat_id(chat_id)
|
||||||
|
if group is None:
|
||||||
|
LOG_ERROR(f"get_group_by_chat_id NULL chat_id={chat_id}")
|
||||||
|
else:
|
||||||
|
self._add_to_cache(chat_id, group)
|
||||||
|
|
||||||
|
return group
|
||||||
|
|
||||||
def get_group_by_public_key(self, public_key):
|
def get_group_by_public_key(self, public_key):
|
||||||
group = self._get_contact_from_cache(public_key)
|
group = self._get_contact_from_cache(public_key)
|
||||||
if group is not None:
|
if group is not None:
|
||||||
return group
|
return group
|
||||||
group = self._group_factory.create_group_by_public_key(public_key)
|
group = self._group_factory.create_group_by_public_key(public_key)
|
||||||
self._add_to_cache(public_key, group)
|
if group is None:
|
||||||
|
LOG_ERROR(f"get_group_by_public_key NULL group public_key={get_group_by_chat_id}")
|
||||||
|
else:
|
||||||
|
self._add_to_cache(public_key, group)
|
||||||
|
|
||||||
return group
|
return group
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,8 @@ class ContactsManager(ToxSave):
|
||||||
self._tox_dns = tox_dns
|
self._tox_dns = tox_dns
|
||||||
self._messages_items_factory = messages_items_factory
|
self._messages_items_factory = messages_items_factory
|
||||||
self._messages = screen.messages
|
self._messages = screen.messages
|
||||||
self._contacts, self._active_contact = [], -1
|
self._contacts = []
|
||||||
|
self._active_contact = -1
|
||||||
self._active_contact_changed = Event()
|
self._active_contact_changed = Event()
|
||||||
self._sorting = settings['sorting']
|
self._sorting = settings['sorting']
|
||||||
self._filter_string = ''
|
self._filter_string = ''
|
||||||
|
@ -92,17 +93,16 @@ class ContactsManager(ToxSave):
|
||||||
return self.get_curr_contact().number == group_number
|
return self.get_curr_contact().number == group_number
|
||||||
|
|
||||||
def is_contact_active(self, contact):
|
def is_contact_active(self, contact):
|
||||||
if not self._active_contact:
|
if self._active_contact == -1:
|
||||||
# LOG.debug("No self._active_contact")
|
# LOG.debug("No self._active_contact")
|
||||||
return False
|
return False
|
||||||
if self._active_contact not in self._contacts:
|
if self._active_contact >= len(self._contacts):
|
||||||
LOG.warn(f"_active_contact={self._active_contact} not in contacts len={len(self._contacts)}")
|
LOG.warn(f"ERROR _active_contact={self._active_contact} >= contacts len={len(self._contacts)}")
|
||||||
return False
|
return False
|
||||||
if not self._contacts[self._active_contact]:
|
if not self._contacts[self._active_contact]:
|
||||||
LOG.debug(f"{self._contacts[self._active_contact]} {contact.tox_id}")
|
LOG.warn(f"ERROR NULL {self._contacts[self._active_contact]} {contact.tox_id}")
|
||||||
return False
|
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
|
return self._contacts[self._active_contact].tox_id == contact.tox_id
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -145,7 +145,7 @@ class ContactsManager(ToxSave):
|
||||||
current_contact.remove_messages_widgets() # TODO: if required
|
current_contact.remove_messages_widgets() # TODO: if required
|
||||||
self._unsubscribe_from_events(current_contact)
|
self._unsubscribe_from_events(current_contact)
|
||||||
|
|
||||||
if self._active_contact + 1 and self._active_contact != value:
|
if self._active_contact >= 0 and self._active_contact != value:
|
||||||
try:
|
try:
|
||||||
current_contact.curr_text = self._screen.messageEdit.toPlainText()
|
current_contact.curr_text = self._screen.messageEdit.toPlainText()
|
||||||
except:
|
except:
|
||||||
|
@ -180,7 +180,7 @@ class ContactsManager(ToxSave):
|
||||||
self._set_current_contact_data(contact)
|
self._set_current_contact_data(contact)
|
||||||
self._active_contact_changed(contact)
|
self._active_contact_changed(contact)
|
||||||
except Exception as ex: # no friend found. ignore
|
except Exception as ex: # no friend found. ignore
|
||||||
LOG.warn(f"no friend found. Friend value: {value!s}")
|
LOG.warn(f"no friend found. Friend value: {value!s}")
|
||||||
LOG.error('in set active: ' + str(ex))
|
LOG.error('in set active: ' + str(ex))
|
||||||
# gulp raise
|
# gulp raise
|
||||||
|
|
||||||
|
@ -368,7 +368,10 @@ class ContactsManager(ToxSave):
|
||||||
"""
|
"""
|
||||||
friend = self._contacts[num]
|
friend = self._contacts[num]
|
||||||
self._cleanup_contact_data(friend)
|
self._cleanup_contact_data(friend)
|
||||||
self._tox.friend_delete(friend.number)
|
try:
|
||||||
|
self._tox.friend_delete(friend.number)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.warn(f"'There was no friend with the given friend number {e}")
|
||||||
self._delete_contact(num)
|
self._delete_contact(num)
|
||||||
|
|
||||||
def add_friend(self, tox_id):
|
def add_friend(self, tox_id):
|
||||||
|
@ -418,7 +421,8 @@ class ContactsManager(ToxSave):
|
||||||
def add_group(self, group_number):
|
def add_group(self, group_number):
|
||||||
index = len(self._contacts)
|
index = len(self._contacts)
|
||||||
group = self._contact_provider.get_group_by_number(group_number)
|
group = self._contact_provider.get_group_by_number(group_number)
|
||||||
if not group:
|
# group num >= 0?
|
||||||
|
if group is None:
|
||||||
LOG.warn(f"CM.add_group: NO group {group_number}")
|
LOG.warn(f"CM.add_group: NO group {group_number}")
|
||||||
else:
|
else:
|
||||||
LOG.info(f"CM.add_group: Adding group {group._name}")
|
LOG.info(f"CM.add_group: Adding group {group._name}")
|
||||||
|
@ -517,7 +521,8 @@ class ContactsManager(ToxSave):
|
||||||
title = 'Friend add exception'
|
title = 'Friend add exception'
|
||||||
text = 'Friend request exception with ' + str(ex)
|
text = 'Friend request exception with ' + str(ex)
|
||||||
self._log(text)
|
self._log(text)
|
||||||
LOG.error(traceback.format_exc())
|
LOG.exception(text)
|
||||||
|
LOG.warn(f"DELETE {sToxPkOrId} ?")
|
||||||
retval = str(ex)
|
retval = str(ex)
|
||||||
title = util_ui.tr(title)
|
title = util_ui.tr(title)
|
||||||
text = util_ui.tr(text)
|
text = util_ui.tr(text)
|
||||||
|
@ -586,9 +591,11 @@ class ContactsManager(ToxSave):
|
||||||
self.set_active(0)
|
self.set_active(0)
|
||||||
# filter(lambda c: not c.has_avatar(), self._contacts)
|
# filter(lambda c: not c.has_avatar(), self._contacts)
|
||||||
for (i, contact) in enumerate(self._contacts):
|
for (i, contact) in enumerate(self._contacts):
|
||||||
if not contact:
|
if contact is None:
|
||||||
LOG.warn("_load_contacts NULL contact {i}")
|
LOG.warn(f"_load_contacts NULL contact {i}")
|
||||||
|
LOG.info(f"_load_contacts deleting NULL {self._contacts[i]}")
|
||||||
del self._contacts[i]
|
del self._contacts[i]
|
||||||
|
#? self.save_profile()
|
||||||
continue
|
continue
|
||||||
if contact.has_avatar(): continue
|
if contact.has_avatar(): continue
|
||||||
contact.reset_avatar(self._settings['identicons'])
|
contact.reset_avatar(self._settings['identicons'])
|
||||||
|
|
|
@ -17,9 +17,11 @@ class GroupFactory(ToxSave):
|
||||||
self._db = db
|
self._db = db
|
||||||
self._items_factory = items_factory
|
self._items_factory = items_factory
|
||||||
|
|
||||||
|
def create_group_by_chat_id(self, chat_id):
|
||||||
|
return self.create_group_by_public_key(chat_id)
|
||||||
|
|
||||||
def create_group_by_public_key(self, public_key):
|
def create_group_by_public_key(self, public_key):
|
||||||
group_number = self._get_group_number_by_chat_id(public_key)
|
group_number = self._get_group_number_by_chat_id(public_key)
|
||||||
|
|
||||||
return self.create_group_by_number(group_number)
|
return self.create_group_by_number(group_number)
|
||||||
|
|
||||||
def create_group_by_number(self, group_number):
|
def create_group_by_number(self, group_number):
|
||||||
|
|
|
@ -281,14 +281,16 @@ class GroupsService(tox_save.ToxSave):
|
||||||
if invite in self._group_invites:
|
if invite in self._group_invites:
|
||||||
self._group_invites.remove(invite)
|
self._group_invites.remove(invite)
|
||||||
|
|
||||||
def _join_gc_via_invite(self, invite_data, friend_number, nick, status, password):
|
# status should be dropped
|
||||||
|
def _join_gc_via_invite(self, invite_data, friend_number, nick, status='', password=''):
|
||||||
LOG.debug(f"_join_gc_via_invite friend_number={friend_number} nick={nick} datalen={len(invite_data)}")
|
LOG.debug(f"_join_gc_via_invite friend_number={friend_number} nick={nick} datalen={len(invite_data)}")
|
||||||
if nick is None:
|
if nick is None:
|
||||||
nick = ''
|
nick = ''
|
||||||
if invite_data is None:
|
if invite_data is None:
|
||||||
invite_data = b''
|
invite_data = b''
|
||||||
try:
|
try:
|
||||||
group_number = self._tox.group_invite_accept(invite_data, friend_number, nick, status, password)
|
# status should be dropped
|
||||||
|
group_number = self._tox.group_invite_accept(invite_data, friend_number, nick, password=password)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.error(f"_join_gc_via_invite ERROR {e}")
|
LOG.error(f"_join_gc_via_invite ERROR {e}")
|
||||||
return
|
return
|
||||||
|
|
|
@ -76,7 +76,7 @@ class Messenger(tox_save.ToxSave):
|
||||||
if self._contacts_manager.is_active_a_friend():
|
if self._contacts_manager.is_active_a_friend():
|
||||||
self.send_message_to_friend(text, message_type)
|
self.send_message_to_friend(text, message_type)
|
||||||
elif self._contacts_manager.is_active_a_group():
|
elif self._contacts_manager.is_active_a_group():
|
||||||
self.send_message_to_group(text, message_type)
|
self.send_message_to_group('~'+text, message_type)
|
||||||
elif self._contacts_manager.is_active_a_group_chat_peer():
|
elif self._contacts_manager.is_active_a_group_chat_peer():
|
||||||
self.send_message_to_group_peer(text, message_type)
|
self.send_message_to_group_peer(text, message_type)
|
||||||
else:
|
else:
|
||||||
|
@ -353,11 +353,12 @@ class Messenger(tox_save.ToxSave):
|
||||||
LOG.warn("_add_message null contact")
|
LOG.warn("_add_message null contact")
|
||||||
return
|
return
|
||||||
if self._contacts_manager.is_contact_active(contact): # add message to list
|
if self._contacts_manager.is_contact_active(contact): # add message to list
|
||||||
|
# LOG.debug("_add_message is_contact_active(contact)")
|
||||||
self._create_message_item(text_message)
|
self._create_message_item(text_message)
|
||||||
self._screen.messages.scrollToBottom()
|
self._screen.messages.scrollToBottom()
|
||||||
self._contacts_manager.get_curr_contact().append_message(text_message)
|
self._contacts_manager.get_curr_contact().append_message(text_message)
|
||||||
else:
|
else:
|
||||||
LOG.debug("_add_message not is_contact_active(contact)")
|
# LOG.debug("_add_message not is_contact_active(contact)")
|
||||||
contact.inc_messages()
|
contact.inc_messages()
|
||||||
contact.append_message(text_message)
|
contact.append_message(text_message)
|
||||||
if not contact.visibility:
|
if not contact.visibility:
|
||||||
|
|
|
@ -529,27 +529,35 @@ def group_invite(window, settings, tray, profile, groups_service, contacts_provi
|
||||||
def group_self_join(contacts_provider, contacts_manager, groups_service):
|
def group_self_join(contacts_provider, contacts_manager, groups_service):
|
||||||
sSlot = 'group_self_join'
|
sSlot = 'group_self_join'
|
||||||
def wrapped(tox, group_number, user_data):
|
def wrapped(tox, group_number, user_data):
|
||||||
|
if group_number is None:
|
||||||
|
LOG_ERROR(f"group_self_join NULL group_number #{group_number}")
|
||||||
|
return
|
||||||
|
LOG_DEBUG(f"group_self_join #{group_number}")
|
||||||
key = f"group_number {group_number}"
|
key = f"group_number {group_number}"
|
||||||
if bTooSoon(key, sSlot, 10): return
|
if bTooSoon(key, sSlot, 10): return
|
||||||
LOG_DEBUG(f"group_self_join #{group_number}")
|
|
||||||
group = contacts_provider.get_group_by_number(group_number)
|
group = contacts_provider.get_group_by_number(group_number)
|
||||||
|
if group is None:
|
||||||
|
LOG_ERROR(f"group_self_join NULL group #{group}")
|
||||||
|
return
|
||||||
invoke_in_main_thread(group.set_status, TOX_USER_STATUS['NONE'])
|
invoke_in_main_thread(group.set_status, TOX_USER_STATUS['NONE'])
|
||||||
invoke_in_main_thread(groups_service.update_group_info, group)
|
invoke_in_main_thread(groups_service.update_group_info, group)
|
||||||
invoke_in_main_thread(contacts_manager.update_filtration)
|
invoke_in_main_thread(contacts_manager.update_filtration)
|
||||||
|
|
||||||
return wrapped
|
return wrapped
|
||||||
|
|
||||||
|
|
||||||
def group_peer_join(contacts_provider, groups_service):
|
def group_peer_join(contacts_provider, groups_service):
|
||||||
sSlot = "group_peer_join"
|
sSlot = "group_peer_join"
|
||||||
def wrapped(tox, group_number, peer_id, user_data):
|
def wrapped(tox, group_number, peer_id, user_data):
|
||||||
key = f"group_peer_join #{group_number} peer_id={peer_id}"
|
key = f"group_peer_join #{group_number} peer_id={peer_id}"
|
||||||
if bTooSoon(key, sSlot, 20): return
|
if bTooSoon(key, sSlot, 20): return
|
||||||
group = contacts_provider.get_group_by_number(group_number)
|
group = contacts_provider.get_group_by_number(group_number)
|
||||||
|
if group is None:
|
||||||
|
LOG_ERROR(f"group_peer_join NULL group #{group} group_number={group_number}")
|
||||||
|
return
|
||||||
if peer_id > group._peers_limit:
|
if peer_id > group._peers_limit:
|
||||||
LOG_ERROR(key +f" {peer_id} > {group._peers_limit}")
|
LOG_ERROR(key +f" {peer_id} > {group._peers_limit}")
|
||||||
return
|
return
|
||||||
LOG_DEBUG(key)
|
LOG_DEBUG(f"group_peer_join group={group}")
|
||||||
group.add_peer(peer_id)
|
group.add_peer(peer_id)
|
||||||
invoke_in_main_thread(groups_service.generate_peers_list)
|
invoke_in_main_thread(groups_service.generate_peers_list)
|
||||||
invoke_in_main_thread(groups_service.update_group_info, group)
|
invoke_in_main_thread(groups_service.update_group_info, group)
|
||||||
|
|
|
@ -63,7 +63,7 @@ class IncomingCallWidget(widgets.CenteredWidget):
|
||||||
self.accept_video.clicked.connect(self.accept_call_with_video)
|
self.accept_video.clicked.connect(self.accept_call_with_video)
|
||||||
self.decline.clicked.connect(self.decline_call)
|
self.decline.clicked.connect(self.decline_call)
|
||||||
|
|
||||||
output_device_index = self._settings._args.audio['output']
|
output_device_index = self._settings._oArgs.audio['output']
|
||||||
|
|
||||||
if False and self._settings['calls_sound']:
|
if False and self._settings['calls_sound']:
|
||||||
class SoundPlay(QtCore.QThread):
|
class SoundPlay(QtCore.QThread):
|
||||||
|
|
|
@ -3,6 +3,9 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
import utils.ui as util_ui
|
import utils.ui as util_ui
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
global LOG
|
||||||
|
LOG = logging.getLogger('app')
|
||||||
|
|
||||||
class DataLabel(QtWidgets.QLabel):
|
class DataLabel(QtWidgets.QLabel):
|
||||||
"""
|
"""
|
||||||
Label with elided text
|
Label with elided text
|
||||||
|
@ -11,13 +14,17 @@ class DataLabel(QtWidgets.QLabel):
|
||||||
try:
|
try:
|
||||||
text = ''.join('\u25AF' if len(bytes(str(c), 'utf-8')) >= 4 else c for c in str(text))
|
text = ''.join('\u25AF' if len(bytes(str(c), 'utf-8')) >= 4 else c for c in str(text))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"DataLabel::setText: {e}")
|
LOG.error(f"DataLabel::setText: {e}")
|
||||||
return
|
return
|
||||||
|
|
||||||
metrics = QtGui.QFontMetrics(self.font())
|
try:
|
||||||
text = metrics.elidedText(str(text), QtCore.Qt.ElideRight, self.width())
|
metrics = QtGui.QFontMetrics(self.font())
|
||||||
super().setText(text)
|
text = metrics.elidedText(str(text), QtCore.Qt.ElideRight, self.width())
|
||||||
|
except Exception as e:
|
||||||
|
# RuntimeError: wrapped C/C++ object of type DataLabel has been deleted
|
||||||
|
text = str(text)
|
||||||
|
|
||||||
|
super().setText(text)
|
||||||
|
|
||||||
class ComboBox(QtWidgets.QComboBox):
|
class ComboBox(QtWidgets.QComboBox):
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,7 @@ class Settings(dict):
|
||||||
self._profile_path = path.replace('.json', '.tox')
|
self._profile_path = path.replace('.json', '.tox')
|
||||||
self._toxes = toxes
|
self._toxes = toxes
|
||||||
self._app = app
|
self._app = app
|
||||||
|
self._args = app._oArgs
|
||||||
self._oArgs = app._oArgs
|
self._oArgs = app._oArgs
|
||||||
self._log = lambda l: LOG.log(self._oArgs.loglevel, l)
|
self._log = lambda l: LOG.log(self._oArgs.loglevel, l)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue