diff --git a/syncplay/messages.py b/syncplay/messages.py index 92f91f5..6eff284 100644 --- a/syncplay/messages.py +++ b/syncplay/messages.py @@ -105,6 +105,8 @@ en = { "server-port-argument" : 'server TCP port', "server-password-argument" : 'server password', "server-isolate-room-argument" : 'should rooms be isolated?', + "server-motd-argument": "path to file from which motd will be fetched", + "server-messed-up-motd": "Message of the Day has unescaped placeholders. All $ signs should be doubled ($$).", #Server errors "unknown-command-server-error" : "Unknown command\n%s", #message diff --git a/syncplay/protocols.py b/syncplay/protocols.py index 9c688af..bd8a51a 100644 --- a/syncplay/protocols.py +++ b/syncplay/protocols.py @@ -77,10 +77,11 @@ class SyncClientProtocol(JSONCommandProtocol): username = hello["username"] if hello.has_key("username") else None roomName = hello["room"]["name"] if hello.has_key("room") else None version = hello["version"] if hello.has_key("version") else None - return username, roomName, version + motd = hello["motd"] if hello.has_key("motd") else None + return username, roomName, version, motd def handleHello(self, hello): - username, roomName, version = self._extractHelloArguments(hello) + username, roomName, version, motd = self._extractHelloArguments(hello) if(not username or not roomName or not version): self.dropWithError(getMessage("en", "hello-server-error").format(hello)) elif(version.split(".")[0:2] != syncplay.version.split(".")[0:2]): @@ -89,6 +90,8 @@ class SyncClientProtocol(JSONCommandProtocol): self._client.setUsername(username) self._client.setRoom(roomName) self.logged = True + if(motd): + self._client.ui.showMessage(motd, True, True) self._client.ui.showMessage(getMessage("en", "connected-successful-notification")) self._client.sendFile() @@ -283,10 +286,13 @@ class SyncServerProtocol(JSONCommandProtocol): def sendHello(self): hello = {} - hello["username"] = self._factory.watcherGetUsername(self) + username = self._factory.watcherGetUsername(self) + hello["username"] = username + userIp = self.transport.getPeer().host room = self._factory.watcherGetRoom(self) if(room): hello["room"] = {"name": room} hello["version"] = syncplay.version + hello["motd"] = self._factory.getMotd(userIp, username, room) self.sendMessage({"Hello": hello}) @requireLogged diff --git a/syncplay/server.py b/syncplay/server.py index 6b829b5..c1b435d 100644 --- a/syncplay/server.py +++ b/syncplay/server.py @@ -9,13 +9,17 @@ import time from syncplay import constants import threading from syncplay.messages import getMessage +import codecs +import os +from string import Template class SyncFactory(Factory): - def __init__(self, password = ''): + def __init__(self, password = '', motdFilePath = None): print getMessage("en", "welcome-server-notification").format(syncplay.version) if(password): password = hashlib.md5(password).hexdigest() self.password = password + self._motdFilePath = motdFilePath self._rooms = {} self._roomStates = {} self._roomUpdate = threading.RLock() @@ -83,6 +87,18 @@ class SyncFactory(Factory): position += timePassedSinceSet return paused, position + def getMotd(self, userIp, username, room): + if(self._motdFilePath and os.path.isfile(self._motdFilePath)): + tmpl = codecs.open(self._motdFilePath, "r", "utf-8-sig").read() + args = dict(version=syncplay.version, userIp=userIp, username=username, room=room) + try: + return Template(tmpl).substitute(args) + except ValueError: + print getMessage("en", "server-messed-up-motd") + return "" + else: + return "" + def sendState(self, watcherProtocol, doSeek = False, senderLatency = 0, forcedUpdate = False): watcher = self.getWatcher(watcherProtocol) if(not watcher): diff --git a/syncplay/ui/ConfigurationGetter.py b/syncplay/ui/ConfigurationGetter.py index 2ab01ff..bdfd499 100644 --- a/syncplay/ui/ConfigurationGetter.py +++ b/syncplay/ui/ConfigurationGetter.py @@ -206,3 +206,4 @@ class ServerConfigurationGetter(object): self._argparser.add_argument('--port', metavar='port', type=str, nargs='?', help=getMessage("en", "server-port-argument")) self._argparser.add_argument('--password', metavar='password', type=str, nargs='?', help=getMessage("en", "server-password-argument")) self._argparser.add_argument('--isolate-rooms', action='store_true', help=getMessage("en", "server-isolate-room-argument")) + self._argparser.add_argument('--motd-file', metavar='motd', type=str, nargs='?', help=getMessage("en", "server-motd-argument")) diff --git a/syncplayServer.py b/syncplayServer.py index 9c44f3c..94becb6 100644 --- a/syncplayServer.py +++ b/syncplayServer.py @@ -9,7 +9,7 @@ from syncplay.ui.ConfigurationGetter import ServerConfigurationGetter argsGetter = ServerConfigurationGetter() args = argsGetter.getConfiguration() if(not args.isolate_rooms): - reactor.listenTCP(int(args.port), SyncFactory(args.password)) + reactor.listenTCP(int(args.port), SyncFactory(args.password, args.motd_file)) else: - reactor.listenTCP(int(args.port), SyncIsolatedFactory(args.password)) + reactor.listenTCP(int(args.port), SyncIsolatedFactory(args.password, args.motd_file)) reactor.run()