From 64d78637a5bc52fd0aadcace13f9e4a29c022217 Mon Sep 17 00:00:00 2001 From: Et0h Date: Wed, 15 Oct 2014 00:53:12 +0100 Subject: [PATCH] Improve controller UI code --- syncplay/client.py | 41 +++++++++++++++++++++++++--------------- syncplay/protocols.py | 7 ++++--- syncplay/server.py | 10 +++++----- syncplay/ui/consoleUI.py | 5 ++++- syncplay/ui/gui.py | 29 ++++++++++++++++------------ syncplay/utils.py | 1 + 6 files changed, 57 insertions(+), 36 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index 2833fe0..8854850 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -417,27 +417,29 @@ class SyncplayClient(object): def createControlledRoom(self): controlPassword = RoomPasswordGenerator.generate_password() - self.ui.showMessage("Attempting to create controlled room suffix with password '{}'...".format(controlPassword)) + self.ui.showMessage(u"Attempting to create controlled room suffix with password '{}'...".format(controlPassword)) self._protocol.requestControlledRoom(controlPassword) def controlledRoomCreated(self, controlPassword, roomName): - self.ui.showMessage("Created controlled room suffix '{}' with password '{}'. Please save this information for future reference!".format(roomName, controlPassword)) + self.ui.showMessage(u"Created controlled room suffix '{}' with password '{}'. Please save this information for future reference!".format(roomName, controlPassword)) self.setRoom(roomName) self.sendRoom() self._protocol.requestControlledRoom(controlPassword) self.ui.updateRoomName(roomName) def identifyAsController(self, controlPassword): - self.ui.showMessage("Identifying as room controller with password '{}'...".format(controlPassword)) + self.ui.showMessage(u"Identifying as room controller with password '{}'...".format(controlPassword)) self._protocol.requestControlledRoom(controlPassword) - def controllerIdentificationError(self, username): - self.ui.showErrorMessage("<{}> failed to identify as a room controller.".format(username)) + def controllerIdentificationError(self, username, room): + self.ui.showErrorMessage(u"<{}> failed to identify as a room controller.".format(username)) - def controllerIdentificationSuccess(self, username): + def controllerIdentificationSuccess(self, username, roomname): self.userlist.setUserAsController(username) - # TODO: More UI stuff - self.ui.showErrorMessage("<{}> authenticated as a room controller".format(username)) + self.ui.setControllerStatus(username, isController=True) + if self.userlist.isRoomSame(roomname): + hideFromOSD = not constants.SHOW_SAME_ROOM_OSD + self.ui.showMessage(u"<{}> authenticated as a room controller".format(username), hideFromOSD) # TODO: Mark person as a room controller # TODO: Disable UI's "Create new Controlled Room when in Controlled Room" @@ -522,8 +524,8 @@ class SyncplayUser(object): else: return "{}".format(self.username) - def setAsController(self): - self._controller = True + def setControllerStatus(self, isController): + self._controller = isController def isController(self): return self._controller @@ -574,12 +576,14 @@ class SyncplayUserlist(object): message = getMessage("file-differences-notification") + ", ".join(differences) self.ui.showMessage(message, not constants.SHOW_OSD_WARNINGS) - def addUser(self, username, room, file_, noMessage=False, isController=False): + def addUser(self, username, room, file_, noMessage=False, isController=None): if username == self.currentUser.username: + if isController is not None: + self.currentUser.setControllerStatus(isController) return user = SyncplayUser(username, room, file_) - if isController: - user.setAsController() + if isController is not None: + user.setControllerStatus(isController) self._users[username] = user if not noMessage: self.__showUserChangeMessage(username, room, file_) @@ -610,6 +614,8 @@ class SyncplayUserlist(object): if self._users.has_key(username): user = self._users[username] oldRoom = user.room if user.room else None + if user.room != room: + user.setControllerStatus(isController=False) self.__displayModUserMessage(username, room, file_, user, oldRoom) user.room = room if file_: @@ -621,9 +627,11 @@ class SyncplayUserlist(object): self.userListChange() def setUserAsController(self, username): - if self._users.has_key(username): + if self.currentUser.username == username: + self.currentUser.setControllerStatus(True) + elif self._users.has_key(username): user = self._users[username] - user.setAsController() + user.setControllerStatus(True) def areAllFilesInRoomSame(self): for user in self._users.itervalues(): @@ -691,6 +699,9 @@ class UiManager(object): if constants.SHOW_OSD and self._client._player: self._client._player.displayMessage(message, duration * 1000) + def setControllerStatus(self, username, isController): + self.__ui.setControllerStatus(username, isController) + def showErrorMessage(self, message, criticalerror=False): if message <> self.lastError: # Avoid double call bug self.lastError = message diff --git a/syncplay/protocols.py b/syncplay/protocols.py index 36d15b8..2fa8cdf 100644 --- a/syncplay/protocols.py +++ b/syncplay/protocols.py @@ -120,9 +120,9 @@ class SyncClientProtocol(JSONCommandProtocol): self._SetUser(values) elif command == "controllerAuth": if values['success']: - self._client.controllerIdentificationSuccess(values["user"]) + self._client.controllerIdentificationSuccess(values["user"], values["room"]) else: - self._client.controllerIdentificationError(values["user"]) + self._client.controllerIdentificationError(values["user"], values["room"]) elif command == "newControlledRoom": controlPassword = values['password'] roomName = values['roomName'] @@ -338,10 +338,11 @@ class SyncServerProtocol(JSONCommandProtocol): } }) - def sendControlledRoomAuthStatus(self, success, username): + def sendControlledRoomAuthStatus(self, success, username, roomname): self.sendSet({ "controllerAuth": { "user": username, + "room": roomname, "success": success } }) diff --git a/syncplay/server.py b/syncplay/server.py index 2d79067..4b1699a 100644 --- a/syncplay/server.py +++ b/syncplay/server.py @@ -71,7 +71,7 @@ class SyncFactory(Factory): self.sendRoomSwitchMessage(watcher) if RoomPasswordProvider.isControlledRoom(roomName): for controller in watcher.getRoom().getControllers(): - watcher.sendControlledRoomAuthStatus(True, controller) + watcher.sendControlledRoomAuthStatus(True, controller, roomName) def sendRoomSwitchMessage(self, watcher): l = lambda w: w.sendSetting(watcher.getName(), watcher.getRoom(), None, None) @@ -115,12 +115,12 @@ class SyncFactory(Factory): success = RoomPasswordProvider.check(room.getName(), password, self._salt) if success: watcher.getRoom().addController(watcher) - self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(success, watcher.getName())) + self._roomManager.broadcast(watcher, lambda w: w.sendControlledRoomAuthStatus(success, watcher.getName(), room._name)) except NotControlledRoom: newName = RoomPasswordProvider.getControlledRoomName(room.getName(), password, self._salt) watcher.sendNewControlledRoom(newName, password) except ValueError: - self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName())) + self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name)) class RoomManager(object): @@ -346,8 +346,8 @@ class Watcher(object): def sendNewControlledRoom(self, roomName, password): self._connector.sendNewControlledRoom(roomName, password) - def sendControlledRoomAuthStatus(self, success, username): - self._connector.sendControlledRoomAuthStatus(success, username) + def sendControlledRoomAuthStatus(self, success, username, room): + self._connector.sendControlledRoomAuthStatus(success, username, room) def __lt__(self, b): if self.getPosition() is None or self._file is None: diff --git a/syncplay/ui/consoleUI.py b/syncplay/ui/consoleUI.py index 57a5981..c7d10e3 100644 --- a/syncplay/ui/consoleUI.py +++ b/syncplay/ui/consoleUI.py @@ -39,6 +39,9 @@ class ConsoleUI(threading.Thread): def updateRoomName(self, room=""): pass + def setControllerStatus(self, username, isController): + pass + def promptFor(self, prompt=">", message=""): if message <> "": print(message) @@ -77,7 +80,7 @@ class ConsoleUI(threading.Thread): def showDebugMessage(self, message): print(message) - + def showErrorMessage(self, message, criticalerror = False): print("ERROR:\t" + message) diff --git a/syncplay/ui/gui.py b/syncplay/ui/gui.py index 41bee36..2c1f718 100644 --- a/syncplay/ui/gui.py +++ b/syncplay/ui/gui.py @@ -6,7 +6,7 @@ import sys import time import re import os -from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration +from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider class UserlistItemDelegate(QtGui.QStyledItemDelegate): def __init__(self): @@ -79,6 +79,19 @@ class MainWindow(QtGui.QMainWindow): # TODO: Prompt user return None + def setControllerStatus(self, username, isController): + roomtocheck = 0 + while self.listTreeModel.item(roomtocheck): + itemtocheck = 0 + while self.listTreeModel.item(roomtocheck).child(itemtocheck): + item = self.listTreeModel.item(roomtocheck).child(itemtocheck) + if item.data(0) == username: + item.setData(isController, Qt.UserRole + constants.USERITEM_CONTROLLER_ROLE) + return + itemtocheck = itemtocheck + 1 + roomtocheck += 1 + self.listTreeView.resizeColumnToContents(True) + def showMessage(self, message, noTimestamp=False): message = unicode(message) message = message.replace("&", "&").replace('"', """).replace("<", "<").replace(">", ">") @@ -107,21 +120,13 @@ class MainWindow(QtGui.QMainWindow): roomitem.setFlags(roomitem.flags() & ~Qt.ItemIsEditable) blankitem.setFlags(blankitem.flags() & ~Qt.ItemIsEditable) usertreeRoot.appendRow((roomitem, blankitem)) - #usercounter = 0 # UNCOMMENT FOR DEMONSTRATION for user in rooms[room]: useritem = QtGui.QStandardItem(user.username) - '''# UNCOMMENT FOR DEMONSTRATION - usercounter = usercounter + 1 - - if usercounter == 1: - useritem.setData(True, Qt.UserRole + constants.USERITEM_CONTROLLER_ROLE) - useritem.setData(True, Qt.UserRole + constants.USERITEM_READY_ROLE) - if usercounter == 2: - useritem.setData(False, Qt.UserRole + constants.USERITEM_READY_ROLE)l''' + isController = user.isController() + useritem.setData(isController, Qt.UserRole + constants.USERITEM_CONTROLLER_ROLE) if user.file: - fileitem = QtGui.QStandardItem( - u"{} ({})".format(user.file['name'], formatTime(user.file['duration']))) + fileitem = QtGui.QStandardItem(u"{} ({})".format(user.file['name'], formatTime(user.file['duration']))) if currentUser.file: sameName = sameFilename(user.file['name'], currentUser.file['name']) sameSize = sameFilesize(user.file['size'], currentUser.file['size']) diff --git a/syncplay/utils.py b/syncplay/utils.py index cfd6eca..16debcf 100644 --- a/syncplay/utils.py +++ b/syncplay/utils.py @@ -209,6 +209,7 @@ class RoomPasswordProvider(object): @staticmethod def _computeRoomHash(roomName, password, salt): + roomName = roomName.encode('utf8') salt = hashlib.sha256(salt).hexdigest() provisionalHash = hashlib.sha256(roomName + salt).hexdigest() return hashlib.sha1(provisionalHash + salt + password).hexdigest()[:12].upper()