desktop_app/app/controllers/main_controller.py
2025-10-03 23:31:46 +03:00

118 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from PySide6.QtWidgets import QStackedWidget
from PySide6.QtCore import Signal
from app.ui.views.login_view import LoginView
from app.ui.views.yobble_home_view import YobbleHomeView
from typing import Optional
from threading import Thread
import time
import asyncio
from app.core.database import get_last_login, get_session, set_last_login
# Импортируем сервис чатов
from app.core.services.chat_service import get_private_chats
class MainController(QStackedWidget):
# Сигнал для показа уведомлений из любого потока
# (message, is_error)
notification_requested = Signal(str, bool)
# Сигнал для передачи загруженных данных чата в основной поток
chats_loaded = Signal(object)
def __init__(self):
super().__init__()
self.login_view: Optional[LoginView] = None
self.yobble_home_view: Optional[YobbleHomeView] = None
self.init_app()
def init_app(self):
"""Проверяет наличие сессии для автологина."""
last_login = get_last_login()
if last_login:
session = get_session(last_login)
if session:
self.handle_login_success(last_login)
return
self.show_login()
def show_login(self):
self.login_view = LoginView(on_login=self.handle_login_success)
self.addWidget(self.login_view)
self.setCurrentWidget(self.login_view)
self.login_view.show()
def handle_login_success(self, username: str):
"""Обрабатывает успешный вход в систему."""
set_last_login(username)
session = get_session(username)
user_id = session["user_id"] if session else None
if not user_id:
self.show_login()
self.notification_requested.emit("Не удалось получить ID пользователя из сессии.", True)
return
if self.login_view:
self.login_view.close()
self.removeWidget(self.login_view)
self.login_view = None
self.yobble_home_view = YobbleHomeView(username=username, current_user_id=user_id)
# Подключаем сигналы к слотам в YobbleHomeView
self.notification_requested.connect(self.yobble_home_view.show_notification)
self.chats_loaded.connect(self.yobble_home_view.update_chat_list)
self.addWidget(self.yobble_home_view)
self.setCurrentWidget(self.yobble_home_view)
self.yobble_home_view.show()
Thread(target=self.update_data_from_server, args=(username,), daemon=True).start()
def update_data_from_server(self, username: str):
"""
В фоновом режиме обновляет данные с сервера.
"""
#time.sleep(2)
print(f"[Sync] Обновляем данные для пользователя: {username}")
if self.yobble_home_view:
print("[Sync] Запускаем предзагрузку прав доступа...")
try:
# `preload_permissions` теперь возвращает кортеж (успех, данные)
# asyncio.run() выполняет async функцию и возвращает её результат
asyncio.run(self.yobble_home_view.preload_permissions())
# Загружаем список чатов
print("[Sync] Загружаем список чатов...")
asyncio.run(self.load_chats(username))
except Exception as e:
error_message = f"Ошибка предзагрузки: {e}"
print(f"[Sync] {error_message}")
# Отправляем сигнал вместо прямого вызова
self.notification_requested.emit(error_message, True)
async def load_chats(self, username: str):
"""
Загружает список чатов для пользователя.
"""
session = get_session(username)
# print("debug session", session)
# if not session or 'access_token' not in session:
# self.notification_requested.emit("Сессия не найдена, не могу загрузить чаты.", True)
# return
token = session['access_token']
success, data = await get_private_chats(login=username, token=token, offset=0, limit=50)
if success:
# Отправляем данные в основной поток через сигнал
self.chats_loaded.emit(data)
else:
# Отправляем ошибку в основной поток через сигнал
self.notification_requested.emit(f"Не удалось загрузить чаты: {data}", True)
print("data", data)