Improve controller UI code
This commit is contained in:
parent
e88863e2ac
commit
64d78637a5
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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("&", "&").replace('"', """).replace("<", "<").replace(">", ">")
|
message = message.replace("&", "&").replace('"', """).replace("<", "<").replace(">", ">")
|
||||||
@ -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'])
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user