qt6 fixes
This commit is contained in:
parent
4d2d4034f9
commit
d1c8d445bc
9 changed files with 75 additions and 47 deletions
|
@ -97,7 +97,7 @@ on pypi as it is a dependency. Just download and install it from
|
|||
https://git.plastiras.org/emdee/toxygen_wrapper
|
||||
|
||||
This is being ported to Qt6 using qtpy https://github.com/spyder-ide/qtpy
|
||||
It now runs on PyQt5 and should soon run on PyQt6 and may run on PySide2 and
|
||||
It now runs on PyQt5 and should run on PyQt6, and may run on PySide2 and
|
||||
PySide6 - YMMV. You will be able to choose between them by setting the
|
||||
environment variable QT_API to one of: pyqt5 pyqt6 pyside2 pyside6.
|
||||
|
||||
|
|
5
ToDo.md
5
ToDo.md
|
@ -53,7 +53,8 @@ line.
|
|||
|
||||
## Migration
|
||||
|
||||
Migrate PyQt5 to qtpy - almost done.
|
||||
Migrate PyQt5 to qtpy - done, but I'm not sure qtpy supports PyQt6.
|
||||
https://github.com/spyder-ide/qtpy/
|
||||
|
||||
Maybe migrate gevent to asyncio, and migrate to
|
||||
[qasync](https://github.com/CabbageDevelopment/qasync)
|
||||
|
@ -65,3 +66,5 @@ Maybe migrate gevent to asyncio, and migrate to
|
|||
|
||||
There's a standard for Tox clients that this has not been tested against:
|
||||
https://tox.gitbooks.io/tox-client-standard/content/general_requirements/general_requirements.html
|
||||
https://github.com/Tox/Tox-Client-Standard
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ There's a copy of qweechat in ```thirdparty/qweechat``` backported to
|
|||
PyQt5 and integrated into toxygen. Follow the normal instructions for
|
||||
adding a ```relay``` to [weechat](https://github.com/weechat/weechat)
|
||||
```
|
||||
/relay add ipv4.ssl.weechat 9001
|
||||
/relay add ipv4.ssl.weechat 9000
|
||||
/relay start ipv4.ssl.weechat
|
||||
```
|
||||
or
|
||||
|
@ -39,27 +39,27 @@ It should now show up in the list of proxies.
|
|||
```
|
||||
|
||||
```
|
||||
/nick SyniTox
|
||||
/nick NickName
|
||||
```
|
||||
|
||||
## TLS certificates
|
||||
|
||||
[Create a Self-signed Certificate](https://www.oftc.net/NickServ/CertFP/)
|
||||
|
||||
Choose a SyniTox you will identify as.
|
||||
Choose a NickName you will identify as.
|
||||
|
||||
Create a directory for your certificates ~/.config/weechat/ssl/
|
||||
and make a subdirectory for each server ~/.config/weechat/ssl/irc.oftc.net/
|
||||
|
||||
Change to the server directory and use openssl to make a keypair and answer the questions:
|
||||
```
|
||||
openssl req -nodes -newkey rsa:2048 -keyout SyniTox.key -x509 -days 3650 -out SyniTox.cer
|
||||
chmod 400 SyniTox.key
|
||||
openssl req -nodes -newkey rsa:2048 -keyout NickName.key -x509 -days 3650 -out NickName.cer
|
||||
chmod 400 NickName.key
|
||||
```
|
||||
We now combine certificate and key to a single file SyniTox.pem
|
||||
We now combine certificate and key to a single file NickName.pem
|
||||
```
|
||||
cat SyniTox.cer SyniTox.key > SyniTox.pem
|
||||
chmod 400 SyniTox.pem
|
||||
cat NickName.cer NickName.key > NickName.pem
|
||||
chmod 400 NickName.pem
|
||||
```
|
||||
|
||||
Do this for each server you want to connect to, or just use one for all of them.
|
||||
|
@ -68,11 +68,27 @@ Do this for each server you want to connect to, or just use one for all of them.
|
|||
|
||||
The main discussion forum for Tox is the #TokTok channel on libera.
|
||||
|
||||
libera has an onion server so we can map an address in tor. Add this
|
||||
https://mox.sh/sysadmin/secure-irc-connection-to-freenode-with-tor-and-weechat/
|
||||
We have to create an account without Tor, this is a requirement to use TOR:
|
||||
Connect to irc.libera.chat without Tor and register
|
||||
```
|
||||
/msg NickServ identify NickName password
|
||||
/msg NickServ REGISTER mypassword mycoolemail@example.com
|
||||
/msg NickServ SET PRIVATE ON
|
||||
```
|
||||
Confirm registration after getting the mail with the code:
|
||||
```
|
||||
/msg NickServ VERIFY REGISTER NickName code1235678
|
||||
```
|
||||
|
||||
Libera has an onion server so we can map an address in tor. Add this
|
||||
to your /etc/tor/torrc
|
||||
```
|
||||
MapAddress palladium.libera.chat libera75jm6of4wxpxt4aynol3xjmbtxgfyjpu34ss4d7r7q2v5zrpyd.onion
|
||||
```
|
||||
Or without the MapAddress just use
|
||||
libera75jm6of4wxpxt4aynol3xjmbtxgfyjpu34ss4d7r7q2v5zrpyd.onion
|
||||
as the server address below, but set tls_verify to off.
|
||||
|
||||
Define the server in weechat
|
||||
https://www.weechat.org/files/doc/stable/weechat_user.en.html#irc_sasl_authentication
|
||||
|
@ -81,16 +97,17 @@ https://www.weechat.org/files/doc/stable/weechat_user.en.html#irc_sasl_authentic
|
|||
/server add libera palladium.libera.chat/6697 -tls -tls_verify
|
||||
/set irc.server.libera.ipv6 off
|
||||
/set irc.server.libera.proxy tor
|
||||
/set irc.server.libera.username SyniTox
|
||||
/set irc.server.libera.nicks SyniTox
|
||||
/set irc.server.libera.username NickName
|
||||
/set irc.server.libera.password password
|
||||
/set irc.server.libera.nicks NickName
|
||||
/set irc.server.libera.tls on
|
||||
/set irc.server.libera.tls_cert "${weechat_config_dir}/ssl/libera.chat/SyniTox.pem"
|
||||
/set irc.server.libera.tls_cert "${weechat_config_dir}/ssl/libera.chat/NickName.pem"
|
||||
```
|
||||
|
||||
```
|
||||
/set irc.server.libera.sasl_mechanism ecdsa-nist256p-challenge
|
||||
/set irc.server.libera.sasl_username "SyniTox"
|
||||
/set irc.server.libera.sasl_key "${weechat_config_dir}/ssl/libera.chat/SyniTox.pem"
|
||||
/set irc.server.libera.sasl_username "NickName"
|
||||
/set irc.server.libera.sasl_key "${weechat_config_dir}/ssl/libera.chat/NickName.pem"
|
||||
```
|
||||
|
||||
Disconnect and connect back to the server.
|
||||
|
@ -99,7 +116,7 @@ Disconnect and connect back to the server.
|
|||
/connect libera
|
||||
```
|
||||
|
||||
/msg nickserv identify password SyniTox
|
||||
/msg nickserv identify password NickName
|
||||
|
||||
|
||||
### oftc.net
|
||||
|
@ -113,10 +130,10 @@ Define the server in weechat
|
|||
/server add OFTC irc.oftc.net/6697 -tls -tls_verify
|
||||
/set irc.server.OFTC.ipv6 off
|
||||
/set irc.server.OFTC.proxy tor
|
||||
/set irc.server.OFTC.username SyniTox
|
||||
/set irc.server.OFTC.nicks SyniTox
|
||||
/set irc.server.OFTC.username NickName
|
||||
/set irc.server.OFTC.nicks NickName
|
||||
/set irc.server.OFTC.tls on
|
||||
/set irc.server.OFTC.tls_cert "${weechat_config_dir}/ssl/irc.oftc.chat/SyniTox.pem"
|
||||
/set irc.server.OFTC.tls_cert "${weechat_config_dir}/ssl/irc.oftc.chat/NickName.pem"
|
||||
|
||||
# Disconnect and connect back to the server.
|
||||
/disconnect OFTC
|
||||
|
@ -124,7 +141,7 @@ Define the server in weechat
|
|||
```
|
||||
You must be identified in order to validate using certs
|
||||
```
|
||||
/msg nickserv identify password SyniTox
|
||||
/msg nickserv identify password NickName
|
||||
```
|
||||
To allow NickServ to identify you based on this certificate you need
|
||||
to associate the certificate fingerprint with your nick. To do this
|
||||
|
|
|
@ -53,5 +53,5 @@ Plugin's methods MUST NOT raise exceptions.
|
|||
|
||||
# Examples
|
||||
|
||||
You can find examples in [official repo](https://github.com/toxygen-project/toxygen_plugins)
|
||||
You can find examples in [official repo](https://git.plastiras.org/emdee/toxygen_plugins)
|
||||
|
||||
|
|
|
@ -53,7 +53,8 @@ line.
|
|||
|
||||
## Migration
|
||||
|
||||
Migrate PyQt5 to qtpy - almost done.
|
||||
Migrate PyQt5 to qtpy - done, but I'm not sure qtpy supports PyQt6.
|
||||
https://github.com/spyder-ide/qtpy/
|
||||
|
||||
Maybe migrate gevent to asyncio, and migrate to
|
||||
[qasync](https://github.com/CabbageDevelopment/qasync)
|
||||
|
@ -65,3 +66,5 @@ Maybe migrate gevent to asyncio, and migrate to
|
|||
|
||||
There's a standard for Tox clients that this has not been tested against:
|
||||
https://tox.gitbooks.io/tox-client-standard/content/general_requirements/general_requirements.html
|
||||
https://github.com/Tox/Tox-Client-Standard
|
||||
|
||||
|
|
|
@ -211,7 +211,9 @@ class App:
|
|||
self._app = QtWidgets.QApplication([])
|
||||
self._load_icon()
|
||||
|
||||
if util.get_platform() == 'Linux':
|
||||
# is this still needed?
|
||||
if util.get_platform() == 'Linux' and \
|
||||
hasattr(QtCore.Qt, 'AA_X11InitThreads'):
|
||||
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)
|
||||
|
||||
self._load_base_style()
|
||||
|
|
|
@ -320,7 +320,7 @@ class AV(common.tox_save.ToxAvSave):
|
|||
name='_video_thread')
|
||||
self._video_thread.start()
|
||||
|
||||
def stop_video_thread(self):
|
||||
def stop_video_thread(self) -> None:
|
||||
if self._video_thread is None:
|
||||
return
|
||||
|
||||
|
@ -341,7 +341,7 @@ class AV(common.tox_save.ToxAvSave):
|
|||
|
||||
# Incoming chunks
|
||||
|
||||
def audio_chunk(self, samples, channels_count, rate):
|
||||
def audio_chunk(self, samples, channels_count, rate) -> None:
|
||||
"""
|
||||
Incoming chunk
|
||||
"""
|
||||
|
@ -377,7 +377,7 @@ class AV(common.tox_save.ToxAvSave):
|
|||
|
||||
# AV sending
|
||||
|
||||
def send_audio_data(self, data, count, *largs, **kwargs):
|
||||
def send_audio_data(self, data, count, *largs, **kwargs) -> None:
|
||||
pcm = data
|
||||
# :param sampling_rate: Audio sampling rate used in this frame.
|
||||
if self._toxav is None:
|
||||
|
@ -404,7 +404,7 @@ class AV(common.tox_save.ToxAvSave):
|
|||
# util_ui.tr("Error send_audio audio_send_frame"))
|
||||
pass
|
||||
|
||||
def send_audio(self):
|
||||
def send_audio(self) -> None:
|
||||
"""
|
||||
This method sends audio to friends
|
||||
"""
|
||||
|
@ -425,7 +425,7 @@ class AV(common.tox_save.ToxAvSave):
|
|||
i += 1
|
||||
sleep(0.01)
|
||||
|
||||
def send_video(self):
|
||||
def send_video(self) -> None:
|
||||
"""
|
||||
This method sends video to friends
|
||||
"""
|
||||
|
@ -466,7 +466,7 @@ class AV(common.tox_save.ToxAvSave):
|
|||
|
||||
sleep( 1.0/iFPS)
|
||||
|
||||
def convert_bgr_to_yuv(self, frame):
|
||||
def convert_bgr_to_yuv(self, frame) -> tuple:
|
||||
"""
|
||||
:param frame: input bgr frame
|
||||
:return y, u, v: y, u, v values of frame
|
||||
|
|
|
@ -54,31 +54,33 @@ class ProfileManager:
|
|||
def save_profile(self, data):
|
||||
if self._toxes.has_password():
|
||||
data = self._toxes.pass_encrypt(data)
|
||||
profile_path = self._path.replace('.json', '.tox')
|
||||
try:
|
||||
suf = f"{os.getpid()}"
|
||||
with open(self._path+suf, 'wb') as fl:
|
||||
with open(profile_path+suf, 'wb') as fl:
|
||||
fl.write(data)
|
||||
stat = os.stat(self._path+suf)
|
||||
stat = os.stat(profile_path+suf)
|
||||
if hasattr(stat, 'st_blocks'):
|
||||
assert stat.st_blocks > 0, f"Zero length file {self._path+suf}"
|
||||
os.rename(self._path+suf,self._path)
|
||||
LOG_INFO('Profile saved successfully to' +self._path)
|
||||
assert stat.st_blocks > 0, f"Zero length file {profile_path+suf}"
|
||||
os.rename(profile_path+suf,profile_path)
|
||||
LOG_INFO('Profile saved successfully to' +profile_path)
|
||||
except Exception as e:
|
||||
LOG_WARN(f"Profile save failed to {self._path}\n{e}")
|
||||
LOG_WARN(f"Profile save failed to {profile_path}\n{e}")
|
||||
|
||||
self._profile_saved_event(data)
|
||||
|
||||
def export_profile(self, settings, new_path, use_new_path):
|
||||
with open(self._path, 'rb') as fin:
|
||||
profile_path = self._path.replace('.json', '.tox')
|
||||
with open(profile_path, 'rb') as fin:
|
||||
data = fin.read()
|
||||
path = new_path + os.path.basename(self._path)
|
||||
path = new_path + os.path.basename(profile_path)
|
||||
with open(path, 'wb') as fout:
|
||||
fout.write(data)
|
||||
LOG.info('Profile exported successfully to ' +path)
|
||||
util.copy(os.path.join(self._directory, 'avatars'),
|
||||
os.path.join(new_path, 'avatars'))
|
||||
if use_new_path:
|
||||
self._path = os.path.join(new_path, os.path.basename(self._path))
|
||||
profile_path = os.path.join(new_path, os.path.basename(profile_path))
|
||||
self._directory = new_path
|
||||
settings.update_path(new_path)
|
||||
|
||||
|
|
|
@ -210,19 +210,20 @@ class Settings(dict):
|
|||
text = bytes(self._toxes.pass_encrypt(bytes(text, 'utf-8')))
|
||||
else:
|
||||
text = bytes(text, 'utf-8')
|
||||
if not self._path:
|
||||
json_path = self._path.replace('.tox', '.json')
|
||||
if not json_path:
|
||||
#?
|
||||
self._path = os.path.join(get_user_config_path(), 'toxygen.json')
|
||||
tmp = self._path + str(os.getpid())
|
||||
json_path = os.path.join(get_user_config_path(), 'toxygen.json')
|
||||
tmp = json_path + str(os.getpid())
|
||||
try:
|
||||
with open(tmp, 'wb') as fl:
|
||||
fl.write(text)
|
||||
if os.path.exists(self._path+'.bak'):
|
||||
os.remove(self._path+'.bak')
|
||||
os.rename(self._path, self._path+'.bak')
|
||||
os.rename(tmp, self._path)
|
||||
if os.path.exists(json_path+'.bak'):
|
||||
os.remove(json_path+'.bak')
|
||||
os.rename(json_path, json_path+'.bak')
|
||||
os.rename(tmp, json_path)
|
||||
except Exception as e:
|
||||
LOG.warn(f'Error saving to {self._path} ' +str(e))
|
||||
LOG.warn(f'Error saving to {json_path} ' +str(e))
|
||||
else:
|
||||
self._settings_saved_event(text)
|
||||
|
||||
|
|
Loading…
Reference in a new issue