Add discoverable rooms to desktop lobby
This commit is contained in:
+43
-1
@@ -1,10 +1,12 @@
|
||||
import sys
|
||||
import os
|
||||
import ctypes
|
||||
import json
|
||||
from PyQt6.QtWidgets import (
|
||||
QApplication, QMainWindow, QStackedWidget, QFileDialog, QMessageBox
|
||||
)
|
||||
from PyQt6.QtCore import Qt, QTimer, QSettings
|
||||
from PyQt6.QtCore import Qt, QTimer, QSettings, QUrl
|
||||
from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
|
||||
from PyQt6.QtGui import QIcon
|
||||
|
||||
from sync_client import SyncClientThread
|
||||
@@ -79,6 +81,40 @@ class VlcSyncApp(QMainWindow):
|
||||
self.lobby_widget.file_selected.connect(self._remember_media_folder)
|
||||
self.room_widget.volume_slider.valueChanged.connect(
|
||||
lambda volume: self.settings.setValue("volume", volume))
|
||||
self.discovery_network = QNetworkAccessManager(self)
|
||||
self.discovery_reply = None
|
||||
self.discovery_timer = QTimer(self)
|
||||
self.discovery_timer.setInterval(15000)
|
||||
self.discovery_timer.timeout.connect(self.refresh_sessions)
|
||||
self.lobby_widget.refresh_requested.connect(self.refresh_sessions)
|
||||
self.discovery_timer.start()
|
||||
QTimer.singleShot(0, self.refresh_sessions)
|
||||
|
||||
def refresh_sessions(self):
|
||||
if self.stacked_widget.currentIndex() != 0 or self.discovery_reply is not None:
|
||||
return
|
||||
url = self.sync_client.url.replace("wss://", "https://").replace("ws://", "http://")
|
||||
request = QNetworkRequest(QUrl(url.rsplit("/", 1)[0] + "/api/rooms"))
|
||||
request.setTransferTimeout(8000)
|
||||
self.lobby_widget.refresh_btn.setEnabled(False)
|
||||
reply = self.discovery_network.get(request)
|
||||
self.discovery_reply = reply
|
||||
reply.finished.connect(lambda: self._finish_discovery(reply))
|
||||
|
||||
def _finish_discovery(self, reply):
|
||||
try:
|
||||
if reply.error() != QNetworkReply.NetworkError.NoError:
|
||||
raise ValueError("Discovery unavailable")
|
||||
rooms = json.loads(bytes(reply.readAll()))["rooms"]
|
||||
self.lobby_widget.update_sessions(rooms)
|
||||
except (ValueError, KeyError, TypeError, OverflowError):
|
||||
self.lobby_widget.sessions_list.clear()
|
||||
self.lobby_widget.check_inputs()
|
||||
self.lobby_widget.sessions_status.setText("Couldn’t check for sessions. You can retry or join by code.")
|
||||
finally:
|
||||
self.discovery_reply = None
|
||||
self.lobby_widget.refresh_btn.setEnabled(True)
|
||||
reply.deleteLater()
|
||||
|
||||
def _restore_preferences(self):
|
||||
self.lobby_widget.username_input.setText(self.settings.value("username", "", type=str))
|
||||
@@ -103,6 +139,9 @@ class VlcSyncApp(QMainWindow):
|
||||
self.settings.setValue("media_folder", folder)
|
||||
|
||||
def closeEvent(self, event):
|
||||
self.discovery_timer.stop()
|
||||
if self.discovery_reply is not None:
|
||||
self.discovery_reply.abort()
|
||||
room = self.room_widget
|
||||
self.settings.setValue("window_geometry", self.saveGeometry())
|
||||
width = (room.chat_container.width() if not room.popout_window and
|
||||
@@ -125,6 +164,7 @@ class VlcSyncApp(QMainWindow):
|
||||
|
||||
self.pending_connect_action = lambda: self.sync_client.send_message({
|
||||
"type": "create_room",
|
||||
"listed": self.lobby_widget.listed_checkbox.isChecked(),
|
||||
"username": self.username,
|
||||
"fileInfo": {
|
||||
"name": self.local_file_name,
|
||||
@@ -159,6 +199,8 @@ class VlcSyncApp(QMainWindow):
|
||||
self.lobby_widget.clear_file()
|
||||
self.lobby_widget.reset_ui()
|
||||
|
||||
self.refresh_sessions()
|
||||
|
||||
def _on_room_sync_action(self, action, position_s, req_id):
|
||||
self.sync_client.send_message({"type": "sync", "action": action, "position": position_s, "req_id": req_id})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user