@@ -2,7 +2,6 @@
import os
import shutil
import sys
import threading
import time
from PySide6 . QtCore import QProcess
@@ -172,6 +171,7 @@ class VkChatManager(QMainWindow):
self . update_channel = UPDATE_CHANNEL_DEFAULT
self . update_checker = None
self . update_thread = None
self . _update_in_progress = False
self . _update_check_silent = False
self . _bulk_worker_thread = None
self . _bulk_worker = None
@@ -463,10 +463,11 @@ class VkChatManager(QMainWindow):
self . _log_event ( " update_channel " , f " update_channel= { self . update_channel } " )
def check_for_updates ( self , silent_no_updates = False ) :
if self . update_thread and self . update_thread . is_alive ( ) :
if self . _ update_in_progress :
return
self . _update_check_silent = silent_no_updates
self . _update_in_progress = True
self . _set_update_action_state ( True )
channel_label = " бета " if self . update_channel == " beta " else " релизы "
self . status_label . setText ( f " Статус: проверка обновлений ( { channel_label } )... " )
@@ -477,15 +478,21 @@ class VkChatManager(QMainWindow):
request_timeout = UPDATE_REQUEST_TIMEOUT ,
channel = self . update_channel ,
)
self . update_thread = QThread ( self )
self . update_checker . moveToThread ( self . update_thread )
self . update_thread . started . connect ( self . update_checker . run )
self . update_checker . check_finished . connect ( self . _on_update_check_finished )
self . update_checker . check_failed . connect ( self . _on_update_check_failed )
self . update_thread = threading . Thread ( target = self . update_checker . run , daemon = True )
self . update_checker . check_finished . connect ( self . update_thread . quit )
self . update_checker . check_failed . connect ( self . update_thread . quit )
self . update_checker . check_finished . connect ( self . update_checker . deleteLater )
self . update_checker . check_failed . connect ( self . update_checker . deleteLater )
self . update_thread . finished . connect ( self . _on_update_thread_finished )
self . update_thread . finished . connect ( self . update_thread . deleteLater )
self . update_thread . start ( )
def _on_update_check_finished ( self , result ) :
self . _set_update_action_state ( False )
self . update_checker = None
self . update_thread = None
if result . get ( " has_update " ) :
latest_version = result . get ( " latest_version " ) or result . get ( " latest_tag " ) or " unknown "
@@ -499,6 +506,14 @@ class VkChatManager(QMainWindow):
f " Доступная версия: { latest_version } \n \n "
" Открыть страницу загрузки? "
)
release_notes = ( result . get ( " release_notes " ) or " " ) . strip ( )
if release_notes :
preview_lines = [ line . strip ( ) for line in release_notes . splitlines ( ) if line . strip ( ) ]
preview_text = " \n " . join ( preview_lines [ : 8 ] )
if len ( preview_lines ) > 8 :
preview_text + = " \n ... "
message_box . setInformativeText ( f " Что нового: \n { preview_text } " )
message_box . setDetailedText ( release_notes )
update_now_button = message_box . addButton ( " Обновить сейчас " , QMessageBox . ButtonRole . AcceptRole )
download_button = message_box . addButton ( " Скачать " , QMessageBox . ButtonRole . AcceptRole )
setup_button = None
@@ -538,8 +553,6 @@ class VkChatManager(QMainWindow):
def _on_update_check_failed ( self , error_text ) :
self . _set_update_action_state ( False )
self . update_checker = None
self . update_thread = None
self . _log_event ( " update_check_failed " , error_text , level = " WARN " )
if not self . update_repository_url :
self . status_label . setText ( " Статус: обновления не настроены (URL репозитория не задан). " )
@@ -556,6 +569,11 @@ class VkChatManager(QMainWindow):
if not self . _update_check_silent :
QMessageBox . warning ( self , " Проверка обновлений " , error_text )
def _on_update_thread_finished ( self ) :
self . _update_in_progress = False
self . update_checker = None
self . update_thread = None
def setup_token_timer ( self ) :
self . token_countdown_timer = QTimer ( self )
self . token_countdown_timer . timeout . connect ( self . update_token_timer_display )
@@ -975,12 +993,26 @@ class VkChatManager(QMainWindow):
self . token = token
# Сохраняем и получаем корректный expiration_time (0 или будущее время)
try :
self . token_expiration_time = token_store_save_token (
self . token ,
TOKEN_FILE ,
APP_DATA_DIR ,
expires_in = expires_in ,
)
except Exception as e :
try :
expires_value = int ( expires_in )
except ( TypeError , ValueError ) :
expires_value = 0
self . token_expiration_time = ( time . time ( ) + expires_value ) if expires_value > 0 else 0
self . _log_event ( " token_store_save " , str ( e ) , level = " WARN " )
QMessageBox . warning (
self ,
" Предупреждение " ,
" Н е удалось безопасно сохранить токен на диске. "
" Текущая сессия активна, но после перезапуска потребуется повторная авторизация. " ,
)
self . token_input . setText ( self . token [ : 50 ] + " ... " )
self . status_label . setText ( " Статус: авторизован " )