Added MOTD for server (#15)

This commit is contained in:
Uriziel 2013-01-16 19:56:29 +01:00
parent 927d55f6a5
commit d6eb5259d2
5 changed files with 31 additions and 6 deletions

View File

@ -105,6 +105,8 @@ en = {
"server-port-argument" : 'server TCP port', "server-port-argument" : 'server TCP port',
"server-password-argument" : 'server password', "server-password-argument" : 'server password',
"server-isolate-room-argument" : 'should rooms be isolated?', "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 #Server errors
"unknown-command-server-error" : "Unknown command\n%s", #message "unknown-command-server-error" : "Unknown command\n%s", #message

View File

@ -77,10 +77,11 @@ class SyncClientProtocol(JSONCommandProtocol):
username = hello["username"] if hello.has_key("username") else None username = hello["username"] if hello.has_key("username") else None
roomName = hello["room"]["name"] if hello.has_key("room") else None roomName = hello["room"]["name"] if hello.has_key("room") else None
version = hello["version"] if hello.has_key("version") 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): 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): if(not username or not roomName or not version):
self.dropWithError(getMessage("en", "hello-server-error").format(hello)) self.dropWithError(getMessage("en", "hello-server-error").format(hello))
elif(version.split(".")[0:2] != syncplay.version.split(".")[0:2]): elif(version.split(".")[0:2] != syncplay.version.split(".")[0:2]):
@ -89,6 +90,8 @@ class SyncClientProtocol(JSONCommandProtocol):
self._client.setUsername(username) self._client.setUsername(username)
self._client.setRoom(roomName) self._client.setRoom(roomName)
self.logged = True self.logged = True
if(motd):
self._client.ui.showMessage(motd, True, True)
self._client.ui.showMessage(getMessage("en", "connected-successful-notification")) self._client.ui.showMessage(getMessage("en", "connected-successful-notification"))
self._client.sendFile() self._client.sendFile()
@ -283,10 +286,13 @@ class SyncServerProtocol(JSONCommandProtocol):
def sendHello(self): def sendHello(self):
hello = {} 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) room = self._factory.watcherGetRoom(self)
if(room): hello["room"] = {"name": room} if(room): hello["room"] = {"name": room}
hello["version"] = syncplay.version hello["version"] = syncplay.version
hello["motd"] = self._factory.getMotd(userIp, username, room)
self.sendMessage({"Hello": hello}) self.sendMessage({"Hello": hello})
@requireLogged @requireLogged

View File

@ -9,13 +9,17 @@ import time
from syncplay import constants from syncplay import constants
import threading import threading
from syncplay.messages import getMessage from syncplay.messages import getMessage
import codecs
import os
from string import Template
class SyncFactory(Factory): class SyncFactory(Factory):
def __init__(self, password = ''): def __init__(self, password = '', motdFilePath = None):
print getMessage("en", "welcome-server-notification").format(syncplay.version) print getMessage("en", "welcome-server-notification").format(syncplay.version)
if(password): if(password):
password = hashlib.md5(password).hexdigest() password = hashlib.md5(password).hexdigest()
self.password = password self.password = password
self._motdFilePath = motdFilePath
self._rooms = {} self._rooms = {}
self._roomStates = {} self._roomStates = {}
self._roomUpdate = threading.RLock() self._roomUpdate = threading.RLock()
@ -83,6 +87,18 @@ class SyncFactory(Factory):
position += timePassedSinceSet position += timePassedSinceSet
return paused, position 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): def sendState(self, watcherProtocol, doSeek = False, senderLatency = 0, forcedUpdate = False):
watcher = self.getWatcher(watcherProtocol) watcher = self.getWatcher(watcherProtocol)
if(not watcher): if(not watcher):

View File

@ -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('--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('--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('--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"))

View File

@ -9,7 +9,7 @@ from syncplay.ui.ConfigurationGetter import ServerConfigurationGetter
argsGetter = ServerConfigurationGetter() argsGetter = ServerConfigurationGetter()
args = argsGetter.getConfiguration() args = argsGetter.getConfiguration()
if(not args.isolate_rooms): 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: else:
reactor.listenTCP(int(args.port), SyncIsolatedFactory(args.password)) reactor.listenTCP(int(args.port), SyncIsolatedFactory(args.password, args.motd_file))
reactor.run() reactor.run()