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