Added 'readiness' toggle to protocols and console UI
This commit is contained in:
parent
a635aca2da
commit
db91c348a4
@ -459,6 +459,17 @@ class SyncplayClient(object):
|
|||||||
if promptForAction:
|
if promptForAction:
|
||||||
self.ui.promptFor(getMessage("enter-to-exit-prompt"))
|
self.ui.promptFor(getMessage("enter-to-exit-prompt"))
|
||||||
|
|
||||||
|
def toggleReady(self):
|
||||||
|
self._protocol.setReady(not self.userlist.currentUser.isReady())
|
||||||
|
|
||||||
|
def setReady(self, username, isReady):
|
||||||
|
self.userlist.setReady(username, isReady)
|
||||||
|
if isReady:
|
||||||
|
message = "<{}> I'm ready".format(username)
|
||||||
|
else:
|
||||||
|
message = "<{}> I'm not ready".format(username)
|
||||||
|
self.ui.showMessage(message)
|
||||||
|
|
||||||
def requireMinServerVersion(minVersion):
|
def requireMinServerVersion(minVersion):
|
||||||
def requireMinVersionDecorator(f):
|
def requireMinVersionDecorator(f):
|
||||||
@wraps(f)
|
@wraps(f)
|
||||||
@ -523,17 +534,17 @@ class SyncplayClient(object):
|
|||||||
self._userlist = userlist
|
self._userlist = userlist
|
||||||
self._ui = ui
|
self._ui = ui
|
||||||
self._warnings = {
|
self._warnings = {
|
||||||
"room-files-not-same": {
|
"room-files-not-same": {
|
||||||
"timer": task.LoopingCall(self.__displayMessageOnOSD,
|
"timer": task.LoopingCall(self.__displayMessageOnOSD,
|
||||||
"room-files-not-same",),
|
"room-files-not-same", ),
|
||||||
"displayedFor": 0,
|
"displayedFor": 0,
|
||||||
},
|
},
|
||||||
"alone-in-the-room": {
|
"alone-in-the-room": {
|
||||||
"timer": task.LoopingCall(self.__displayMessageOnOSD,
|
"timer": task.LoopingCall(self.__displayMessageOnOSD,
|
||||||
"alone-in-the-room",),
|
"alone-in-the-room", ),
|
||||||
"displayedFor": 0,
|
"displayedFor": 0,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
def checkWarnings(self):
|
def checkWarnings(self):
|
||||||
self._checkIfYouReAloneInTheRoom()
|
self._checkIfYouReAloneInTheRoom()
|
||||||
self._checkRoomForSameFiles()
|
self._checkRoomForSameFiles()
|
||||||
@ -566,6 +577,7 @@ class SyncplayClient(object):
|
|||||||
|
|
||||||
class SyncplayUser(object):
|
class SyncplayUser(object):
|
||||||
def __init__(self, username=None, room=None, file_=None):
|
def __init__(self, username=None, room=None, file_=None):
|
||||||
|
self.ready = False
|
||||||
self.username = username
|
self.username = username
|
||||||
self.room = room
|
self.room = room
|
||||||
self.file = file_
|
self.file = file_
|
||||||
@ -573,10 +585,10 @@ class SyncplayUser(object):
|
|||||||
|
|
||||||
def setFile(self, filename, duration, size):
|
def setFile(self, filename, duration, size):
|
||||||
file_ = {
|
file_ = {
|
||||||
"name": filename,
|
"name": filename,
|
||||||
"duration": duration,
|
"duration": duration,
|
||||||
"size":size
|
"size": size
|
||||||
}
|
}
|
||||||
self.file = file_
|
self.file = file_
|
||||||
|
|
||||||
def isFileSame(self, file_):
|
def isFileSame(self, file_):
|
||||||
@ -611,6 +623,12 @@ class SyncplayUser(object):
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def isReady(self):
|
||||||
|
return self.ready
|
||||||
|
|
||||||
|
def setReady(self, ready):
|
||||||
|
self.ready = ready
|
||||||
|
|
||||||
class SyncplayUserlist(object):
|
class SyncplayUserlist(object):
|
||||||
def __init__(self, ui, client):
|
def __init__(self, ui, client):
|
||||||
self.currentUser = SyncplayUser()
|
self.currentUser = SyncplayUser()
|
||||||
@ -659,15 +677,18 @@ class SyncplayUserlist(object):
|
|||||||
message = getMessage("file-differences-notification") + ", ".join(differences)
|
message = getMessage("file-differences-notification") + ", ".join(differences)
|
||||||
self.ui.showMessage(message, hideFromOSD)
|
self.ui.showMessage(message, hideFromOSD)
|
||||||
|
|
||||||
def addUser(self, username, room, file_, noMessage=False, isController=None):
|
def addUser(self, username, room, file_, noMessage=False, isController=None, isReady=False):
|
||||||
if username == self.currentUser.username:
|
if username == self.currentUser.username:
|
||||||
if isController is not None:
|
if isController is not None:
|
||||||
self.currentUser.setControllerStatus(isController)
|
self.currentUser.setControllerStatus(isController)
|
||||||
|
self.currentUser.setReady(isReady)
|
||||||
return
|
return
|
||||||
user = SyncplayUser(username, room, file_)
|
user = SyncplayUser(username, room, file_)
|
||||||
if isController is not None:
|
if isController is not None:
|
||||||
user.setControllerStatus(isController)
|
user.setControllerStatus(isController)
|
||||||
self._users[username] = user
|
self._users[username] = user
|
||||||
|
user.setReady(isReady)
|
||||||
|
|
||||||
if not noMessage:
|
if not noMessage:
|
||||||
self.__showUserChangeMessage(username, room, file_)
|
self.__showUserChangeMessage(username, room, file_)
|
||||||
self.userListChange(room)
|
self.userListChange(room)
|
||||||
@ -744,6 +765,12 @@ class SyncplayUserlist(object):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def setReady(self, username, isReady):
|
||||||
|
if self.currentUser.username == username:
|
||||||
|
self.currentUser.setReady(isReady)
|
||||||
|
elif self._users.has_key(username):
|
||||||
|
self._users[username].setReady(isReady)
|
||||||
|
|
||||||
def userListChange(self, room = None):
|
def userListChange(self, room = None):
|
||||||
if room is not None and self.isRoomSame(room):
|
if room is not None and self.isRoomSame(room):
|
||||||
self._roomUsersChanged = True
|
self._roomUsersChanged = True
|
||||||
|
|||||||
@ -58,6 +58,7 @@ COMMANDS_ROOM = ["r", "room"]
|
|||||||
COMMANDS_HELP = ['help', 'h', '?', '/?', r'\?']
|
COMMANDS_HELP = ['help', 'h', '?', '/?', r'\?']
|
||||||
COMMANDS_CREATE = ['c','create']
|
COMMANDS_CREATE = ['c','create']
|
||||||
COMMANDS_AUTH = ['a','auth']
|
COMMANDS_AUTH = ['a','auth']
|
||||||
|
COMMANDS_READY = ['re']
|
||||||
MPC_MIN_VER = "1.6.4"
|
MPC_MIN_VER = "1.6.4"
|
||||||
VLC_MIN_VERSION = "2.0.0"
|
VLC_MIN_VERSION = "2.0.0"
|
||||||
VLC_INTERFACE_MIN_VERSION = "0.2.1"
|
VLC_INTERFACE_MIN_VERSION = "0.2.1"
|
||||||
|
|||||||
@ -136,6 +136,9 @@ class SyncClientProtocol(JSONCommandProtocol):
|
|||||||
controlPassword = values['password']
|
controlPassword = values['password']
|
||||||
roomName = values['roomName']
|
roomName = values['roomName']
|
||||||
self._client.controlledRoomCreated(roomName, controlPassword)
|
self._client.controlledRoomCreated(roomName, controlPassword)
|
||||||
|
elif command == "ready":
|
||||||
|
user, isReady = values["username"], values["isReady"]
|
||||||
|
self._client.setReady(user, isReady)
|
||||||
|
|
||||||
def sendSet(self, setting):
|
def sendSet(self, setting):
|
||||||
self.sendMessage({"Set": setting})
|
self.sendMessage({"Set": setting})
|
||||||
@ -158,7 +161,8 @@ class SyncClientProtocol(JSONCommandProtocol):
|
|||||||
userName = user[0]
|
userName = user[0]
|
||||||
file_ = user[1]['file'] if user[1]['file'] <> {} else None
|
file_ = user[1]['file'] if user[1]['file'] <> {} else None
|
||||||
isController = user[1]['controller'] if 'controller' in user[1] else False
|
isController = user[1]['controller'] if 'controller' in user[1] else False
|
||||||
self._client.userlist.addUser(userName, roomName, file_, noMessage=True, isController=isController)
|
isReady = user[1]['isReady'] if 'isReady' in user[1] else False
|
||||||
|
self._client.userlist.addUser(userName, roomName, file_, noMessage=True, isController=isController, isReady=isReady)
|
||||||
self._client.userlist.showUserList()
|
self._client.userlist.showUserList()
|
||||||
|
|
||||||
def sendList(self):
|
def sendList(self):
|
||||||
@ -234,6 +238,13 @@ class SyncClientProtocol(JSONCommandProtocol):
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def setReady(self, isReady):
|
||||||
|
self.sendSet({
|
||||||
|
"ready": {
|
||||||
|
"isReady": isReady
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
def handleError(self, error):
|
def handleError(self, error):
|
||||||
self.dropWithError(error["message"])
|
self.dropWithError(error["message"])
|
||||||
|
|
||||||
@ -342,6 +353,8 @@ class SyncServerProtocol(JSONCommandProtocol):
|
|||||||
password = set_[1]["password"] if set_[1].has_key("password") else None
|
password = set_[1]["password"] if set_[1].has_key("password") else None
|
||||||
room = set_[1]["room"] if set_[1].has_key("room") else None
|
room = set_[1]["room"] if set_[1].has_key("room") else None
|
||||||
self._factory.authRoomController(self._watcher, password, room)
|
self._factory.authRoomController(self._watcher, password, room)
|
||||||
|
elif command == "ready":
|
||||||
|
self._factory.setReady(self._watcher, set_[1]['isReady'])
|
||||||
|
|
||||||
def sendSet(self, setting):
|
def sendSet(self, setting):
|
||||||
self.sendMessage({"Set": setting})
|
self.sendMessage({"Set": setting})
|
||||||
@ -363,6 +376,15 @@ class SyncServerProtocol(JSONCommandProtocol):
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def sendSetReady(self, username, isReady):
|
||||||
|
self.sendSet({
|
||||||
|
"ready": {
|
||||||
|
"username": username,
|
||||||
|
"isReady": isReady
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
def sendUserSetting(self, username, room, file_, event):
|
def sendUserSetting(self, username, room, file_, event):
|
||||||
room = {"name": room.getName()}
|
room = {"name": room.getName()}
|
||||||
user = {username: {}}
|
user = {username: {}}
|
||||||
@ -381,7 +403,8 @@ class SyncServerProtocol(JSONCommandProtocol):
|
|||||||
userFile = {
|
userFile = {
|
||||||
"position": 0,
|
"position": 0,
|
||||||
"file": watcher.getFile() if watcher.getFile() else {},
|
"file": watcher.getFile() if watcher.getFile() else {},
|
||||||
"controller": watcher.isController()
|
"controller": watcher.isController(),
|
||||||
|
"isReady": watcher.isReady()
|
||||||
}
|
}
|
||||||
userlist[room.getName()][watcher.getName()] = userFile
|
userlist[room.getName()][watcher.getName()] = userFile
|
||||||
|
|
||||||
|
|||||||
@ -125,6 +125,9 @@ class SyncFactory(Factory):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name))
|
self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name))
|
||||||
|
|
||||||
|
def setReady(self, watcher, isReady):
|
||||||
|
watcher.setReady(isReady)
|
||||||
|
self._roomManager.broadcastRoom(watcher, lambda w: w.sendSetReady(watcher.getName(), isReady))
|
||||||
|
|
||||||
class RoomManager(object):
|
class RoomManager(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -299,6 +302,7 @@ class ControlledRoom(Room):
|
|||||||
|
|
||||||
class Watcher(object):
|
class Watcher(object):
|
||||||
def __init__(self, server, connector, name):
|
def __init__(self, server, connector, name):
|
||||||
|
self._ready = False
|
||||||
self._server = server
|
self._server = server
|
||||||
self._connector = connector
|
self._connector = connector
|
||||||
self._name = name
|
self._name = name
|
||||||
@ -322,6 +326,12 @@ class Watcher(object):
|
|||||||
self._resetStateTimer()
|
self._resetStateTimer()
|
||||||
self._askForStateUpdate(True, True)
|
self._askForStateUpdate(True, True)
|
||||||
|
|
||||||
|
def setReady(self, ready):
|
||||||
|
self._ready = ready
|
||||||
|
|
||||||
|
def isReady(self):
|
||||||
|
return self._ready
|
||||||
|
|
||||||
def getRoom(self):
|
def getRoom(self):
|
||||||
return self._room
|
return self._room
|
||||||
|
|
||||||
@ -352,6 +362,9 @@ class Watcher(object):
|
|||||||
def sendControlledRoomAuthStatus(self, success, username, room):
|
def sendControlledRoomAuthStatus(self, success, username, room):
|
||||||
self._connector.sendControlledRoomAuthStatus(success, username, room)
|
self._connector.sendControlledRoomAuthStatus(success, username, room)
|
||||||
|
|
||||||
|
def sendSetReady(self, username, isReady):
|
||||||
|
self._connector.sendSetReady(username, isReady)
|
||||||
|
|
||||||
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:
|
||||||
return False
|
return False
|
||||||
|
|||||||
@ -54,7 +54,10 @@ class ConsoleUI(threading.Thread):
|
|||||||
for user in rooms[room]:
|
for user in rooms[room]:
|
||||||
userflags = u""
|
userflags = u""
|
||||||
if user.isController():
|
if user.isController():
|
||||||
userflags = userflags + u"(Controller) "
|
userflags += u"(Controller) "
|
||||||
|
if user.isReady():
|
||||||
|
userflags += u"(Ready) "
|
||||||
|
|
||||||
username = userflags + u"*<{}>*".format(user.username) if user == currentUser else userflags + u"<{}>".format(user.username)
|
username = userflags + u"*<{}>*".format(user.username) if user == currentUser else userflags + u"<{}>".format(user.username)
|
||||||
if user.file:
|
if user.file:
|
||||||
message = u"{} is playing:".format(username)
|
message = u"{} is playing:".format(username)
|
||||||
@ -149,6 +152,8 @@ class ConsoleUI(threading.Thread):
|
|||||||
elif command.group('command') in constants.COMMANDS_AUTH:
|
elif command.group('command') in constants.COMMANDS_AUTH:
|
||||||
controlpassword = command.group('parameter')
|
controlpassword = command.group('parameter')
|
||||||
self._syncplayClient.identifyAsController(controlpassword)
|
self._syncplayClient.identifyAsController(controlpassword)
|
||||||
|
elif command.group('command') in constants.COMMANDS_READY:
|
||||||
|
self._syncplayClient.toggleReady()
|
||||||
else:
|
else:
|
||||||
if self._tryAdvancedCommands(data):
|
if self._tryAdvancedCommands(data):
|
||||||
return
|
return
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user