From 6444ef441f89cc25b277e5073d33f42b97ec4b56 Mon Sep 17 00:00:00 2001 From: Abhay Raizada Date: Sat, 26 Dec 2015 12:37:16 +0530 Subject: [PATCH 1/3] Implement Chat: send server, chat messages from consoleUI --- syncplay/client.py | 6 +++++- syncplay/constants.py | 1 + syncplay/messages.py | 1 + syncplay/protocols.py | 8 ++++++-- syncplay/server.py | 4 +++- syncplay/ui/consoleUI.py | 3 +++ syncplayServer.py | 3 +-- 7 files changed, 20 insertions(+), 6 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index 3d135e9..24a5cdf 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -454,7 +454,11 @@ class SyncplayClient(object): self.userlist.currentUser.room = roomName if resetAutoplay: self.resetAutoPlayState() - + + def sendChat(self,message): + if self._protocol and self._protocol.logged: + self._protocol.sendChatMessage(message) + def sendRoom(self): room = self.userlist.currentUser.room if self._protocol and self._protocol.logged and room: diff --git a/syncplay/constants.py b/syncplay/constants.py index 5cc9e6a..ca77eea 100644 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -60,6 +60,7 @@ FILENAME_STRIP_REGEX = u"[-~_\.\[\](): ]" CONTROL_PASSWORD_STRIP_REGEX = u"[^a-zA-Z0-9\-]" ROOM_NAME_STRIP_REGEX = u"^(\+)(?P.*)(:)(\w{12})$" COMMANDS_UNDO = ["u", "undo", "revert"] +COMMANDS_CHAT = ["ch","chat"] COMMANDS_LIST = ["l", "list", "users"] COMMANDS_PAUSE = ["p", "play", "pause"] COMMANDS_ROOM = ["r", "room"] diff --git a/syncplay/messages.py b/syncplay/messages.py index 7a3349b..09c0105 100755 --- a/syncplay/messages.py +++ b/syncplay/messages.py @@ -358,6 +358,7 @@ en = { "server-salt-argument" : "random string used to generate managed room passwords", "server-disable-ready-argument" : u"disable readiness feature", "server-motd-argument": "path to file from which motd will be fetched", + "server-chat-argument" : "Should chat be enabled?", "server-messed-up-motd-unescaped-placeholders": "Message of the Day has unescaped placeholders. All $ signs should be doubled ($$).", "server-messed-up-motd-too-long": "Message of the Day is too long - maximum of {} chars, {} given.", diff --git a/syncplay/protocols.py b/syncplay/protocols.py index a91d429..35cc717 100644 --- a/syncplay/protocols.py +++ b/syncplay/protocols.py @@ -22,6 +22,8 @@ class JSONCommandProtocol(LineReceiver): self.handleState(message[1]) elif command == "Error": self.handleError(message[1]) + elif command == "Chat": + self.handleChat(message[1]) else: self.dropWithError(getMessage("unknown-command-server-error").format(message[1])) # TODO: log, not drop @@ -153,7 +155,8 @@ class SyncClientProtocol(JSONCommandProtocol): def sendFileSetting(self, file_): self.sendSet({"file": file_}) self.sendList() - + def sendChatMessage(self,chatMessage): + self.sendMessage({"Chat": chatMessage}) def handleList(self, userList): self._client.userlist.clearList() for room in userList.iteritems(): @@ -326,7 +329,8 @@ class SyncServerProtocol(JSONCommandProtocol): self._factory.addWatcher(self, username, roomName) self._logged = True self.sendHello(version) - + def handleChat(self,chatMessage): + #TODO def setWatcher(self, watcher): self._watcher = watcher diff --git a/syncplay/server.py b/syncplay/server.py index 3996311..d155896 100644 --- a/syncplay/server.py +++ b/syncplay/server.py @@ -14,7 +14,7 @@ import argparse from syncplay.utils import RoomPasswordProvider, NotControlledRoom, RandomStringGenerator, meetsMinVersion class SyncFactory(Factory): - def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None, disableReady=False): + def __init__(self, password='', motdFilePath=None, isolateRooms=False, salt=None, disableReady=False,chat =False): print getMessage("welcome-server-notification").format(syncplay.version) if password: password = hashlib.md5(password).hexdigest() @@ -25,6 +25,7 @@ class SyncFactory(Factory): self._salt = salt self._motdFilePath = motdFilePath self.disableReady = disableReady + self.chat=chat if not isolateRooms: self._roomManager = RoomManager() else: @@ -441,5 +442,6 @@ class ConfigurationGetter(object): self._argparser.add_argument('--password', metavar='password', type=str, nargs='?', help=getMessage("server-password-argument")) self._argparser.add_argument('--isolate-rooms', action='store_true', help=getMessage("server-isolate-room-argument")) self._argparser.add_argument('--disable-ready', action='store_true', help=getMessage("server-disable-ready-argument")) + self._argparser.add_argument('--chat', action='store_true', help=getMessage("server-chat-argument")) self._argparser.add_argument('--salt', metavar='salt', type=str, nargs='?', help=getMessage("server-salt-argument")) self._argparser.add_argument('--motd-file', metavar='file', type=str, nargs='?', help=getMessage("server-motd-argument")) \ No newline at end of file diff --git a/syncplay/ui/consoleUI.py b/syncplay/ui/consoleUI.py index fcaf7cf..94d0dbf 100644 --- a/syncplay/ui/consoleUI.py +++ b/syncplay/ui/consoleUI.py @@ -134,6 +134,9 @@ class ConsoleUI(threading.Thread): self._syncplayClient.playerPositionBeforeLastSeek = tmp_pos elif command.group('command') in constants.COMMANDS_LIST: self._syncplayClient.getUserList() + elif command.group('command') in constants.COMMANDS_CHAT: + message= command.group('parameter') + self._syncplayClient.sendChat(message) elif command.group('command') in constants.COMMANDS_PAUSE: self._syncplayClient.setPaused(not self._syncplayClient.getPlayerPaused()) elif command.group('command') in constants.COMMANDS_ROOM: diff --git a/syncplayServer.py b/syncplayServer.py index b4456d7..aa13653 100755 --- a/syncplayServer.py +++ b/syncplayServer.py @@ -19,6 +19,5 @@ from syncplay.server import SyncFactory, ConfigurationGetter if __name__ == '__main__': argsGetter = ConfigurationGetter() args = argsGetter.getConfiguration() - - reactor.listenTCP(int(args.port), SyncFactory(args.password, args.motd_file, args.isolate_rooms, args.salt, args.disable_ready)) + reactor.listenTCP(int(args.port), SyncFactory(args.password, args.motd_file, args.isolate_rooms, args.salt, args.disable_ready,args.chat)) reactor.run() From 8a4c356747f9e778330e467d6c23f929e38e9d1c Mon Sep 17 00:00:00 2001 From: Abhay Raizada Date: Sun, 27 Dec 2015 01:02:29 +0530 Subject: [PATCH 2/3] Implement Chat: send messages between clients in a room --- syncplay/messages.py | 1 + syncplay/protocols.py | 7 ++++++- syncplay/server.py | 6 ++++++ syncplay/ui/consoleUI.py | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/syncplay/messages.py b/syncplay/messages.py index 09c0105..78d1210 100755 --- a/syncplay/messages.py +++ b/syncplay/messages.py @@ -82,6 +82,7 @@ en = { "commandlist-notification/toggle" : u"\tt - toggles whether you are ready to watch or not", "commandlist-notification/create" : "\tc [name] - create managed room using name of current room", "commandlist-notification/auth" : "\ta [password] - authenticate as room operator with operator password", + "commandlist-notification/chat" : "\tch [message] - send a chat message in a room", "syncplay-version-notification" : "Syncplay version: {}", # syncplay.version "more-info-notification" : "More info available at: {}", # projectURL diff --git a/syncplay/protocols.py b/syncplay/protocols.py index 35cc717..bcda382 100644 --- a/syncplay/protocols.py +++ b/syncplay/protocols.py @@ -241,6 +241,9 @@ class SyncClientProtocol(JSONCommandProtocol): "password": password } }) + def handleChat(self,message): + self._client.ui.showMessage(message) + #TODO def setReady(self, isReady, manuallyInitiated=True): self.sendSet({ @@ -330,7 +333,9 @@ class SyncServerProtocol(JSONCommandProtocol): self._logged = True self.sendHello(version) def handleChat(self,chatMessage): - #TODO + if self._factory.chat: + self._factory.sendChat(self._watcher,chatMessage) + def setWatcher(self, watcher): self._watcher = watcher diff --git a/syncplay/server.py b/syncplay/server.py index d155896..efaaf50 100644 --- a/syncplay/server.py +++ b/syncplay/server.py @@ -129,6 +129,9 @@ class SyncFactory(Factory): except ValueError: self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name)) + def sendChat(self,watcher,message): + self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(message)) + def setReady(self, watcher, isReady, manuallyInitiated=True): watcher.setReady(isReady) self._roomManager.broadcastRoom(watcher, lambda w: w.sendSetReady(watcher.getName(), watcher.isReady(), manuallyInitiated)) @@ -368,6 +371,9 @@ class Watcher(object): def sendControlledRoomAuthStatus(self, success, username, room): self._connector.sendControlledRoomAuthStatus(success, username, room) + def sendChatMessage(self,message): + self._connector.sendMessage({"Chat" : message}) + def sendSetReady(self, username, isReady, manuallyInitiated=True): self._connector.sendSetReady(username, isReady, manuallyInitiated) diff --git a/syncplay/ui/consoleUI.py b/syncplay/ui/consoleUI.py index 94d0dbf..1726ccd 100644 --- a/syncplay/ui/consoleUI.py +++ b/syncplay/ui/consoleUI.py @@ -175,6 +175,7 @@ class ConsoleUI(threading.Thread): self.showMessage(getMessage("commandlist-notification/toggle"), True) self.showMessage(getMessage("commandlist-notification/create"), True) self.showMessage(getMessage("commandlist-notification/auth"), True) + self.showMessage(getMessage("commandlist-notification/chat"), True) self.showMessage(getMessage("syncplay-version-notification").format(syncplay.version), True) self.showMessage(getMessage("more-info-notification").format(syncplay.projectURL), True) From 43efc4339bef75e750f6ecbe7bad1dcc43317775 Mon Sep 17 00:00:00 2001 From: Abhay Raizada Date: Thu, 31 Dec 2015 15:18:27 +0530 Subject: [PATCH 3/3] Implement Chat: Show Username in chat messages --- syncplay/protocols.py | 3 ++- syncplay/server.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/syncplay/protocols.py b/syncplay/protocols.py index bcda382..d94ceac 100644 --- a/syncplay/protocols.py +++ b/syncplay/protocols.py @@ -242,7 +242,8 @@ class SyncClientProtocol(JSONCommandProtocol): } }) def handleChat(self,message): - self._client.ui.showMessage(message) + messageString = '<'+message['username']+'>'+message['message'] + self._client.ui.showMessage(messageString) #TODO def setReady(self, isReady, manuallyInitiated=True): diff --git a/syncplay/server.py b/syncplay/server.py index efaaf50..cbe555b 100644 --- a/syncplay/server.py +++ b/syncplay/server.py @@ -130,7 +130,8 @@ class SyncFactory(Factory): self._roomManager.broadcastRoom(watcher, lambda w: w.sendControlledRoomAuthStatus(False, watcher.getName(), room._name)) def sendChat(self,watcher,message): - self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(message)) + messageDict={"message":message,"username" : watcher.getName()} + self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(messageDict)) def setReady(self, watcher, isReady, manuallyInitiated=True): watcher.setReady(isReady)