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):
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

View File

@ -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
}
})

View File

@ -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:

View File

@ -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)

View File

@ -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("&", "&amp;").replace('"', "&quot;").replace("<", "&lt;").replace(">", "&gt;")
@ -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'])

View File

@ -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()