Added qweechat

This commit is contained in:
emdee 2022-11-20 01:11:51 +00:00
parent 1e5618060a
commit f1d8ce105c
56 changed files with 312 additions and 339 deletions

1
.gitignore vendored
View File

@ -26,4 +26,3 @@ Toxygen.egg-info
.cache
*.db
*.junk

View File

@ -55,5 +55,12 @@ is making a dependency. Just download it and copy the two directories
See ToDo.md to the current ToDo list.
If you install https://github.com/weechat/qweechat
you can have IRC and jabber in a window too. Start
[weechat](https://github.com/weechat/weechat) and
```
/relay weechat 9000 password
```
Work on this project is suspended until the
[MultiDevice](https://git.plastiras.org/emdee/tox_profile/wiki/MultiDevice-Announcements-POC) problem is solved. Fork me!

View File

@ -1,19 +1,18 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import os
import sys
import threading
import traceback
from random import shuffle
import threading
from time import sleep
from gevent import monkey; monkey.patch_all(); del monkey # noqa
import gevent
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import QtWidgets, QtGui, QtCore
from qtpy.QtCore import QTimer
from qtpy.QtWidgets import QApplication
from gevent import monkey; monkey.patch_all(); del monkey # noqa
try:
import coloredlogs
if 'COLOREDLOGS_LEVEL_STYLES' not in os.environ:
@ -22,27 +21,29 @@ try:
except ImportError as e:
coloredlogs = False
try:
# https://github.com/pyqtconsole/pyqtconsole
from pyqtconsole.console import PythonConsole
except Exception as e:
PythonConsole = None
try:
import qdarkstylexxx
except ImportError:
qdarkstyle = None
import wrapper_tests.support_testing as ts
# install https://github.com/weechat/qweechat
# if you want IRC and jabber
from middleware import threads
import middleware.callbacks as callbacks
import styles.style # TODO: dynamic loading
import ui.password_screen as password_screen
import updater.updater as updater
from middleware.tox_factory import tox_factory
import wrapper.toxencryptsave as tox_encrypt_save
import user_data.toxes
from user_data import settings
from user_data.settings import get_user_config_path, merge_args_into_settings
from user_data.settings import Settings
from user_data.profile_manager import ProfileManager
from plugin_support.plugin_support import PluginLoader
import ui.password_screen as password_screen
from ui.login_screen import LoginScreen
from ui.main_screen import MainWindow
from ui import tray
import utils.ui as util_ui
import utils.util as util
import wrapper.toxencryptsave as tox_encrypt_save
from av.calls_manager import CallsManager
from common.provider import Provider
from contacts.contact_provider import ContactProvider
@ -52,32 +53,23 @@ from contacts.group_factory import GroupFactory
from contacts.group_peer_factory import GroupPeerFactory
from contacts.profile import Profile
from file_transfers.file_transfers_handler import FileTransfersHandler
from file_transfers.file_transfers_messages_service import \
FileTransfersMessagesService
from file_transfers.file_transfers_messages_service import FileTransfersMessagesService
from groups.groups_service import GroupsService
from history.database import Database
from history.history import History
from messenger.messenger import Messenger
from middleware import threads
from middleware.tox_factory import tox_factory
from network.tox_dns import ToxDns
from plugin_support.plugin_support import PluginLoader
from smileys.smileys import SmileyLoader
from ui import tray
from ui.create_profile_screen import CreateProfileScreen
from ui.items_factories import ContactItemsFactory, MessagesItemsFactory
from ui.login_screen import LoginScreen
from ui.main_screen import MainWindow
from ui.items_factories import MessagesItemsFactory, ContactItemsFactory
from ui.widgets_factory import WidgetsFactory
from user_data import settings
from user_data.backup_service import BackupService
from user_data.profile_manager import ProfileManager
from user_data.settings import (Settings, get_user_config_path,
merge_args_into_settings)
import styles.style # TODO: dynamic loading
import wrapper_tests.support_testing as ts
global LOG
import logging
LOG = logging.getLogger('app')
IDLE_PERIOD = 0.10
@ -148,8 +140,6 @@ sSTYLE = """
.QToolBar { font-weight: bold; }
"""
from copy import deepcopy
class App:
def __init__(self, version, oArgs):
@ -287,7 +277,7 @@ class App:
self._app.quit()
del self._app.quit
del self._app
sys.stderr.write('quit raising SystemExit' +'\n')
# hanging on gevents
# Thread 1 "python3.9" received signal SIGSEGV, Segmentation fault.
@ -311,7 +301,7 @@ class App:
if hasattr(self, '_tray') and self._tray:
self._tray.hide()
self._settings.close()
LOG.debug(f"stop_app: Killing {self._tox}")
self._kill_toxav()
self._kill_tox()

View File

@ -1,22 +1,22 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import itertools
import threading
import time
import pyaudio
import wrapper_tests.support_testing as ts
import time
import threading
import itertools
import common.tox_save
from wrapper.toxav_enums import *
from av import screen_sharing
from av.call import Call
from main import sleep
from middleware.threads import BaseThread, invoke_in_main_thread
import common.tox_save
from utils import ui as util_ui
from wrapper.toxav_enums import *
import wrapper_tests.support_testing as ts
from middleware.threads import invoke_in_main_thread
from main import sleep
from middleware.threads import BaseThread
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
# callbacks can be called in any thread so were being careful
def LOG_ERROR(l): print('EROR< '+l)
@ -405,7 +405,7 @@ class AV(common.tox_save.ToxAvSave):
if self._calls[friend_num].out_audio:
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 audio_send_frame: This client is currently not in a call with the friend.
# 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,
pcm,
count,

View File

@ -4,14 +4,13 @@ import sys
import threading
import av.calls
import common.event as event
import utils.ui as util_ui
from messenger.messages import *
from ui import av_widgets
import common.event as event
import utils.ui as util_ui
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
class CallsManager:

View File

@ -1,34 +1,29 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import random
import urllib.request
from PyQt5 import QtCore, QtNetwork
from utils.util import *
from PyQt5 import QtNetwork
from PyQt5 import QtCore
try:
from io import BytesIO
import certifi
from io import BytesIO
except ImportError:
certifi = None
import wrapper_tests.support_testing as ts
from wrapper_tests.support_http import download_url
from wrapper_tests.support_testing import _get_nodes_path
from user_data.settings import get_user_config_path
from wrapper_tests.support_testing import _get_nodes_path
from wrapper_tests.support_http import download_url
import wrapper_tests.support_testing as ts
global LOG
import logging
LOG = logging.getLogger('app.'+'bootstrap')
def download_nodes_list(settings, oArgs):
if not settings['download_nodes_list']:
return ''
if not ts.bAreWeConnected():
return ''
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

View File

@ -1,11 +1,10 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
from user_data.settings import *
from PyQt5 import QtCore, QtGui
from wrapper.toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE
import utils.util as util
import common.event as event
import contacts.common as common
import utils.util as util
from user_data.settings import *
from wrapper.toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE
class BaseContact:

View File

@ -1,16 +1,16 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import re
from history.database import TIMEOUT, \
SAVE_MESSAGES, MESSAGE_AUTHOR
from contacts import basecontact, common
from messenger.messages import *
from contacts.contact_menu import *
from file_transfers import file_transfers as ft
from history.database import MESSAGE_AUTHOR, SAVE_MESSAGES, TIMEOUT
from messenger.messages import *
import re
# LOG=util.log
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
class Contact(basecontact.BaseContact):

View File

@ -6,7 +6,6 @@ from wrapper.toxcore_enums_and_consts import *
global LOG
import logging
LOG = logging.getLogger('app')
# -----------------------------------------------------------------------------------------------------------------

View File

@ -4,7 +4,6 @@ import common.tox_save as tox_save
global LOG
import logging
LOG = logging.getLogger(__name__)
# callbacks can be called in any thread so were being careful

View File

@ -2,17 +2,16 @@
import traceback
from common.tox_save import ToxSave
from contacts.friend import Friend
from contacts.group_chat import GroupChat
from messenger.messages import *
from common.tox_save import ToxSave
from contacts.group_peer_contact import GroupPeerContact
from groups.group_peer import GroupChatPeer
from messenger.messages import *
# LOG=util.log
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
def LOG_ERROR(l): print('ERROR_: '+l)

View File

@ -1,8 +1,7 @@
import os
from contacts import common, contact
from contacts.contact_menu import *
from contacts import contact, common
from messenger.messages import *
import os
from contacts.contact_menu import *
class Friend(contact.Contact):

View File

@ -1,16 +1,15 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import utils.util as util
from common.tox_save import ToxSave
from contacts import contact
from contacts.contact_menu import GroupMenuGenerator
from groups.group_ban import GroupBan
import utils.util as util
from groups.group_peer import GroupChatPeer
from wrapper import toxcore_enums_and_consts as constants
from common.tox_save import ToxSave
from groups.group_ban import GroupBan
global LOG
import logging
LOG = logging.getLogger(__name__)
def LOG_ERROR(l): print('ERROR_: '+l)
def LOG_WARN(l): print('WARN_: '+l)

View File

@ -1,12 +1,11 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import wrapper.toxcore_enums_and_consts as constants
from common.tox_save import ToxSave
from contacts.group_chat import GroupChat
from common.tox_save import ToxSave
import wrapper.toxcore_enums_and_consts as constants
global LOG
import logging
LOG = logging.getLogger(__name__)
class GroupFactory(ToxSave):
@ -20,7 +19,7 @@ class GroupFactory(ToxSave):
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):
group_number = self._get_group_number_by_chat_id(public_key)
return self.create_group_by_number(group_number)

View File

@ -1,16 +1,14 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
from contacts import basecontact
import random
import threading
import common.tox_save as tox_save
from contacts import basecontact
from middleware.threads import invoke_in_main_thread
iUMAXINT = 4294967295
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
class Profile(basecontact.BaseContact, tox_save.ToxSave):

View File

@ -1,17 +1,14 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
from copy import deepcopy
from wrapper_tests.support_testing import assert_main_thread
import utils.util as util
from common.tox_save import ToxSave
from messenger.messages import *
from ui.contact_items import *
import utils.util as util
from common.tox_save import ToxSave
from wrapper_tests.support_testing import assert_main_thread
from copy import deepcopy
# LOG=util.log
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
log = lambda x: LOG.info(x)

View File

@ -1,10 +1,9 @@
from messenger.messenger import *
import utils.util as util
from file_transfers.file_transfers import *
from messenger.messenger import *
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
def LOG_ERROR(l): print('ERROR_: '+l)

View File

@ -2,15 +2,14 @@
import common.tox_save as tox_save
import utils.ui as util_ui
import wrapper.toxcore_enums_and_consts as constants
from groups.group_invite import GroupInvite
from groups.peers_list import PeersListGenerator
from wrapper.tox import UINT32_MAX
from groups.group_invite import GroupInvite
import wrapper.toxcore_enums_and_consts as constants
from wrapper.toxcore_enums_and_consts import *
from wrapper.tox import UINT32_MAX
global LOG
import logging
LOG = logging.getLogger('app.'+'gs')
class GroupsService(tox_save.ToxSave):

View File

@ -1,6 +1,7 @@
from ui.group_peers_list import PeerItem, PeerTypeItem
from ui.widgets import *
from wrapper.toxcore_enums_and_consts import *
from ui.widgets import *
# -----------------------------------------------------------------------------------------------------------------
# Builder

View File

@ -1,12 +1,10 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import os.path
from sqlite3 import connect
import os.path
import utils.util as util
global LOG
import logging
LOG = logging.getLogger('app.db')
TIMEOUT = 11

View File

@ -3,7 +3,6 @@ from history.history_logs_generators import *
global LOG
import logging
LOG = logging.getLogger('app.db')
class History:
@ -67,7 +66,7 @@ class History:
with open(file_name, 'wt') as fl:
fl.write(history)
LOG.info(f"wrote history to {file_name}")
def delete_message(self, message):
contact = self._contacts_manager.get_curr_contact()
if message.type in (MESSAGE_TYPE['TEXT'], MESSAGE_TYPE['ACTION']):

View File

@ -1,24 +1,21 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import argparse
import faulthandler
import logging
import os
import signal
import sys
import os
import app
import argparse
import logging
import signal
import faulthandler
faulthandler.enable()
import warnings
warnings.filterwarnings('ignore')
import wrapper_tests.support_testing as ts
try:
from trepan.api import debug
from trepan.interfaces import server as Mserver
from trepan.api import debug
except:
print('trepan3 TCP server NOT enabled.')
else:
@ -28,11 +25,10 @@ else:
print('trepan3 TCP server enabled on port 6666.')
except: pass
import utils.util as util
from user_data import settings
from user_data.settings import *
from user_data.settings import Settings
from user_data import settings
import utils.util as util
with ts.ignoreStderr():
import pyaudio
@ -40,7 +36,6 @@ __maintainer__ = 'Ingvar'
__version__ = '0.5.0+'
import time
sleep = time.sleep
def reset():
@ -358,14 +353,7 @@ def main(lArgs):
if getattr(default_ns, key) == getattr(oArgs, key):
delattr(oArgs, key)
for key in ts.lBOOLEANS:
if not hasattr(oArgs, key): continue
val = getattr(oArgs, key)
if type(val) == bool: continue
if val in ['False', 'false', '0']:
setattr(oArgs, key, False)
else:
setattr(oArgs, key, True)
ts.clean_booleans(oArgs)
aArgs = A()
for key in oArgs.__dict__.keys():

View File

@ -1,14 +1,13 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
from wrapper_tests.support_testing import assert_main_thread
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
LOG = logging.getLogger('app.'+__name__)
log = lambda x: LOG.info(x)
@ -31,7 +30,7 @@ class Messenger(tox_save.ToxSave):
def __repr__(self):
return "<Messenger>"
def get_last_message(self):
contact = self._contacts_manager.get_curr_contact()
if contact is None:
@ -90,7 +89,7 @@ class Messenger(tox_save.ToxSave):
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
@ -201,7 +200,7 @@ class Messenger(tox_save.ToxSave):
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)

View File

@ -1,19 +1,17 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import os
import sys
import os
import threading
from datetime import datetime
from PyQt5 import QtGui
from wrapper.toxcore_enums_and_consts import *
from wrapper.toxav_enums import *
from wrapper.tox import bin_to_string
import utils.ui as util_ui
import utils.util as util
from middleware.threads import execute, invoke_in_main_thread
from notifications.sound import *
from middleware.threads import invoke_in_main_thread, execute
from notifications.tray import tray_notification
from wrapper.tox import bin_to_string
from wrapper.toxav_enums import *
from wrapper.toxcore_enums_and_consts import *
from notifications.sound import *
from datetime import datetime
iMAX_INT32 = 4294967295
# callbacks can be called in any thread so were being careful

View File

@ -1,23 +1,21 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import queue
import sys
import threading
import time
import wrapper_tests.support_testing as ts
import queue
from PyQt5 import QtCore
from bootstrap.bootstrap import *
from bootstrap.bootstrap import download_nodes_list
from wrapper.toxcore_enums_and_consts import TOX_USER_STATUS, TOX_CONNECTION
import wrapper_tests.support_testing as ts
from utils import util
from wrapper.toxcore_enums_and_consts import TOX_CONNECTION, TOX_USER_STATUS
import time
sleep = time.sleep
# LOG=util.log
global LOG
import logging
LOG = logging.getLogger('app.'+'threads')
# log = lambda x: LOG.info(x)
@ -124,7 +122,7 @@ class ToxIterateThread(BaseQThread):
super().__init__()
self._tox = tox
self._app = app
def run(self):
LOG_DEBUG('ToxIterateThread run: ')
while not self._stop_thread:
@ -136,15 +134,14 @@ class ToxIterateThread(BaseQThread):
LOG_ERROR(f"ToxIterateThread run: {e}")
else:
sleep(iMsec / 1000.0)
global iLAST_CONN
if not iLAST_CONN:
iLAST_CONN = time.time()
# TRAC> TCP_common.c#203:read_TCP_packet recv buffer has 0 bytes, but requested 10 bytes
# and segv
if \
time.time() - iLAST_CONN > iLAST_DELTA and \
if time.time() - iLAST_CONN > iLAST_DELTA and \
ts.bAreWeConnected() and \
self._tox.self_get_status() == TOX_USER_STATUS['NONE'] and \
self._tox.self_get_connection_status() == TOX_CONNECTION['NONE']:
@ -152,7 +149,7 @@ class ToxIterateThread(BaseQThread):
LOG_INFO(f"ToxIterateThread calling test_net")
invoke_in_main_thread(
self._app.test_net, oThread=self, iMax=2)
class ToxAVIterateThread(BaseQThread):
def __init__(self, toxav):

View File

@ -1,22 +1,18 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import ctypes
import os
import traceback
import user_data.settings
import wrapper.tox
import wrapper.toxcore_enums_and_consts as enums
import ctypes
import traceback
import os
global LOG
import logging
LOG = logging.getLogger('app.'+'tox_factory')
from ctypes import *
from utils import ui as util_ui
from utils import util
from utils import ui as util_ui
# callbacks can be called in any thread so were being careful
# tox.py can be called by callbacks
@ -53,12 +49,12 @@ def tox_log_cb(iTox, level, file, line, func, message, *args):
except Exception as e:
LOG_ERROR(f"tox_log_cb {e}")
#tox_log_handler (context=0x24763d0,
# level=LOGGER_LEVEL_TRACE, file=0x7fffe599fb99 "TCP_common.c", line=203,
# func=0x7fffe599fc50 <__func__.2> "read_TCP_packet",
# message=0x7fffba7fabd0 "recv buffer has 0 bytes, but requested 10 bytes",
#tox_log_handler (context=0x24763d0,
# level=LOGGER_LEVEL_TRACE, file=0x7fffe599fb99 "TCP_common.c", line=203,
# func=0x7fffe599fc50 <__func__.2> "read_TCP_packet",
# message=0x7fffba7fabd0 "recv buffer has 0 bytes, but requested 10 bytes",
# userdata=0x0) at /var/local/src/c-toxcore/toxcore/tox.c:78
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

View File

@ -1,11 +1,8 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import json
import urllib.request
from PyQt5 import QtCore, QtNetwork
import utils.util as util
from PyQt5 import QtNetwork, QtCore
try:
import requests
except ImportError:
@ -13,7 +10,6 @@ except ImportError:
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
class ToxDns:

View File

@ -1,13 +1,10 @@
import os.path
import wave
import pyaudio
import utils.util
import wave
import pyaudio
import os.path
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
SOUND_NOTIFICATION = {

View File

@ -1,16 +1,14 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import utils.util as util
import os
import importlib
import inspect
import os
import sys
import plugins.plugin_super_class as pl
import utils.util as util
import sys
# LOG=util.log
global LOG
import logging
LOG = logging.getLogger('plugin_support')
def trace(msg, *args, **kwargs): LOG._log(0, msg, [])
LOG.trace = trace

View File

@ -1,15 +1,12 @@
from utils import util
import json
import os
from collections import OrderedDict
from PyQt5 import QtCore
from utils import util
# LOG=util.log
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
log = lambda x: LOG.info(x)

View File

@ -1,5 +1,4 @@
import os
import utils.util as util

View File

@ -1,16 +1,15 @@
import threading
from PyQt5 import QtCore, QtGui, QtWidgets
import pyaudio
import wave
import pyaudio
import wrapper_tests.support_testing as ts
from PyQt5 import QtCore, QtGui, QtWidgets
import utils.util as util
from ui import widgets
import utils.util as util
import wrapper_tests.support_testing as ts
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
class IncomingCallWidget(widgets.CenteredWidget):

View File

@ -1,8 +1,7 @@
from PyQt5 import QtCore, QtGui, QtWidgets
from ui.widgets import DataLabel
from utils.util import *
from wrapper.toxcore_enums_and_consts import *
from PyQt5 import QtCore, QtGui, QtWidgets
from utils.util import *
from ui.widgets import DataLabel
class ContactItem(QtWidgets.QWidget):

View File

@ -1,8 +1,7 @@
from PyQt5 import uic
import utils.ui as util_ui
import utils.util as util
from ui.widgets import *
from PyQt5 import uic
import utils.util as util
import utils.ui as util_ui
class CreateProfileScreenResult:

View File

@ -1,8 +1,7 @@
from PyQt5 import QtCore, QtWidgets, uic
import utils.ui as util_ui
import utils.util as util
from ui.widgets import CenteredWidget
from PyQt5 import uic, QtWidgets, QtCore
import utils.util as util
import utils.ui as util_ui
class GroupBanItem(QtWidgets.QWidget):

View File

@ -1,11 +1,9 @@
from PyQt5 import QtWidgets, uic
from PyQt5 import uic, QtWidgets
import utils.util as util
from ui.widgets import *
global LOG
import logging
LOG = logging.getLogger('app')
class GroupInviteItem(QtWidgets.QWidget):

View File

@ -1,9 +1,7 @@
from PyQt5 import uic
import utils.ui as util_ui
import utils.util as util
from ui.widgets import CenteredWidget
from PyQt5 import uic
import utils.util as util
import utils.ui as util_ui
class GroupManagementScreen(CenteredWidget):

View File

@ -1,5 +1,4 @@
from PyQt5 import uic
import utils.util as util
from ui.widgets import *
from wrapper.toxcore_enums_and_consts import *

View File

@ -44,7 +44,7 @@ class MessagesItemsFactory:
self._messages.setItemWidget(elem, item)
return item
# File "/var/local/src/toxygen/toxygen/file_transfers/file_transfers_handler.py", line 216, in transfer_finished
# self._file_transfers_message_service.add_inline_message(transfer, index)
# File "/var/local/src/toxygen/toxygen/file_transfers/file_transfers_messages_service.py", line 47, in add_inline_message

View File

@ -1,10 +1,8 @@
import os.path
from PyQt5 import uic
import utils.ui as util_ui
import utils.util as util
from ui.widgets import *
from PyQt5 import uic
import utils.util as util
import utils.ui as util_ui
import os.path
class LoginScreenResult:

View File

@ -1,17 +1,18 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import logging
import os
from PyQt5 import QtGui, QtWidgets, uic
from qtpy.QtGui import QColor, QFont, QSyntaxHighlighter, QTextCharFormat
from PyQt5 import uic
from PyQt5 import QtWidgets, QtGui
from qtpy.QtGui import (QColor, QTextCharFormat, QFont, QSyntaxHighlighter)
import utils.ui as util_ui
import utils.util as util
from ui.contact_items import *
from ui.main_screen_widgets import *
from ui.widgets import MultilineEdit
from ui.main_screen_widgets import *
import utils.util as util
import utils.ui as util_ui
from user_data.settings import Settings
import logging
global LOG
LOG = logging.getLogger('app.'+'mains')
@ -19,8 +20,8 @@ iMAX = 70
try:
# https://github.com/pyqtconsole/pyqtconsole
import pyqtconsole.highlighter as hl
from pyqtconsole.console import PythonConsole
import pyqtconsole.highlighter as hl
except Exception as e:
LOG.warn(e)
PythonConsole = None
@ -62,7 +63,7 @@ else:
else:
bg = 'black'
def hl_format(color, style=''):
"""Return a QTextCharFormat with the given attributes.
unused
"""
@ -93,7 +94,6 @@ else:
'inprompt': hl_format('lightBlue', 'bold'),
'outprompt': hl_format('lightRed', 'bold'),
}
class QTextEditLogger(logging.Handler):
def __init__(self, parent, app):
@ -176,6 +176,7 @@ class MainWindow(QtWidgets.QMainWindow):
iMAX = settings['width'] * 2/3 / settings['message_font_size']
self._me = LogDialog(self, app)
self._pe = None
self._we = None
def set_dependencies(self, widget_factory, tray, contacts_manager, messenger, profile, plugins_loader,
file_transfer_handler, history_loader, calls_manager, groups_service, toxes, app):
@ -249,6 +250,8 @@ class MainWindow(QtWidgets.QMainWindow):
self.actionLog_console.setObjectName("actionLog_console")
self.actionPython_console = QtWidgets.QAction(window)
self.actionPython_console.setObjectName("actionLog_console")
self.actionWeechat_console = QtWidgets.QAction(window)
self.actionWeechat_console.setObjectName("actionLog_console")
self.updateSettings = QtWidgets.QAction(window)
self.actionSettings = QtWidgets.QAction(window)
self.actionSettings.setObjectName("actionSettings")
@ -289,6 +292,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.menuPlugins.addAction(self.reloadToxchat)
self.menuPlugins.addAction(self.actionLog_console)
self.menuPlugins.addAction(self.actionPython_console)
self.menuPlugins.addAction(self.actionWeechat_console)
self.menuAbout.addAction(self.actionAbout_program)
@ -306,6 +310,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.actionAbout_program.triggered.connect(self.about_program)
self.actionLog_console.triggered.connect(self.log_console)
self.actionPython_console.triggered.connect(self.python_console)
self.actionWeechat_console.triggered.connect(self.weechat_console)
self.actionNetwork.triggered.connect(self.network_settings)
self.actionAdd_friend.triggered.connect(self.add_contact_triggered)
self.createGC.triggered.connect(self.create_gc)
@ -360,6 +365,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.actionAbout_program.setText(util_ui.tr("About program"))
self.actionLog_console.setText(util_ui.tr("Console Log"))
self.actionPython_console.setText(util_ui.tr("Python Console"))
self.actionWeechat_console.setText(util_ui.tr("Weechat Console"))
self.actionTest_tox.setText(util_ui.tr("Bootstrap"))
self.actionTest_nmap.setText(util_ui.tr("Test Nodes"))
self.actionTest_main.setText(util_ui.tr("Test Program"))
@ -654,44 +660,103 @@ class MainWindow(QtWidgets.QMainWindow):
self._me.show()
def python_console(self):
if PythonConsole:
app = self._app
if app and app._settings:
size = app._settings['message_font_size']
font_name = app._settings['font']
else:
size = 12
font_name = "Courier New"
if not PythonConsole: return
app = self._app
if app and app._settings:
size = app._settings['message_font_size']
font_name = app._settings['font']
else:
size = 12
font_name = "Courier New"
size = font_width = 10
font_name = "DejaVu Sans Mono"
size = font_width = 10
font_name = "DejaVu Sans Mono"
try:
if not self._pe:
self._pe = PythonConsole(formats=aFORMATS)
self._pe.setWindowTitle('variable: app is the application')
try:
if not self._pe:
self._pe = PythonConsole(formats=aFORMATS)
self._pe.setWindowTitle('variable: app is the application')
# self._pe.edit.setStyleSheet('foreground: white; background-color: black;}')
# Fix the pyconsole geometry
font = self._pe.edit.document().defaultFont()
# Fix the pyconsole geometry
font = self._pe.edit.document().defaultFont()
font.setFamily(font_name)
font.setBold(True)
if font_width is None:
font_width = QFontMetrics(font).width('M')
self._pe.setFont(font)
geometry = self._pe.geometry()
geometry.setWidth(font_width*80+20)
geometry.setHeight(font_width*40)
self._pe.setGeometry(geometry)
self._pe.resize(font_width*80+20, font_width*40)
self._pe.show()
self._pe.eval_queued()
# or self._pe.eval_in_thread()
return
except Exception as e:
LOG.debug(e)
def weechat_console(self):
try:
from qweechat.qweechat import MainWindow as MainWindow
LOG.info("Adding WeechatConsole")
except Exception as e:
LOG.exception(f"ERROR WeechatConsole {e} {sys.path}")
MainWindow = None
return
LOG.debug(f"calling {MainWindow}")
if not MainWindow: return
class WeechatConsole(MainWindow):
def __init__(self, *args):
MainWindow.__init__(self, *args)
def closeEvent(self, event):
"""Called when QWeeChat window is closed."""
self.network.disconnect_weechat()
if self.network.debug_dialog:
self.network.debug_dialog.close()
config.write(self.config)
app = self._app
if app and app._settings:
size = app._settings['message_font_size']
font_name = app._settings['font']
else:
size = 12
font_name = "Courier New"
size = font_width = 10
font_name = "DejaVu Sans Mono"
try:
if not self._we:
LOG.debug("creating WeechatConsole")
self._we = WeechatConsole()
# self._we.setWindowTitle('variable: app is the application')
# self._we.edit.setStyleSheet('foreground: white; background-color: black;}')
# Fix the pyconsole geometry
try:
font = self._we.buffers[0].widget.chat.defaultFont()
font.setFamily(font_name)
font.setBold(True)
if font_width is None:
font_width = QFontMetrics(font).width('M')
self._pe.setFont(font)
geometry = self._pe.geometry()
geometry.setWidth(font_width*80+20)
geometry.setHeight(font_width*40)
self._pe.setGeometry(geometry)
self._pe.resize(font_width*80+20, font_width*40)
self._pe.show()
self._pe.eval_queued()
# or self._pe.eval_in_thread()
return
self._we.setFont(font)
except Exception as e:
LOG.debug(e)
self._me.show()
font_width = size
geometry = self._we.geometry()
geometry.setWidth(font_width*80+20)
geometry.setHeight(font_width*40)
self._we.setGeometry(geometry)
self._we.resize(font_width*80+20, font_width*40)
self._we.show()
# or self._we.eval_in_thread()
return
except Exception as e:
LOG.exception(f"Error creating WeechatConsole {e}")
def about_program(self):
# TODO: replace with window

View File

@ -1,15 +1,14 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import re
import urllib
import re
from PyQt5 import QtCore, QtGui, QtWidgets
import utils.ui as util_ui
from ui.widgets import RubberBandWindow, create_menu, QRightClickButton, CenteredWidget, LineEdit
import utils.util as util
import utils.ui as util_ui
from stickers.stickers import load_stickers
from ui.widgets import (CenteredWidget, LineEdit, QRightClickButton,
RubberBandWindow, create_menu)
class MessageArea(QtWidgets.QPlainTextEdit):
@ -37,7 +36,7 @@ class MessageArea(QtWidgets.QPlainTextEdit):
self.pasteEvent(url.toString())
else:
self.pasteEvent()
elif event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
modifiers = event.modifiers()
if modifiers & QtCore.Qt.ControlModifier or modifiers & QtCore.Qt.ShiftModifier:
@ -52,10 +51,10 @@ class MessageArea(QtWidgets.QPlainTextEdit):
LOG.error(f"keyPressEvent ERROR send_message to {self._messenger}")
util_ui.message_box(str(e),
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())
elif event.key() == QtCore.Qt.Key_Tab and self._contacts_manager.is_active_a_group():
text = self.toPlainText()
text_cursor = self.textCursor()

View File

@ -1,18 +1,17 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import pyaudio
import wrapper_tests.support_testing as ts
from PyQt5 import QtCore, QtGui, QtWidgets, uic
import pyaudio
import updater.updater as updater
import utils.ui as util_ui
from ui.widgets import CenteredWidget, DataLabel, LineEdit, RubberBandWindow
from user_data import settings
from user_data.settings import *
from utils.util import *
from ui.widgets import CenteredWidget, DataLabel, LineEdit, RubberBandWindow
import updater.updater as updater
import utils.ui as util_ui
import wrapper_tests.support_testing as ts
from user_data import settings
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
global oPYA

View File

@ -1,13 +1,12 @@
import html as h
import re
import ui.menu as menu
from wrapper.toxcore_enums_and_consts import *
import ui.widgets as widgets
import utils.util as util
from file_transfers.file_transfers import *
from messenger.messages import MESSAGE_AUTHOR
import ui.menu as menu
import html as h
import re
from ui.widgets import *
from wrapper.toxcore_enums_and_consts import *
from messenger.messages import MESSAGE_AUTHOR
from file_transfers.file_transfers import *
class MessageBrowser(QtWidgets.QTextBrowser):

View File

@ -1,11 +1,9 @@
from ui.widgets import CenteredWidget, LineEdit, DialogWithResult
from PyQt5 import QtCore, QtWidgets
import utils.ui as util_ui
from ui.widgets import CenteredWidget, DialogWithResult, LineEdit
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
class PasswordArea(LineEdit):

View File

@ -1,10 +1,9 @@
from PyQt5 import uic
import utils.ui as util_ui
import utils.util as util
import wrapper.toxcore_enums_and_consts as consts
from ui.contact_items import *
from ui.widgets import CenteredWidget
from PyQt5 import uic
import utils.util as util
import utils.ui as util_ui
from ui.contact_items import *
import wrapper.toxcore_enums_and_consts as consts
class PeerScreen(CenteredWidget):
@ -34,7 +33,7 @@ class PeerScreen(CenteredWidget):
self.statusCircle.update(self._peer.status)
self.peerNameLabel.setText(self._peer.name)
self.ignorePeerCheckBox.setChecked(self._peer.is_muted)
self.ignorePeerCheckBox.clicked.connect(self._toggle_ignore)
self.sendPrivateMessagePushButton.clicked.connect(self._send_private_message)
self.copyPublicKeyPushButton.clicked.connect(self._copy_public_key)

View File

@ -1,9 +1,8 @@
from PyQt5 import QtCore, QtGui, uic
import utils.ui as util_ui
from ui.widgets import CenteredWidget
import utils.ui as util_ui
from utils.util import join_path, get_images_directory, get_views_path
from user_data.settings import Settings
from utils.util import get_images_directory, get_views_path, join_path
from PyQt5 import QtGui, QtCore, uic
class ProfileSettings(CenteredWidget):

View File

@ -1,9 +1,8 @@
from PyQt5 import uic
import utils.ui as util_ui
import utils.util as util
from ui.contact_items import *
from ui.widgets import CenteredWidget, LineEdit
from PyQt5 import uic
import utils.util as util
import utils.ui as util_ui
from ui.contact_items import *
class SelfPeerScreen(CenteredWidget):

View File

@ -1,10 +1,8 @@
import os.path
from PyQt5 import QtCore, QtGui, QtWidgets
from ui.password_screen import UnlockAppScreen
from PyQt5 import QtWidgets, QtGui, QtCore
from utils.ui import tr
from utils.util import *
from ui.password_screen import UnlockAppScreen
import os.path
class SystemTrayIcon(QtWidgets.QSystemTrayIcon):

View File

@ -1,9 +1,7 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import logging
from PyQt5 import QtCore, QtGui, QtWidgets
import utils.ui as util_ui
import logging
global LOG
LOG = logging.getLogger('app')

View File

@ -1,14 +1,13 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
from ui.group_bans_widgets import *
from ui.group_invites_widgets import *
from ui.group_settings_widgets import *
from ui.groups_widgets import *
from ui.main_screen_widgets import *
from ui.menu import *
from ui.groups_widgets import *
from ui.peer_screen import *
from ui.profile_settings_screen import ProfileSettings
from ui.self_peer_screen import *
from ui.group_invites_widgets import *
from ui.group_settings_widgets import *
from ui.group_bans_widgets import *
from ui.profile_settings_screen import ProfileSettings
class WidgetsFactory:

View File

@ -1,17 +1,14 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import utils.util as util
import utils.ui as util_ui
import os
import platform
import subprocess
import urllib
from PyQt5 import QtCore, QtNetwork
import utils.ui as util_ui
import utils.util as util
from PyQt5 import QtNetwork, QtCore
import subprocess
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)
log = lambda x: LOG.info(x)

View File

@ -1,5 +1,4 @@
import os.path
from utils.util import get_profile_name_from_path, join_path

View File

@ -1,13 +1,13 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import utils.util as util
import os
import utils.util as util
from user_data.settings import Settings
from common.event import Event
from user_data.settings import Settings, get_user_config_path
from user_data.settings import get_user_config_path
global LOG
import logging
LOG = logging.getLogger('app.'+__name__)

View File

@ -1,22 +1,20 @@
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
import json
import os
from platform import system
import json
from pprint import pprint
import wrapper_tests.support_testing as ts
import user_data
from utils.util import *
from utils.util import log, join_path
from common.event import Event
import utils.ui as util_ui
import utils.util as util_utils
from common.event import Event
from utils.util import *
from utils.util import join_path, log
import user_data
import wrapper_tests.support_testing as ts
global LOG
import logging
LOG = logging.getLogger('settings')
def merge_args_into_settings(args, settings):

View File

@ -1,5 +1,4 @@
from PyQt5 import QtWidgets
import utils.util as util