Improve controller UI code

This commit is contained in:
Et0h 2014-10-15 00:53:12 +01:00
parent e88863e2ac
commit 64d78637a5
6 changed files with 57 additions and 36 deletions

View File

@ -417,27 +417,29 @@ class SyncplayClient(object):
def createControlledRoom(self): def createControlledRoom(self):
controlPassword = RoomPasswordGenerator.generate_password() 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) self._protocol.requestControlledRoom(controlPassword)
def controlledRoomCreated(self, controlPassword, roomName): 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.setRoom(roomName)
self.sendRoom() self.sendRoom()
self._protocol.requestControlledRoom(controlPassword) self._protocol.requestControlledRoom(controlPassword)
self.ui.updateRoomName(roomName) self.ui.updateRoomName(roomName)
def identifyAsController(self, controlPassword): 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) self._protocol.requestControlledRoom(controlPassword)
def controllerIdentificationError(self, username): def controllerIdentificationError(self, username, room):
self.ui.showErrorMessage("<{}> failed to identify as a room controller.".format(username)) 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) self.userlist.setUserAsController(username)
# TODO: More UI stuff self.ui.setControllerStatus(username, isController=True)
self.ui.showErrorMessage("<{}> authenticated as a room controller".format(username)) 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: Mark person as a room controller
# TODO: Disable UI's "Create new Controlled Room when in Controlled Room" # TODO: Disable UI's "Create new Controlled Room when in Controlled Room"
@ -522,8 +524,8 @@ class SyncplayUser(object):
else: else:
return "{}".format(self.username) return "{}".format(self.username)
def setAsController(self): def setControllerStatus(self, isController):
self._controller = True self._controller = isController
def isController(self): def isController(self):
return self._controller return self._controller
@ -574,12 +576,14 @@ class SyncplayUserlist(object):
message = getMessage("file-differences-notification") + ", ".join(differences) message = getMessage("file-differences-notification") + ", ".join(differences)
self.ui.showMessage(message, not constants.SHOW_OSD_WARNINGS) 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 username == self.currentUser.username:
if isController is not None:
self.currentUser.setControllerStatus(isController)
return return
user = SyncplayUser(username, room, file_) user = SyncplayUser(username, room, file_)
if isController: if isController is not None:
user.setAsController() user.setControllerStatus(isController)
self._users[username] = user self._users[username] = user
if not noMessage: if not noMessage:
self.__showUserChangeMessage(username, room, file_) self.__showUserChangeMessage(username, room, file_)
@ -610,6 +614,8 @@ class SyncplayUserlist(object):
if self._users.has_key(username): if self._users.has_key(username):
user = self._users[username] user = self._users[username]
oldRoom = user.room if user.room else None oldRoom = user.room if user.room else None
if user.room != room:
user.setControllerStatus(isController=False)
self.__displayModUserMessage(username, room, file_, user, oldRoom) self.__displayModUserMessage(username, room, file_, user, oldRoom)
user.room = room user.room = room
if file_: if file_:
@ -621,9 +627,11 @@ class SyncplayUserlist(object):
self.userListChange() self.userListChange()
def setUserAsController(self, username): 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 = self._users[username]
user.setAsController() user.setControllerStatus(True)
def areAllFilesInRoomSame(self): def areAllFilesInRoomSame(self):
for user in self._users.itervalues(): for user in self._users.itervalues():
@ -691,6 +699,9 @@ class UiManager(object):
if constants.SHOW_OSD and self._client._player: if constants.SHOW_OSD and self._client._player:
self._client._player.displayMessage(message, duration * 1000) self._client._player.displayMessage(message, duration * 1000)
def setControllerStatus(self, username, isController):
self.__ui.setControllerStatus(username, isController)
def showErrorMessage(self, message, criticalerror=False): def showErrorMessage(self, message, criticalerror=False):
if message <> self.lastError: # Avoid double call bug if message <> self.lastError: # Avoid double call bug
self.lastError = message self.lastError = message

View File

@ -120,9 +120,9 @@ class SyncClientProtocol(JSONCommandProtocol):
self._SetUser(values) self._SetUser(values)
elif command == "controllerAuth": elif command == "controllerAuth":
if values['success']: if values['success']:
self._client.controllerIdentificationSuccess(values["user"]) self._client.controllerIdentificationSuccess(values["user"], values["room"])
else: else:
self._client.controllerIdentificationError(values["user"]) self._client.controllerIdentificationError(values["user"], values["room"])
elif command == "newControlledRoom": elif command == "newControlledRoom":
controlPassword = values['password'] controlPassword = values['password']
roomName = values['roomName'] roomName = values['roomName']
@ -338,10 +338,11 @@ class SyncServerProtocol(JSONCommandProtocol):
} }
}) })
def sendControlledRoomAuthStatus(self, success, username): def sendControlledRoomAuthStatus(self, success, username, roomname):
self.sendSet({ self.sendSet({
"controllerAuth": { "controllerAuth": {
"user": username, "user": username,
"room": roomname,
"success": success "success": success
} }
}) })

View File

@ -71,7 +71,7 @@ class SyncFactory(Factory):
self.sendRoomSwitchMessage(watcher) self.sendRoomSwitchMessage(watcher)
if RoomPasswordProvider.isControlledRoom(roomName): if RoomPasswordProvider.isControlledRoom(roomName):
for controller in watcher.getRoom().getControllers(): for controller in watcher.getRoom().getControllers():
watcher.sendControlledRoomAuthStatus(True, controller) watcher.sendControlledRoomAuthStatus(True, controller, roomName)
def sendRoomSwitchMessage(self, watcher): def sendRoomSwitchMessage(self, watcher):
l = lambda w: w.sendSetting(watcher.getName(), watcher.getRoom(), None, None) 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) success = RoomPasswordProvider.check(room.getName(), password, self._salt)
if success: if success:
watcher.getRoom().addController(watcher) 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: except NotControlledRoom:
newName = RoomPasswordProvider.getControlledRoomName(room.getName(), password, self._salt) newName = RoomPasswordProvider.getControlledRoomName(room.getName(), password, self._salt)
watcher.sendNewControlledRoom(newName, password) watcher.sendNewControlledRoom(newName, password)
except ValueError: 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): class RoomManager(object):
@ -346,8 +346,8 @@ class Watcher(object):
def sendNewControlledRoom(self, roomName, password): def sendNewControlledRoom(self, roomName, password):
self._connector.sendNewControlledRoom(roomName, password) self._connector.sendNewControlledRoom(roomName, password)
def sendControlledRoomAuthStatus(self, success, username): def sendControlledRoomAuthStatus(self, success, username, room):
self._connector.sendControlledRoomAuthStatus(success, username) self._connector.sendControlledRoomAuthStatus(success, username, room)
def __lt__(self, b): def __lt__(self, b):
if self.getPosition() is None or self._file is None: if self.getPosition() is None or self._file is None:

View File

@ -39,6 +39,9 @@ class ConsoleUI(threading.Thread):
def updateRoomName(self, room=""): def updateRoomName(self, room=""):
pass pass
def setControllerStatus(self, username, isController):
pass
def promptFor(self, prompt=">", message=""): def promptFor(self, prompt=">", message=""):
if message <> "": if message <> "":
print(message) print(message)
@ -77,7 +80,7 @@ class ConsoleUI(threading.Thread):
def showDebugMessage(self, message): def showDebugMessage(self, message):
print(message) print(message)
def showErrorMessage(self, message, criticalerror = False): def showErrorMessage(self, message, criticalerror = False):
print("ERROR:\t" + message) print("ERROR:\t" + message)

View File

@ -6,7 +6,7 @@ import sys
import time import time
import re import re
import os import os
from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider
class UserlistItemDelegate(QtGui.QStyledItemDelegate): class UserlistItemDelegate(QtGui.QStyledItemDelegate):
def __init__(self): def __init__(self):
@ -79,6 +79,19 @@ class MainWindow(QtGui.QMainWindow):
# TODO: Prompt user # TODO: Prompt user
return None 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): def showMessage(self, message, noTimestamp=False):
message = unicode(message) message = unicode(message)
message = message.replace("&", "&amp;").replace('"', "&quot;").replace("<", "&lt;").replace(">", "&gt;") message = message.replace("&", "&amp;").replace('"', "&quot;").replace("<", "&lt;").replace(">", "&gt;")
@ -107,21 +120,13 @@ class MainWindow(QtGui.QMainWindow):
roomitem.setFlags(roomitem.flags() & ~Qt.ItemIsEditable) roomitem.setFlags(roomitem.flags() & ~Qt.ItemIsEditable)
blankitem.setFlags(blankitem.flags() & ~Qt.ItemIsEditable) blankitem.setFlags(blankitem.flags() & ~Qt.ItemIsEditable)
usertreeRoot.appendRow((roomitem, blankitem)) usertreeRoot.appendRow((roomitem, blankitem))
#usercounter = 0 # UNCOMMENT FOR DEMONSTRATION
for user in rooms[room]: for user in rooms[room]:
useritem = QtGui.QStandardItem(user.username) useritem = QtGui.QStandardItem(user.username)
'''# UNCOMMENT FOR DEMONSTRATION isController = user.isController()
usercounter = usercounter + 1 useritem.setData(isController, Qt.UserRole + constants.USERITEM_CONTROLLER_ROLE)
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'''
if user.file: if user.file:
fileitem = QtGui.QStandardItem( fileitem = QtGui.QStandardItem(u"{} ({})".format(user.file['name'], formatTime(user.file['duration'])))
u"{} ({})".format(user.file['name'], formatTime(user.file['duration'])))
if currentUser.file: if currentUser.file:
sameName = sameFilename(user.file['name'], currentUser.file['name']) sameName = sameFilename(user.file['name'], currentUser.file['name'])
sameSize = sameFilesize(user.file['size'], currentUser.file['size']) sameSize = sameFilesize(user.file['size'], currentUser.file['size'])

View File

@ -209,6 +209,7 @@ class RoomPasswordProvider(object):
@staticmethod @staticmethod
def _computeRoomHash(roomName, password, salt): def _computeRoomHash(roomName, password, salt):
roomName = roomName.encode('utf8')
salt = hashlib.sha256(salt).hexdigest() salt = hashlib.sha256(salt).hexdigest()
provisionalHash = hashlib.sha256(roomName + salt).hexdigest() provisionalHash = hashlib.sha256(roomName + salt).hexdigest()
return hashlib.sha1(provisionalHash + salt + password).hexdigest()[:12].upper() return hashlib.sha1(provisionalHash + salt + password).hexdigest()[:12].upper()