Make getMessage locale optional and take precedence
This commit is contained in:
parent
ec936c4e2c
commit
b6f755785f
@ -25,7 +25,7 @@ class SyncClientFactory(ClientFactory):
|
||||
|
||||
def startedConnecting(self, connector):
|
||||
destination = connector.getDestination()
|
||||
message = getMessage("en", "connection-attempt-notification").format(destination.host, destination.port)
|
||||
message = getMessage("connection-attempt-notification").format(destination.host, destination.port)
|
||||
self._client.ui.showMessage(message)
|
||||
|
||||
def clientConnectionLost(self, connector, reason):
|
||||
@ -33,16 +33,16 @@ class SyncClientFactory(ClientFactory):
|
||||
self._client.onDisconnect()
|
||||
if self._timesTried < self.retry:
|
||||
self._timesTried += 1
|
||||
self._client.ui.showMessage(getMessage("en", "reconnection-attempt-notification"))
|
||||
self._client.ui.showMessage(getMessage("reconnection-attempt-notification"))
|
||||
self.reconnecting = True
|
||||
reactor.callLater(0.1 * (2 ** self._timesTried), connector.connect)
|
||||
else:
|
||||
message = getMessage("en", "disconnection-notification")
|
||||
message = getMessage("disconnection-notification")
|
||||
self._client.ui.showErrorMessage(message)
|
||||
|
||||
def clientConnectionFailed(self, connector, reason):
|
||||
if not self.reconnecting:
|
||||
reactor.callLater(0.1, self._client.ui.showErrorMessage, getMessage("en", "connection-failed-notification"), True)
|
||||
reactor.callLater(0.1, self._client.ui.showErrorMessage, getMessage("connection-failed-notification"), True)
|
||||
reactor.callLater(0.1, self._client.stop, True)
|
||||
else:
|
||||
self.clientConnectionLost(connector, reason)
|
||||
@ -93,7 +93,7 @@ class SyncplayClient(object):
|
||||
|
||||
self._warnings = self._WarningManager(self._player, self.userlist, self.ui)
|
||||
if constants.LIST_RELATIVE_CONFIGS and self._config.has_key('loadedRelativePaths') and self._config['loadedRelativePaths']:
|
||||
self.ui.showMessage(getMessage("en", "relative-config-notification").format("; ".join(self._config['loadedRelativePaths'])), noPlayer=True, noTimestamp=True)
|
||||
self.ui.showMessage(getMessage("relative-config-notification").format("; ".join(self._config['loadedRelativePaths'])), noPlayer=True, noTimestamp=True)
|
||||
|
||||
def initProtocol(self, protocol):
|
||||
self._protocol = protocol
|
||||
@ -121,7 +121,7 @@ class SyncplayClient(object):
|
||||
def checkIfConnected(self):
|
||||
if(self._lastGlobalUpdate and self._protocol and time.time() - self._lastGlobalUpdate > constants.PROTOCOL_TIMEOUT):
|
||||
self._lastGlobalUpdate = None
|
||||
self.ui.showErrorMessage(getMessage("en", "server-timeout-error"))
|
||||
self.ui.showErrorMessage(getMessage("server-timeout-error"))
|
||||
self._protocol.drop()
|
||||
return False
|
||||
return True
|
||||
@ -167,7 +167,7 @@ class SyncplayClient(object):
|
||||
def _rewindPlayerDueToTimeDifference(self, position, setBy):
|
||||
hideFromOSD = not constants.SHOW_SAME_ROOM_OSD
|
||||
self.setPosition(position)
|
||||
self.ui.showMessage(getMessage("en", "rewind-notification").format(setBy), hideFromOSD)
|
||||
self.ui.showMessage(getMessage("rewind-notification").format(setBy), hideFromOSD)
|
||||
madeChangeOnPlayer = True
|
||||
return madeChangeOnPlayer
|
||||
|
||||
@ -175,7 +175,7 @@ class SyncplayClient(object):
|
||||
hideFromOSD = not constants.SHOW_SAME_ROOM_OSD
|
||||
self._player.setPaused(False)
|
||||
madeChangeOnPlayer = True
|
||||
self.ui.showMessage(getMessage("en", "unpause-notification").format(setBy), hideFromOSD)
|
||||
self.ui.showMessage(getMessage("unpause-notification").format(setBy), hideFromOSD)
|
||||
return madeChangeOnPlayer
|
||||
|
||||
def _serverPaused(self, setBy):
|
||||
@ -185,9 +185,9 @@ class SyncplayClient(object):
|
||||
self._player.setPaused(True)
|
||||
madeChangeOnPlayer = True
|
||||
if (self.lastLeftTime < time.time() - constants.OSD_DURATION) or (hideFromOSD == True):
|
||||
self.ui.showMessage(getMessage("en", "pause-notification").format(setBy), hideFromOSD)
|
||||
self.ui.showMessage(getMessage("pause-notification").format(setBy), hideFromOSD)
|
||||
else:
|
||||
self.ui.showMessage(getMessage("en", "left-paused-notification").format(self.lastLeftUser, setBy), hideFromOSD)
|
||||
self.ui.showMessage(getMessage("left-paused-notification").format(self.lastLeftUser, setBy), hideFromOSD)
|
||||
return madeChangeOnPlayer
|
||||
|
||||
def _serverSeeked(self, position, setBy):
|
||||
@ -198,7 +198,7 @@ class SyncplayClient(object):
|
||||
madeChangeOnPlayer = True
|
||||
else:
|
||||
madeChangeOnPlayer = False
|
||||
message = getMessage("en", "seek-notification").format(setBy, utils.formatTime(self.playerPositionBeforeLastSeek), utils.formatTime(position))
|
||||
message = getMessage("seek-notification").format(setBy, utils.formatTime(self.playerPositionBeforeLastSeek), utils.formatTime(position))
|
||||
self.ui.showMessage(message, hideFromOSD)
|
||||
return madeChangeOnPlayer
|
||||
|
||||
@ -207,11 +207,11 @@ class SyncplayClient(object):
|
||||
if(self._config['slowdownThreshold'] < diff and not self._speedChanged):
|
||||
self._player.setSpeed(constants.SLOWDOWN_RATE)
|
||||
self._speedChanged = True
|
||||
self.ui.showMessage(getMessage("en", "slowdown-notification").format(setBy), hideFromOSD)
|
||||
self.ui.showMessage(getMessage("slowdown-notification").format(setBy), hideFromOSD)
|
||||
elif(self._speedChanged and diff < constants.SLOWDOWN_RESET_THRESHOLD):
|
||||
self._player.setSpeed(1.00)
|
||||
self._speedChanged = False
|
||||
self.ui.showMessage(getMessage("en", "revert-notification"), hideFromOSD)
|
||||
self.ui.showMessage(getMessage("revert-notification"), hideFromOSD)
|
||||
madeChangeOnPlayer = True
|
||||
return madeChangeOnPlayer
|
||||
|
||||
@ -261,7 +261,7 @@ class SyncplayClient(object):
|
||||
def setUserOffset(self, time):
|
||||
self._userOffset = time
|
||||
self.setPosition(self.getGlobalPosition())
|
||||
self.ui.showMessage(getMessage("en", "current-offset-notification").format(self._userOffset))
|
||||
self.ui.showMessage(getMessage("current-offset-notification").format(self._userOffset))
|
||||
|
||||
def onDisconnect(self):
|
||||
if(self._config['pauseOnLeave']):
|
||||
@ -404,7 +404,7 @@ class SyncplayClient(object):
|
||||
self.ui.drop()
|
||||
reactor.callLater(0.1, reactor.stop)
|
||||
if(promptForAction):
|
||||
self.ui.promptFor(getMessage("en", "enter-to-exit-prompt"))
|
||||
self.ui.promptFor(getMessage("enter-to-exit-prompt"))
|
||||
|
||||
class _WarningManager(object):
|
||||
def __init__(self, player, userlist, ui):
|
||||
@ -427,7 +427,7 @@ class SyncplayClient(object):
|
||||
|
||||
def _checkRoomForSameFiles(self):
|
||||
if (not self._userlist.areAllFilesInRoomSame()):
|
||||
self._ui.showMessage(getMessage("en", "room-files-not-same"), True)
|
||||
self._ui.showMessage(getMessage("room-files-not-same"), True)
|
||||
if(constants.SHOW_OSD_WARNINGS and not self._warnings["room-files-not-same"]['timer'].running):
|
||||
self._warnings["room-files-not-same"]['timer'].start(constants.WARNING_OSD_MESSAGES_LOOP_INTERVAL, True)
|
||||
elif(self._warnings["room-files-not-same"]['timer'].running):
|
||||
@ -435,7 +435,7 @@ class SyncplayClient(object):
|
||||
|
||||
def _checkIfYouReAloneInTheRoom(self):
|
||||
if (self._userlist.areYouAloneInRoom()):
|
||||
self._ui.showMessage(getMessage("en", "alone-in-the-room"), True)
|
||||
self._ui.showMessage(getMessage("alone-in-the-room"), True)
|
||||
if(constants.SHOW_OSD_WARNINGS and not self._warnings["alone-in-the-room"]['timer'].running):
|
||||
self._warnings["alone-in-the-room"]['timer'].start(constants.WARNING_OSD_MESSAGES_LOOP_INTERVAL, True)
|
||||
elif(self._warnings["alone-in-the-room"]['timer'].running):
|
||||
@ -443,7 +443,7 @@ class SyncplayClient(object):
|
||||
|
||||
def __displayMessageOnOSD(self, warningName):
|
||||
if (constants.OSD_WARNING_MESSAGE_DURATION > self._warnings[warningName]["displayedFor"]):
|
||||
self._ui.showOSDMessage(getMessage("en", warningName), constants.WARNING_OSD_MESSAGES_LOOP_INTERVAL)
|
||||
self._ui.showOSDMessage(getMessage(warningName), constants.WARNING_OSD_MESSAGES_LOOP_INTERVAL)
|
||||
self._warnings[warningName]["displayedFor"] += constants.WARNING_OSD_MESSAGES_LOOP_INTERVAL
|
||||
else:
|
||||
self._warnings[warningName]["displayedFor"] = 0
|
||||
@ -504,16 +504,16 @@ class SyncplayUserlist(object):
|
||||
showOnOSD = constants.SHOW_DIFFERENT_ROOM_OSD
|
||||
hideFromOSD = not showOnOSD
|
||||
if(room and not file_):
|
||||
message = getMessage("en", "room-join-notification").format(username, room)
|
||||
message = getMessage("room-join-notification").format(username, room)
|
||||
self.ui.showMessage(message, hideFromOSD)
|
||||
elif (room and file_):
|
||||
duration = utils.formatTime(file_['duration'])
|
||||
message = getMessage("en", "playing-notification").format(username, file_['name'], duration)
|
||||
message = getMessage("playing-notification").format(username, file_['name'], duration)
|
||||
if(self.currentUser.room <> room or self.currentUser.username == username):
|
||||
message += getMessage("en", "playing-notification/room-addendum").format(room)
|
||||
message += getMessage("playing-notification/room-addendum").format(room)
|
||||
self.ui.showMessage(message, hideFromOSD)
|
||||
if(self.currentUser.file and not self.currentUser.isFileSame(file_) and self.currentUser.room == room):
|
||||
message = getMessage("en", "file-different-notification").format(username)
|
||||
message = getMessage("file-different-notification").format(username)
|
||||
self.ui.showMessage(message, not constants.SHOW_OSD_WARNINGS)
|
||||
differences = []
|
||||
differentName = not utils.sameFilename(self.currentUser.file['name'], file_['name'])
|
||||
@ -525,7 +525,7 @@ class SyncplayUserlist(object):
|
||||
differences.append("size")
|
||||
if(differentDuration):
|
||||
differences.append("duration")
|
||||
message = getMessage("en", "file-differences-notification") + ", ".join(differences)
|
||||
message = getMessage("file-differences-notification") + ", ".join(differences)
|
||||
self.ui.showMessage(message, not constants.SHOW_OSD_WARNINGS)
|
||||
|
||||
def addUser(self, username, room, file_, noMessage=False):
|
||||
@ -546,7 +546,7 @@ class SyncplayUserlist(object):
|
||||
hideFromOSD = not constants.SHOW_SAME_ROOM_OSD
|
||||
if(self._users.has_key(username)):
|
||||
self._users.pop(username)
|
||||
message = getMessage("en", "left-notification").format(username)
|
||||
message = getMessage("left-notification").format(username)
|
||||
self.ui.showMessage(message, hideFromOSD)
|
||||
self._client.lastLeftTime = time.time()
|
||||
self._client.lastLeftUser = username
|
||||
|
||||
@ -12,5 +12,5 @@ class SyncplayClientManager(object):
|
||||
interface.addClient(syncplayClient)
|
||||
syncplayClient.start(config['host'], config['port'])
|
||||
else:
|
||||
interface.showErrorMessage(getMessage("en", "unable-to-start-client-error"), True)
|
||||
interface.showErrorMessage(getMessage("unable-to-start-client-error"), True)
|
||||
|
||||
|
||||
@ -287,13 +287,13 @@ pl = {
|
||||
messages = {
|
||||
"en": en,
|
||||
"pl": pl,
|
||||
"current": ""
|
||||
"current": None
|
||||
}
|
||||
|
||||
def setLanguage(lang):
|
||||
messages["current"] = lang
|
||||
|
||||
def getMessage(locale, type_):
|
||||
def getMessage(type_, locale=None):
|
||||
if(constants.SHOW_BUTTON_LABELS == False):
|
||||
if("-guibuttonlabel" in type_):
|
||||
return ""
|
||||
@ -301,12 +301,12 @@ def getMessage(locale, type_):
|
||||
if("-tooltip" in type_):
|
||||
return ""
|
||||
lang = messages["current"]
|
||||
if(messages.has_key(lang)):
|
||||
if(messages[lang].has_key(type_)):
|
||||
return unicode(messages[lang][type_])
|
||||
if(messages.has_key(locale)):
|
||||
if(locale and messages.has_key(locale)):
|
||||
if(messages[locale].has_key(type_)):
|
||||
return unicode(messages[locale][type_])
|
||||
if(lang and messages.has_key(lang)):
|
||||
if(messages[lang].has_key(type_)):
|
||||
return unicode(messages[lang][type_])
|
||||
if(messages["en"].has_key(type_)):
|
||||
return unicode(messages["en"][type_])
|
||||
else:
|
||||
|
||||
@ -42,7 +42,7 @@ class MpcHcApi:
|
||||
args = "%s /slave %s" % (" ".join(args), str(self.__listener.hwnd))
|
||||
win32api.ShellExecute(0, "open", path, args, None, 1)
|
||||
if(not self.__locks.mpcStart.wait(constants.MPC_OPEN_MAX_WAIT_TIME)):
|
||||
raise self.NoSlaveDetectedException(getMessage("en", "mpc-slave-error"))
|
||||
raise self.NoSlaveDetectedException(getMessage("mpc-slave-error"))
|
||||
self.__mpcExistenceChecking.start()
|
||||
|
||||
def openFile(self, filePath):
|
||||
@ -359,12 +359,12 @@ class MPCHCAPIPlayer(BasePlayer):
|
||||
def __dropIfNotSufficientVersion(self):
|
||||
self._mpcApi.askForVersion()
|
||||
if(not self.__versionUpdate.wait(0.1) or not self._mpcApi.version):
|
||||
self.reactor.callFromThread(self.__client.ui.showErrorMessage, getMessage("en", "mpc-version-insufficient-error").format(constants.MPC_MIN_VER), True)
|
||||
self.reactor.callFromThread(self.__client.ui.showErrorMessage, getMessage("mpc-version-insufficient-error").format(constants.MPC_MIN_VER), True)
|
||||
self.reactor.callFromThread(self.__client.stop, True)
|
||||
|
||||
def __testMpcReady(self):
|
||||
if(not self.__preventAsking.wait(10)):
|
||||
raise Exception(getMessage("en", "player-file-open-error"))
|
||||
raise Exception(getMessage("player-file-open-error"))
|
||||
|
||||
def __makePing(self):
|
||||
try:
|
||||
|
||||
@ -26,8 +26,8 @@ class MplayerPlayer(BasePlayer):
|
||||
try:
|
||||
self._listener = self.__Listener(self, playerPath, filePath, args)
|
||||
except ValueError:
|
||||
self._client.ui.showMessage(getMessage("en", "mplayer-file-required-notification"))
|
||||
self._client.ui.showMessage(getMessage("en", "mplayer-file-required-notification/example"))
|
||||
self._client.ui.showMessage(getMessage("mplayer-file-required-notification"))
|
||||
self._client.ui.showMessage(getMessage("mplayer-file-required-notification/example"))
|
||||
self.drop()
|
||||
return
|
||||
self._listener.setDaemon(True)
|
||||
@ -146,7 +146,7 @@ class MplayerPlayer(BasePlayer):
|
||||
self._filenameAsk.set()
|
||||
elif name == "exiting":
|
||||
if value != 'Quit':
|
||||
self.reactor.callFromThread(self._client.ui.showErrorMessage, getMessage("en", "media-player-error").format(value), True)
|
||||
self.reactor.callFromThread(self._client.ui.showErrorMessage, getMessage("media-player-error").format(value), True)
|
||||
self.drop()
|
||||
|
||||
@staticmethod
|
||||
@ -190,7 +190,7 @@ class MplayerPlayer(BasePlayer):
|
||||
return path
|
||||
|
||||
def notMplayer2(self):
|
||||
print getMessage("en", "mplayer2-required")
|
||||
print getMessage("mplayer2-required")
|
||||
self._listener.sendLine('quit')
|
||||
self.drop()
|
||||
|
||||
|
||||
@ -42,14 +42,14 @@ class VlcPlayer(BasePlayer):
|
||||
try:
|
||||
self._listener = self.__Listener(self, playerPath, filePath, args, self._vlcready, self._vlcclosed)
|
||||
except ValueError:
|
||||
self._client.ui.showErrorMessage(getMessage("en", "vlc-failed-connection"), True)
|
||||
self._client.ui.showErrorMessage(getMessage("vlc-failed-connection"), True)
|
||||
self.reactor.callFromThread(self._client.stop, (True),)
|
||||
return
|
||||
self._listener.setDaemon(True)
|
||||
self._listener.start()
|
||||
if(not self._vlcready.wait(constants.VLC_OPEN_MAX_WAIT_TIME)):
|
||||
self._vlcready.set()
|
||||
self._client.ui.showErrorMessage(getMessage("en", "vlc-failed-connection"), True)
|
||||
self._client.ui.showErrorMessage(getMessage("vlc-failed-connection"), True)
|
||||
self.reactor.callFromThread(self._client.stop, (True),)
|
||||
self.reactor.callFromThread(self._client.initPlayer, (self),)
|
||||
|
||||
@ -159,11 +159,11 @@ class VlcPlayer(BasePlayer):
|
||||
elif(line.startswith("interface-version: ")):
|
||||
interface_version = line[19:24]
|
||||
if (int(interface_version.replace(".", "")) < int(constants.VLC_INTERFACE_MIN_VERSION.replace(".", ""))):
|
||||
self._client.ui.showErrorMessage(getMessage("en", "vlc-interface-version-mismatch").format(str(interface_version), str(constants.VLC_INTERFACE_MIN_VERSION)))
|
||||
self._client.ui.showErrorMessage(getMessage("vlc-interface-version-mismatch").format(str(interface_version), str(constants.VLC_INTERFACE_MIN_VERSION)))
|
||||
elif (line[:16] == "VLC media player"):
|
||||
vlc_version = line[17:22]
|
||||
if (int(vlc_version.replace(".", "")) < int(constants.VLC_MIN_VERSION.replace(".", ""))):
|
||||
self._client.ui.showErrorMessage(getMessage("en", "vlc-version-mismatch").format(str(vlc_version), str(constants.VLC_MIN_VERSION)))
|
||||
self._client.ui.showErrorMessage(getMessage("vlc-version-mismatch").format(str(vlc_version), str(constants.VLC_MIN_VERSION)))
|
||||
self._vlcready.set()
|
||||
self._listener.sendLine("get-interface-version")
|
||||
|
||||
@ -241,9 +241,9 @@ class VlcPlayer(BasePlayer):
|
||||
if (int(interface_version.replace(".", "")) >= int(constants.VLC_INTERFACE_MIN_VERSION.replace(".", ""))):
|
||||
return True
|
||||
else:
|
||||
playerController._client.ui.showErrorMessage(getMessage("en", "vlc-interface-oldversion-ignored"))
|
||||
playerController._client.ui.showErrorMessage(getMessage("vlc-interface-oldversion-ignored"))
|
||||
return False
|
||||
playerController._client.ui.showErrorMessage(getMessage("en", "vlc-interface-not-installed"))
|
||||
playerController._client.ui.showErrorMessage(getMessage("vlc-interface-not-installed"))
|
||||
return False
|
||||
if sys.platform.startswith('linux'):
|
||||
playerController.vlcIntfPath = "/usr/lib/vlc/lua/intf/"
|
||||
@ -279,10 +279,10 @@ class VlcPlayer(BasePlayer):
|
||||
if "Hosting Syncplay" in line:
|
||||
break
|
||||
elif "Couldn't find lua interface" in line:
|
||||
playerController._client.ui.showErrorMessage(getMessage("en", "vlc-failed-noscript").format(line), True)
|
||||
playerController._client.ui.showErrorMessage(getMessage("vlc-failed-noscript").format(line), True)
|
||||
break
|
||||
elif "lua interface error" in line:
|
||||
playerController._client.ui.showErrorMessage(getMessage("en", "media-player-error").format(line), True)
|
||||
playerController._client.ui.showErrorMessage(getMessage("media-player-error").format(line), True)
|
||||
break
|
||||
threading.Thread.__init__(self, name="VLC Listener")
|
||||
asynchat.async_chat.__init__(self)
|
||||
|
||||
@ -23,7 +23,7 @@ class JSONCommandProtocol(LineReceiver):
|
||||
elif command == "Error":
|
||||
self.handleError(message[1])
|
||||
else:
|
||||
self.dropWithError(getMessage("en", "unknown-command-server-error").format(message[1])) # TODO: log, not drop
|
||||
self.dropWithError(getMessage("unknown-command-server-error").format(message[1])) # TODO: log, not drop
|
||||
|
||||
def lineReceived(self, line):
|
||||
line = line.strip()
|
||||
@ -32,7 +32,7 @@ class JSONCommandProtocol(LineReceiver):
|
||||
try:
|
||||
messages = json.loads(line)
|
||||
except:
|
||||
self.dropWithError(getMessage("en", "not-json-server-error").format(line))
|
||||
self.dropWithError(getMessage("not-json-server-error").format(line))
|
||||
return
|
||||
self.handleMessages(messages)
|
||||
|
||||
@ -77,16 +77,16 @@ class SyncClientProtocol(JSONCommandProtocol):
|
||||
def handleHello(self, 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))
|
||||
self.dropWithError(getMessage("hello-server-error").format(hello))
|
||||
elif(version.split(".")[0:2] != syncplay.version.split(".")[0:2]):
|
||||
self.dropWithError(getMessage("en", "version-mismatch-server-error".format(hello)))
|
||||
self.dropWithError(getMessage("version-mismatch-server-error".format(hello)))
|
||||
else:
|
||||
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.ui.showMessage(getMessage("connected-successful-notification"))
|
||||
self._client.sendFile()
|
||||
|
||||
def sendHello(self):
|
||||
@ -237,12 +237,12 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
@wraps(f)
|
||||
def wrapper(self, *args, **kwds):
|
||||
if(not self._logged):
|
||||
self.dropWithError(getMessage("en", "not-known-server-error"))
|
||||
self.dropWithError(getMessage("not-known-server-error"))
|
||||
return f(self, *args, **kwds)
|
||||
return wrapper
|
||||
|
||||
def dropWithError(self, error):
|
||||
print getMessage("en", "client-drop-server-error").format(self.transport.getPeer().host, error)
|
||||
print getMessage("client-drop-server-error").format(self.transport.getPeer().host, error)
|
||||
self.sendError(error)
|
||||
self.drop()
|
||||
|
||||
@ -268,19 +268,19 @@ class SyncServerProtocol(JSONCommandProtocol):
|
||||
def _checkPassword(self, serverPassword):
|
||||
if(self._factory.password):
|
||||
if(not serverPassword):
|
||||
self.dropWithError(getMessage("en", "password-required-server-error"))
|
||||
self.dropWithError(getMessage("password-required-server-error"))
|
||||
return False
|
||||
if(serverPassword != self._factory.password):
|
||||
self.dropWithError(getMessage("en", "wrong-password-server-error"))
|
||||
self.dropWithError(getMessage("wrong-password-server-error"))
|
||||
return False
|
||||
return True
|
||||
|
||||
def handleHello(self, hello):
|
||||
username, serverPassword, roomName, roomPassword, version = self._extractHelloArguments(hello)
|
||||
if(not username or not roomName or not version):
|
||||
self.dropWithError(getMessage("en", "hello-server-error"))
|
||||
self.dropWithError(getMessage("hello-server-error"))
|
||||
elif(version.split(".")[0:2] != syncplay.version.split(".")[0:2]):
|
||||
self.dropWithError(getMessage("en", "version-mismatch-server-error"))
|
||||
self.dropWithError(getMessage("version-mismatch-server-error"))
|
||||
else:
|
||||
if(not self._checkPassword(serverPassword)):
|
||||
return
|
||||
|
||||
@ -15,7 +15,7 @@ from pprint import pprint
|
||||
|
||||
class SyncFactory(Factory):
|
||||
def __init__(self, password='', motdFilePath=None, isolateRooms=False):
|
||||
print getMessage("en", "welcome-server-notification").format(syncplay.version)
|
||||
print getMessage("welcome-server-notification").format(syncplay.version)
|
||||
if(password):
|
||||
password = hashlib.md5(password).hexdigest()
|
||||
self.password = password
|
||||
@ -46,13 +46,13 @@ class SyncFactory(Factory):
|
||||
try:
|
||||
motd = Template(tmpl).substitute(args)
|
||||
if oldClient:
|
||||
motdwarning = getMessage("en", "new-syncplay-available-motd-message").format(clientVersion)
|
||||
motdwarning = getMessage("new-syncplay-available-motd-message").format(clientVersion)
|
||||
motd = "{}\n{}".format(motdwarning, motd)
|
||||
return motd if len(motd) < constants.SERVER_MAX_TEMPLATE_LENGTH else getMessage("en", "server-messed-up-motd-too-long").format(constants.SERVER_MAX_TEMPLATE_LENGTH, len(motd))
|
||||
return motd if len(motd) < constants.SERVER_MAX_TEMPLATE_LENGTH else getMessage("server-messed-up-motd-too-long").format(constants.SERVER_MAX_TEMPLATE_LENGTH, len(motd))
|
||||
except ValueError:
|
||||
return getMessage("en", "server-messed-up-motd-unescaped-placeholders")
|
||||
return getMessage("server-messed-up-motd-unescaped-placeholders")
|
||||
elif oldClient:
|
||||
return getMessage("en", "new-syncplay-available-motd-message").format(clientVersion)
|
||||
return getMessage("new-syncplay-available-motd-message").format(clientVersion)
|
||||
else:
|
||||
return ""
|
||||
|
||||
@ -337,9 +337,9 @@ class ConfigurationGetter(object):
|
||||
return self._args
|
||||
|
||||
def _prepareArgParser(self):
|
||||
self._argparser = argparse.ArgumentParser(description=getMessage("en", "server-argument-description"),
|
||||
epilog=getMessage("en", "server-argument-epilog"))
|
||||
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='file', type=str, nargs='?', help=getMessage("en", "server-motd-argument"))
|
||||
self._argparser = argparse.ArgumentParser(description=getMessage("server-argument-description"),
|
||||
epilog=getMessage("server-argument-epilog"))
|
||||
self._argparser.add_argument('--port', metavar='port', type=str, nargs='?', help=getMessage("server-port-argument"))
|
||||
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('--motd-file', metavar='file', type=str, nargs='?', help=getMessage("server-motd-argument"))
|
||||
|
||||
@ -198,7 +198,7 @@ class ConfigurationGetter(object):
|
||||
if(self._config['noGui'] or not GuiConfiguration):
|
||||
if error:
|
||||
print "{}!".format(error)
|
||||
print getMessage("en", "missing-arguments-error")
|
||||
print getMessage("missing-arguments-error")
|
||||
sys.exit()
|
||||
elif(GuiConfiguration):
|
||||
gc = GuiConfiguration(self._config, error=error)
|
||||
@ -281,21 +281,21 @@ class ConfigurationGetter(object):
|
||||
#
|
||||
if self._config['language']:
|
||||
setLanguage(self._config['language'])
|
||||
self._argparser = argparse.ArgumentParser(description=getMessage("en", "argument-description"),
|
||||
epilog=getMessage("en", "argument-epilog"))
|
||||
self._argparser.add_argument('--no-gui', action='store_true', help=getMessage("en", "nogui-argument"))
|
||||
self._argparser.add_argument('-a', '--host', metavar='hostname', type=str, help=getMessage("en", "host-argument"))
|
||||
self._argparser.add_argument('-n', '--name', metavar='username', type=str, help=getMessage("en", "name-argument"))
|
||||
self._argparser.add_argument('-d', '--debug', action='store_true', help=getMessage("en", "debug-argument"))
|
||||
self._argparser.add_argument('-g', '--force-gui-prompt', action='store_true', help=getMessage("en", "force-gui-prompt-argument"))
|
||||
self._argparser.add_argument('--no-store', action='store_true', help=getMessage("en", "no-store-argument"))
|
||||
self._argparser.add_argument('-r', '--room', metavar='room', type=str, nargs='?', help=getMessage("en", "room-argument"))
|
||||
self._argparser.add_argument('-p', '--password', metavar='password', type=str, nargs='?', help=getMessage("en", "password-argument"))
|
||||
self._argparser.add_argument('--player-path', metavar='path', type=str, help=getMessage("en", "player-path-argument"))
|
||||
self._argparser.add_argument('--language', metavar='language', type=str, help=getMessage("en", "language-argument"))
|
||||
self._argparser.add_argument('file', metavar='file', type=str, nargs='?', help=getMessage("en", "file-argument"))
|
||||
self._argparser.add_argument('--clear-gui-data', action='store_true', help=getMessage("en", "clear-gui-data-argument"))
|
||||
self._argparser.add_argument('_args', metavar='options', type=str, nargs='*', help=getMessage("en", "args-argument"))
|
||||
self._argparser = argparse.ArgumentParser(description=getMessage("argument-description"),
|
||||
epilog=getMessage("argument-epilog"))
|
||||
self._argparser.add_argument('--no-gui', action='store_true', help=getMessage("nogui-argument"))
|
||||
self._argparser.add_argument('-a', '--host', metavar='hostname', type=str, help=getMessage("host-argument"))
|
||||
self._argparser.add_argument('-n', '--name', metavar='username', type=str, help=getMessage("name-argument"))
|
||||
self._argparser.add_argument('-d', '--debug', action='store_true', help=getMessage("debug-argument"))
|
||||
self._argparser.add_argument('-g', '--force-gui-prompt', action='store_true', help=getMessage("force-gui-prompt-argument"))
|
||||
self._argparser.add_argument('--no-store', action='store_true', help=getMessage("no-store-argument"))
|
||||
self._argparser.add_argument('-r', '--room', metavar='room', type=str, nargs='?', help=getMessage("room-argument"))
|
||||
self._argparser.add_argument('-p', '--password', metavar='password', type=str, nargs='?', help=getMessage("password-argument"))
|
||||
self._argparser.add_argument('--player-path', metavar='path', type=str, help=getMessage("player-path-argument"))
|
||||
self._argparser.add_argument('--language', metavar='language', type=str, help=getMessage("language-argument"))
|
||||
self._argparser.add_argument('file', metavar='file', type=str, nargs='?', help=getMessage("file-argument"))
|
||||
self._argparser.add_argument('--clear-gui-data', action='store_true', help=getMessage("clear-gui-data-argument"))
|
||||
self._argparser.add_argument('_args', metavar='options', type=str, nargs='*', help=getMessage("args-argument"))
|
||||
args = self._argparser.parse_args()
|
||||
self._overrideConfigWithArgs(args)
|
||||
if(self._config['file'] and self._config['file'][:2] == "--"):
|
||||
|
||||
@ -57,9 +57,9 @@ class ConfigDialog(QtGui.QDialog):
|
||||
|
||||
def runButtonTextUpdate(self):
|
||||
if (self.donotstoreCheckbox.isChecked()):
|
||||
self.runButton.setText(getMessage("en", "run-label"))
|
||||
self.runButton.setText(getMessage("run-label"))
|
||||
else:
|
||||
self.runButton.setText(getMessage("en", "storeandrun-label"))
|
||||
self.runButton.setText(getMessage("storeandrun-label"))
|
||||
|
||||
def openHelp(self):
|
||||
self.QtGui.QDesktopServices.openUrl("http://syncplay.pl/guide/client/")
|
||||
@ -281,7 +281,7 @@ class ConfigDialog(QtGui.QDialog):
|
||||
|
||||
super(ConfigDialog, self).__init__()
|
||||
|
||||
self.setWindowTitle(getMessage("en", "config-window-title"))
|
||||
self.setWindowTitle(getMessage("config-window-title"))
|
||||
self.setWindowFlags(self.windowFlags() & Qt.WindowCloseButtonHint & ~Qt.WindowContextHelpButtonHint)
|
||||
self.setWindowIcon(QtGui.QIcon(resourcespath + "syncplay.png"))
|
||||
|
||||
@ -292,24 +292,24 @@ class ConfigDialog(QtGui.QDialog):
|
||||
else:
|
||||
host = config['host'] + ":" + str(config['port'])
|
||||
|
||||
self.connectionSettingsGroup = QtGui.QGroupBox(getMessage("en", "connection-group-title"))
|
||||
self.connectionSettingsGroup = QtGui.QGroupBox(getMessage("connection-group-title"))
|
||||
self.hostTextbox = QLineEdit(host, self)
|
||||
self.hostLabel = QLabel(getMessage("en", "host-label"), self)
|
||||
self.hostLabel = QLabel(getMessage("host-label"), self)
|
||||
self.usernameTextbox = QLineEdit(config['name'], self)
|
||||
self.serverpassLabel = QLabel(getMessage("en", "password-label"), self)
|
||||
self.serverpassLabel = QLabel(getMessage("password-label"), self)
|
||||
self.defaultroomTextbox = QLineEdit(config['room'], self)
|
||||
self.usernameLabel = QLabel(getMessage("en", "username-label"), self)
|
||||
self.usernameLabel = QLabel(getMessage("username-label"), self)
|
||||
self.serverpassTextbox = QLineEdit(config['password'], self)
|
||||
self.defaultroomLabel = QLabel(getMessage("en", "room-label"), self)
|
||||
self.defaultroomLabel = QLabel(getMessage("room-label"), self)
|
||||
|
||||
self.hostLabel.setToolTip(getMessage("en", "host-tooltip"))
|
||||
self.hostTextbox.setToolTip(getMessage("en", "host-tooltip"))
|
||||
self.usernameLabel.setToolTip(getMessage("en", "username-tooltip"))
|
||||
self.usernameTextbox.setToolTip(getMessage("en", "username-tooltip"))
|
||||
self.serverpassLabel.setToolTip(getMessage("en", "password-tooltip"))
|
||||
self.serverpassTextbox.setToolTip(getMessage("en", "password-tooltip"))
|
||||
self.defaultroomLabel.setToolTip(getMessage("en", "room-tooltip"))
|
||||
self.defaultroomTextbox.setToolTip(getMessage("en", "room-tooltip"))
|
||||
self.hostLabel.setToolTip(getMessage("host-tooltip"))
|
||||
self.hostTextbox.setToolTip(getMessage("host-tooltip"))
|
||||
self.usernameLabel.setToolTip(getMessage("username-tooltip"))
|
||||
self.usernameTextbox.setToolTip(getMessage("username-tooltip"))
|
||||
self.serverpassLabel.setToolTip(getMessage("password-tooltip"))
|
||||
self.serverpassTextbox.setToolTip(getMessage("password-tooltip"))
|
||||
self.defaultroomLabel.setToolTip(getMessage("room-tooltip"))
|
||||
self.defaultroomTextbox.setToolTip(getMessage("room-tooltip"))
|
||||
|
||||
self.connectionSettingsLayout = QtGui.QGridLayout()
|
||||
self.connectionSettingsLayout.addWidget(self.hostLabel, 0, 0)
|
||||
@ -322,7 +322,7 @@ class ConfigDialog(QtGui.QDialog):
|
||||
self.connectionSettingsLayout.addWidget(self.defaultroomTextbox, 3, 1)
|
||||
self.connectionSettingsGroup.setLayout(self.connectionSettingsLayout)
|
||||
|
||||
self.mediaplayerSettingsGroup = QtGui.QGroupBox(getMessage("en", "media-setting-title"))
|
||||
self.mediaplayerSettingsGroup = QtGui.QGroupBox(getMessage("media-setting-title"))
|
||||
self.executableiconImage = QtGui.QImage()
|
||||
self.executableiconLabel = QLabel(self)
|
||||
self.executableiconLabel.setMinimumWidth(16)
|
||||
@ -334,18 +334,18 @@ class ConfigDialog(QtGui.QDialog):
|
||||
self.executablepathCombobox.setMaximumWidth(200)
|
||||
self.executablepathCombobox.editTextChanged.connect(self.updateExecutableIcon)
|
||||
|
||||
self.executablepathLabel = QLabel(getMessage("en", "executable-path-label"), self)
|
||||
self.executablebrowseButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("en", "browse-label"))
|
||||
self.executablepathLabel = QLabel(getMessage("executable-path-label"), self)
|
||||
self.executablebrowseButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("browse-label"))
|
||||
self.executablebrowseButton.clicked.connect(self.browsePlayerpath)
|
||||
self.mediapathTextbox = QLineEdit(config['file'], self)
|
||||
self.mediapathLabel = QLabel(getMessage("en", "media-path-label"), self)
|
||||
self.mediabrowseButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("en", "browse-label"))
|
||||
self.mediapathLabel = QLabel(getMessage("media-path-label"), self)
|
||||
self.mediabrowseButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("browse-label"))
|
||||
self.mediabrowseButton.clicked.connect(self.browseMediapath)
|
||||
|
||||
self.executablepathLabel.setToolTip(getMessage("en", "executable-path-tooltip"))
|
||||
self.executablepathCombobox.setToolTip(getMessage("en", "executable-path-tooltip"))
|
||||
self.mediapathLabel.setToolTip(getMessage("en", "media-path-tooltip"))
|
||||
self.mediapathTextbox.setToolTip(getMessage("en", "media-path-tooltip"))
|
||||
self.executablepathLabel.setToolTip(getMessage("executable-path-tooltip"))
|
||||
self.executablepathCombobox.setToolTip(getMessage("executable-path-tooltip"))
|
||||
self.mediapathLabel.setToolTip(getMessage("media-path-tooltip"))
|
||||
self.mediapathTextbox.setToolTip(getMessage("media-path-tooltip"))
|
||||
|
||||
self.mediaplayerSettingsLayout = QtGui.QGridLayout()
|
||||
self.mediaplayerSettingsLayout.addWidget(self.executablepathLabel, 0, 0)
|
||||
@ -357,11 +357,11 @@ class ConfigDialog(QtGui.QDialog):
|
||||
self.mediaplayerSettingsLayout.addWidget(self.mediabrowseButton , 1, 3)
|
||||
self.mediaplayerSettingsGroup.setLayout(self.mediaplayerSettingsLayout)
|
||||
|
||||
self.moreSettingsGroup = QtGui.QGroupBox(getMessage("en", "more-title"))
|
||||
self.moreSettingsGroup = QtGui.QGroupBox(getMessage("more-title"))
|
||||
|
||||
self.moreSettingsGroup.setCheckable(True)
|
||||
|
||||
self.slowdownThresholdLabel = QLabel(getMessage("en", "slowdown-threshold-label"), self)
|
||||
self.slowdownThresholdLabel = QLabel(getMessage("slowdown-threshold-label"), self)
|
||||
self.slowdownThresholdSpinbox = QDoubleSpinBox()
|
||||
try:
|
||||
self.slowdownThresholdSpinbox.setValue(float(config['slowdownThreshold']))
|
||||
@ -372,10 +372,10 @@ class ConfigDialog(QtGui.QDialog):
|
||||
self.slowdownThresholdSpinbox.setMaximumWidth(80)
|
||||
self.slowdownThresholdSpinbox.setMinimum(constants.MINIMUM_SLOWDOWN_THRESHOLD)
|
||||
self.slowdownThresholdSpinbox.setSingleStep(0.1)
|
||||
self.slowdownThresholdSpinbox.setSuffix(getMessage("en", "seconds-suffix"))
|
||||
self.slowdownThresholdSpinbox.setSuffix(getMessage("seconds-suffix"))
|
||||
self.slowdownThresholdSpinbox.adjustSize()
|
||||
|
||||
self.rewindThresholdLabel = QLabel(getMessage("en", "rewind-threshold-label"), self)
|
||||
self.rewindThresholdLabel = QLabel(getMessage("rewind-threshold-label"), self)
|
||||
self.rewindThresholdSpinbox = QDoubleSpinBox()
|
||||
try:
|
||||
self.rewindThresholdSpinbox.setValue(float(config['rewindThreshold']))
|
||||
@ -386,46 +386,46 @@ class ConfigDialog(QtGui.QDialog):
|
||||
self.rewindThresholdSpinbox.setMaximumWidth(80)
|
||||
self.rewindThresholdSpinbox.setMinimum(0)
|
||||
self.rewindThresholdSpinbox.setSingleStep(0.1)
|
||||
self.rewindThresholdSpinbox.setSpecialValueText(getMessage("en", "never-rewind-value"))
|
||||
self.rewindThresholdSpinbox.setSuffix(getMessage("en", "seconds-suffix"))
|
||||
self.rewindThresholdSpinbox.setSpecialValueText(getMessage("never-rewind-value"))
|
||||
self.rewindThresholdSpinbox.setSuffix(getMessage("seconds-suffix"))
|
||||
self.rewindThresholdSpinbox.adjustSize()
|
||||
|
||||
self.slowdownThresholdLabel.setToolTip(getMessage("en", "slowdown-threshold-tooltip"))
|
||||
self.slowdownThresholdSpinbox.setToolTip(getMessage("en", "slowdown-threshold-tooltip"))
|
||||
self.rewindThresholdLabel.setToolTip(getMessage("en", "rewind-threshold-tooltip"))
|
||||
self.rewindThresholdSpinbox.setToolTip(getMessage("en", "rewind-threshold-tooltip"))
|
||||
self.slowdownThresholdLabel.setToolTip(getMessage("slowdown-threshold-tooltip"))
|
||||
self.slowdownThresholdSpinbox.setToolTip(getMessage("slowdown-threshold-tooltip"))
|
||||
self.rewindThresholdLabel.setToolTip(getMessage("rewind-threshold-tooltip"))
|
||||
self.rewindThresholdSpinbox.setToolTip(getMessage("rewind-threshold-tooltip"))
|
||||
|
||||
self.slowdownLabel = QLabel(getMessage("en", "slowdown-label"), self)
|
||||
self.slowdownLabel = QLabel(getMessage("slowdown-label"), self)
|
||||
self.slowdownButtonGroup = QButtonGroup()
|
||||
self.slowdownAutoOption = QRadioButton(getMessage("en", "slowdown-auto-option"))
|
||||
self.slowdownAlwaysOption = QRadioButton(getMessage("en", "slowdown-always-option"))
|
||||
self.slowdownNeverOption = QRadioButton(getMessage("en", "slowdown-never-option"))
|
||||
self.slowdownAutoOption = QRadioButton(getMessage("slowdown-auto-option"))
|
||||
self.slowdownAlwaysOption = QRadioButton(getMessage("slowdown-always-option"))
|
||||
self.slowdownNeverOption = QRadioButton(getMessage("slowdown-never-option"))
|
||||
self.slowdownButtonGroup.addButton(self.slowdownAutoOption)
|
||||
self.slowdownButtonGroup.addButton(self.slowdownAlwaysOption)
|
||||
self.slowdownButtonGroup.addButton(self.slowdownNeverOption)
|
||||
|
||||
self.filenameprivacyLabel = QLabel(getMessage("en", "filename-privacy-label"), self)
|
||||
self.filenameprivacyLabel = QLabel(getMessage("filename-privacy-label"), self)
|
||||
self.filenameprivacyButtonGroup = QButtonGroup()
|
||||
self.filenameprivacySendRawOption = QRadioButton(getMessage("en", "privacy-sendraw-option"))
|
||||
self.filenameprivacySendHashedOption = QRadioButton(getMessage("en", "privacy-sendhashed-option"))
|
||||
self.filenameprivacyDontSendOption = QRadioButton(getMessage("en", "privacy-dontsend-option"))
|
||||
self.filenameprivacySendRawOption = QRadioButton(getMessage("privacy-sendraw-option"))
|
||||
self.filenameprivacySendHashedOption = QRadioButton(getMessage("privacy-sendhashed-option"))
|
||||
self.filenameprivacyDontSendOption = QRadioButton(getMessage("privacy-dontsend-option"))
|
||||
self.filenameprivacyButtonGroup.addButton(self.filenameprivacySendRawOption)
|
||||
self.filenameprivacyButtonGroup.addButton(self.filenameprivacySendHashedOption)
|
||||
self.filenameprivacyButtonGroup.addButton(self.filenameprivacyDontSendOption)
|
||||
|
||||
self.filesizeprivacyLabel = QLabel(getMessage("en", "filesize-privacy-label"), self)
|
||||
self.filesizeprivacyLabel = QLabel(getMessage("filesize-privacy-label"), self)
|
||||
self.filesizeprivacyButtonGroup = QButtonGroup()
|
||||
self.filesizeprivacySendRawOption = QRadioButton(getMessage("en", "privacy-sendraw-option"))
|
||||
self.filesizeprivacySendHashedOption = QRadioButton(getMessage("en", "privacy-sendhashed-option"))
|
||||
self.filesizeprivacyDontSendOption = QRadioButton(getMessage("en", "privacy-dontsend-option"))
|
||||
self.filesizeprivacySendRawOption = QRadioButton(getMessage("privacy-sendraw-option"))
|
||||
self.filesizeprivacySendHashedOption = QRadioButton(getMessage("privacy-sendhashed-option"))
|
||||
self.filesizeprivacyDontSendOption = QRadioButton(getMessage("privacy-dontsend-option"))
|
||||
self.filesizeprivacyButtonGroup.addButton(self.filesizeprivacySendRawOption)
|
||||
self.filesizeprivacyButtonGroup.addButton(self.filesizeprivacySendHashedOption)
|
||||
self.filesizeprivacyButtonGroup.addButton(self.filesizeprivacyDontSendOption)
|
||||
|
||||
self.dontslowwithmeCheckbox = QCheckBox(getMessage("en", "dontslowwithme-label"))
|
||||
self.pauseonleaveCheckbox = QCheckBox(getMessage("en", "pauseonleave-label"))
|
||||
self.alwaysshowCheckbox = QCheckBox(getMessage("en", "alwayshow-label"))
|
||||
self.donotstoreCheckbox = QCheckBox(getMessage("en", "donotstore-label"))
|
||||
self.dontslowwithmeCheckbox = QCheckBox(getMessage("dontslowwithme-label"))
|
||||
self.pauseonleaveCheckbox = QCheckBox(getMessage("pauseonleave-label"))
|
||||
self.alwaysshowCheckbox = QCheckBox(getMessage("alwayshow-label"))
|
||||
self.donotstoreCheckbox = QCheckBox(getMessage("donotstore-label"))
|
||||
|
||||
filenamePrivacyMode = config['filenamePrivacyMode']
|
||||
if filenamePrivacyMode == constants.PRIVACY_DONTSEND_MODE:
|
||||
@ -446,14 +446,14 @@ class ConfigDialog(QtGui.QDialog):
|
||||
if config['pauseOnLeave'] == True:
|
||||
self.pauseonleaveCheckbox.setChecked(True)
|
||||
|
||||
self.filenameprivacyLabel.setToolTip(getMessage("en", "filename-privacy-tooltip"))
|
||||
self.filenameprivacySendRawOption.setToolTip(getMessage("en", "privacy-sendraw-tooltip"))
|
||||
self.filenameprivacySendHashedOption.setToolTip(getMessage("en", "privacy-sendhashed-tooltip"))
|
||||
self.filenameprivacyDontSendOption.setToolTip(getMessage("en", "privacy-dontsend-tooltip"))
|
||||
self.filesizeprivacyLabel.setToolTip(getMessage("en", "filesize-privacy-tooltip"))
|
||||
self.filesizeprivacySendRawOption.setToolTip(getMessage("en", "privacy-sendraw-tooltip"))
|
||||
self.filesizeprivacySendHashedOption.setToolTip(getMessage("en", "privacy-sendhashed-tooltip"))
|
||||
self.filesizeprivacyDontSendOption.setToolTip(getMessage("en", "privacy-dontsend-tooltip"))
|
||||
self.filenameprivacyLabel.setToolTip(getMessage("filename-privacy-tooltip"))
|
||||
self.filenameprivacySendRawOption.setToolTip(getMessage("privacy-sendraw-tooltip"))
|
||||
self.filenameprivacySendHashedOption.setToolTip(getMessage("privacy-sendhashed-tooltip"))
|
||||
self.filenameprivacyDontSendOption.setToolTip(getMessage("privacy-dontsend-tooltip"))
|
||||
self.filesizeprivacyLabel.setToolTip(getMessage("filesize-privacy-tooltip"))
|
||||
self.filesizeprivacySendRawOption.setToolTip(getMessage("privacy-sendraw-tooltip"))
|
||||
self.filesizeprivacySendHashedOption.setToolTip(getMessage("privacy-sendhashed-tooltip"))
|
||||
self.filesizeprivacyDontSendOption.setToolTip(getMessage("privacy-dontsend-tooltip"))
|
||||
|
||||
slowdownMode = config['slowMeOnDesync']
|
||||
if slowdownMode == constants.OPTION_ALWAYS:
|
||||
@ -465,15 +465,15 @@ class ConfigDialog(QtGui.QDialog):
|
||||
if config['dontSlowDownWithMe'] == True:
|
||||
self.dontslowwithmeCheckbox.setChecked(True)
|
||||
|
||||
self.slowdownLabel.setToolTip(getMessage("en", "slowdown-tooltip"))
|
||||
self.slowdownAutoOption.setToolTip(getMessage("en", "slowdown-auto-tooltip"))
|
||||
self.slowdownAlwaysOption.setToolTip(getMessage("en", "slowdown-always-tooltip"))
|
||||
self.slowdownNeverOption.setToolTip(getMessage("en", "slowdown-never-tooltip"))
|
||||
self.slowdownLabel.setToolTip(getMessage("slowdown-tooltip"))
|
||||
self.slowdownAutoOption.setToolTip(getMessage("slowdown-auto-tooltip"))
|
||||
self.slowdownAlwaysOption.setToolTip(getMessage("slowdown-always-tooltip"))
|
||||
self.slowdownNeverOption.setToolTip(getMessage("slowdown-never-tooltip"))
|
||||
|
||||
self.dontslowwithmeCheckbox.setToolTip(getMessage("en", "dontslowwithme-tooltip"))
|
||||
self.pauseonleaveCheckbox.setToolTip(getMessage("en", "pauseonleave-tooltip"))
|
||||
self.alwaysshowCheckbox.setToolTip(getMessage("en", "alwayshow-tooltip"))
|
||||
self.donotstoreCheckbox.setToolTip(getMessage("en", "donotstore-tooltip"))
|
||||
self.dontslowwithmeCheckbox.setToolTip(getMessage("dontslowwithme-tooltip"))
|
||||
self.pauseonleaveCheckbox.setToolTip(getMessage("pauseonleave-tooltip"))
|
||||
self.alwaysshowCheckbox.setToolTip(getMessage("alwayshow-tooltip"))
|
||||
self.donotstoreCheckbox.setToolTip(getMessage("donotstore-tooltip"))
|
||||
|
||||
self.moreSettingsLayout = QtGui.QGridLayout()
|
||||
|
||||
@ -518,7 +518,7 @@ class ConfigDialog(QtGui.QDialog):
|
||||
|
||||
self.moreSettingsGroup.setLayout(self.moreSettingsLayout)
|
||||
|
||||
self.showmoreCheckbox = QCheckBox(getMessage("en", "more-title"))
|
||||
self.showmoreCheckbox = QCheckBox(getMessage("more-title"))
|
||||
|
||||
if self.getMoreState() == False:
|
||||
self.showmoreCheckbox.setChecked(False)
|
||||
@ -531,7 +531,7 @@ class ConfigDialog(QtGui.QDialog):
|
||||
if config['forceGuiPrompt'] == False:
|
||||
self.alwaysshowCheckbox.setChecked(True)
|
||||
|
||||
self.showmoreCheckbox.setToolTip(getMessage("en", "more-tooltip"))
|
||||
self.showmoreCheckbox.setToolTip(getMessage("more-tooltip"))
|
||||
|
||||
|
||||
self.donotstoreCheckbox.toggled.connect(self.runButtonTextUpdate)
|
||||
@ -551,15 +551,15 @@ class ConfigDialog(QtGui.QDialog):
|
||||
self.mainLayout.addSpacing(12)
|
||||
|
||||
self.topLayout = QtGui.QHBoxLayout()
|
||||
self.helpButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'help.png'), getMessage("en", "help-label"))
|
||||
self.helpButton.setToolTip(getMessage("en", "help-tooltip"))
|
||||
self.helpButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'help.png'), getMessage("help-label"))
|
||||
self.helpButton.setToolTip(getMessage("help-tooltip"))
|
||||
self.helpButton.setMaximumSize(self.helpButton.sizeHint())
|
||||
self.helpButton.pressed.connect(self.openHelp)
|
||||
self.runButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'accept.png'), getMessage("en", "storeandrun-label"))
|
||||
self.runButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'accept.png'), getMessage("storeandrun-label"))
|
||||
self.runButton.pressed.connect(self._saveDataAndLeave)
|
||||
if config['noStore'] == True:
|
||||
self.donotstoreCheckbox.setChecked(True)
|
||||
self.runButton.setText(getMessage("en", "run-label"))
|
||||
self.runButton.setText(getMessage("run-label"))
|
||||
self.topLayout.addWidget(self.helpButton, Qt.AlignLeft)
|
||||
self.topLayout.addWidget(self.runButton, Qt.AlignRight)
|
||||
self.mainLayout.addLayout(self.topLayout)
|
||||
@ -571,4 +571,4 @@ class ConfigDialog(QtGui.QDialog):
|
||||
self.setAcceptDrops(True)
|
||||
|
||||
if self.datacleared == True:
|
||||
QtGui.QMessageBox.information(self, "Syncplay", getMessage("en", "gui-data-cleared-notification"))
|
||||
QtGui.QMessageBox.information(self, "Syncplay", getMessage("gui-data-cleared-notification"))
|
||||
|
||||
@ -138,14 +138,14 @@ class ConsoleUI(threading.Thread):
|
||||
if(self._tryAdvancedCommands(data)):
|
||||
return
|
||||
if (command.group('command') not in constants.COMMANDS_HELP):
|
||||
self.showMessage(getMessage("en", "unrecognized-command-notification"))
|
||||
self.showMessage(getMessage("en", "commandlist-notification"), True)
|
||||
self.showMessage(getMessage("en", "commandlist-notification/room"), True)
|
||||
self.showMessage(getMessage("en", "commandlist-notification/list"), True)
|
||||
self.showMessage(getMessage("en", "commandlist-notification/undo"), True)
|
||||
self.showMessage(getMessage("en", "commandlist-notification/pause"), True)
|
||||
self.showMessage(getMessage("en", "commandlist-notification/seek"), True)
|
||||
self.showMessage(getMessage("en", "commandlist-notification/help"), True)
|
||||
self.showMessage(getMessage("en", "syncplay-version-notification").format(syncplay.version), True)
|
||||
self.showMessage(getMessage("en", "more-info-notification").format(syncplay.projectURL), True)
|
||||
self.showMessage(getMessage("unrecognized-command-notification"))
|
||||
self.showMessage(getMessage("commandlist-notification"), True)
|
||||
self.showMessage(getMessage("commandlist-notification/room"), True)
|
||||
self.showMessage(getMessage("commandlist-notification/list"), True)
|
||||
self.showMessage(getMessage("commandlist-notification/undo"), True)
|
||||
self.showMessage(getMessage("commandlist-notification/pause"), True)
|
||||
self.showMessage(getMessage("commandlist-notification/seek"), True)
|
||||
self.showMessage(getMessage("commandlist-notification/help"), True)
|
||||
self.showMessage(getMessage("syncplay-version-notification").format(syncplay.version), True)
|
||||
self.showMessage(getMessage("more-info-notification").format(syncplay.projectURL), True)
|
||||
|
||||
|
||||
@ -31,7 +31,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||
def showUserList(self, currentUser, rooms):
|
||||
self._usertreebuffer = QtGui.QStandardItemModel()
|
||||
self._usertreebuffer.setColumnCount(2)
|
||||
self._usertreebuffer.setHorizontalHeaderLabels((getMessage("en", "roomuser-heading-label"),getMessage("en", "fileplayed-heading-label")))
|
||||
self._usertreebuffer.setHorizontalHeaderLabels((getMessage("roomuser-heading-label"),getMessage("fileplayed-heading-label")))
|
||||
usertreeRoot = self._usertreebuffer.invisibleRootItem()
|
||||
|
||||
for room in rooms:
|
||||
@ -59,15 +59,15 @@ class MainWindow(QtGui.QMainWindow):
|
||||
differentDuration = not sameDuration
|
||||
if (sameName or sameRoom):
|
||||
if (differentSize and sameDuration):
|
||||
fileitem = QtGui.QStandardItem(u"{} ({}) ({})".format(user.file['name'], formatTime(user.file['duration']), getMessage("en", "differentsize-note")))
|
||||
fileitem = QtGui.QStandardItem(u"{} ({}) ({})".format(user.file['name'], formatTime(user.file['duration']), getMessage("differentsize-note")))
|
||||
elif (differentSize and differentDuration):
|
||||
fileitem = QtGui.QStandardItem(u"{} ({}) ({})".format(user.file['name'], formatTime(user.file['duration']), getMessage("en", "differentsizeandduration-note")))
|
||||
fileitem = QtGui.QStandardItem(u"{} ({}) ({})".format(user.file['name'], formatTime(user.file['duration']), getMessage("differentsizeandduration-note")))
|
||||
elif (differentDuration):
|
||||
fileitem = QtGui.QStandardItem(u"{} ({}) ({})".format(user.file['name'], formatTime(user.file['duration']), getMessage("en", "differentduration-note")))
|
||||
fileitem = QtGui.QStandardItem(u"{} ({}) ({})".format(user.file['name'], formatTime(user.file['duration']), getMessage("differentduration-note")))
|
||||
if (sameRoom and (differentName or differentSize or differentDuration)):
|
||||
fileitem.setForeground(QtGui.QBrush(QtGui.QColor('red')))
|
||||
else:
|
||||
fileitem = QtGui.QStandardItem(getMessage("en", "nofile-note"))
|
||||
fileitem = QtGui.QStandardItem(getMessage("nofile-note"))
|
||||
if (room == currentUser.room):
|
||||
fileitem.setForeground(QtGui.QBrush(QtGui.QColor('blue')))
|
||||
if(currentUser.username == user.username):
|
||||
@ -177,7 +177,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||
else:
|
||||
defaultdirectory = ""
|
||||
browserfilter = "All files (*)"
|
||||
fileName, filtr = QtGui.QFileDialog.getOpenFileName(self,getMessage("en", "browseformedia-label"),defaultdirectory,
|
||||
fileName, filtr = QtGui.QFileDialog.getOpenFileName(self,getMessage("browseformedia-label"),defaultdirectory,
|
||||
browserfilter, "", options)
|
||||
if fileName:
|
||||
if sys.platform.startswith('win'):
|
||||
@ -196,8 +196,8 @@ class MainWindow(QtGui.QMainWindow):
|
||||
return None
|
||||
|
||||
def setOffset(self):
|
||||
newoffset, ok = QtGui.QInputDialog.getText(self,getMessage("en","setoffset-msgbox-label"),
|
||||
getMessage("en","offsetinfo-msgbox-label"), QtGui.QLineEdit.Normal,
|
||||
newoffset, ok = QtGui.QInputDialog.getText(self,getMessage("setoffset-msgbox-label"),
|
||||
getMessage("offsetinfo-msgbox-label"), QtGui.QLineEdit.Normal,
|
||||
"")
|
||||
if ok and newoffset != '':
|
||||
o = re.match(constants.UI_OFFSET_REGEX, "o " + newoffset)
|
||||
@ -231,7 +231,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||
window.outputLayout = QtGui.QVBoxLayout()
|
||||
window.outputbox = QtGui.QTextEdit()
|
||||
window.outputbox.setReadOnly(True)
|
||||
window.outputlabel = QtGui.QLabel(getMessage("en", "notifications-heading-label"))
|
||||
window.outputlabel = QtGui.QLabel(getMessage("notifications-heading-label"))
|
||||
window.outputFrame = QtGui.QFrame()
|
||||
window.outputFrame.setLineWidth(0)
|
||||
window.outputFrame.setMidLineWidth(0)
|
||||
@ -245,7 +245,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||
window.listTreeView = QtGui.QTreeView()
|
||||
window.listTreeView.setModel(window.listTreeModel)
|
||||
window.listTreeView.doubleClicked.connect(self.roomClicked)
|
||||
window.listlabel = QtGui.QLabel(getMessage("en", "userlist-heading-label"))
|
||||
window.listlabel = QtGui.QLabel(getMessage("userlist-heading-label"))
|
||||
window.listFrame = QtGui.QFrame()
|
||||
window.listFrame.setLineWidth(0)
|
||||
window.listFrame.setMidLineWidth(0)
|
||||
@ -259,7 +259,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||
window.contactLabel.setLineWidth(1)
|
||||
window.contactLabel.setMidLineWidth(0)
|
||||
window.contactLabel.setMargin(2)
|
||||
window.contactLabel.setText(getMessage("en","contact-label"))
|
||||
window.contactLabel.setText(getMessage("contact-label"))
|
||||
window.contactLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse)
|
||||
window.contactLabel.setOpenExternalLinks(True)
|
||||
window.listLayout.addWidget(window.contactLabel)
|
||||
@ -286,16 +286,16 @@ class MainWindow(QtGui.QMainWindow):
|
||||
window.mainLayout.addLayout(window.bottomLayout, Qt.AlignLeft)
|
||||
|
||||
def addRoomBox(self, window):
|
||||
window.roomGroup = QtGui.QGroupBox(getMessage("en", "room-heading-label"))
|
||||
window.roomGroup = QtGui.QGroupBox(getMessage("room-heading-label"))
|
||||
|
||||
window.roomInput = QtGui.QLineEdit()
|
||||
window.roomInput.returnPressed.connect(self.joinRoom)
|
||||
window.roomButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'door_in.png'), getMessage("en", "joinroom-guibuttonlabel"))
|
||||
window.roomButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'door_in.png'), getMessage("joinroom-guibuttonlabel"))
|
||||
window.roomButton.pressed.connect(self.joinRoom)
|
||||
window.roomLayout = QtGui.QHBoxLayout()
|
||||
window.roomInput.setMaximumWidth(150)
|
||||
|
||||
self.roomButton.setToolTip(getMessage("en", "joinroom-tooltip"))
|
||||
self.roomButton.setToolTip(getMessage("joinroom-tooltip"))
|
||||
|
||||
window.roomLayout.addWidget(window.roomInput)
|
||||
window.roomLayout.addWidget(window.roomButton)
|
||||
@ -304,14 +304,14 @@ class MainWindow(QtGui.QMainWindow):
|
||||
window.roomGroup.setFixedSize(window.roomGroup.sizeHint())
|
||||
|
||||
def addSeekBox(self, window):
|
||||
window.seekGroup = QtGui.QGroupBox(getMessage("en", "seek-heading-label"))
|
||||
window.seekGroup = QtGui.QGroupBox(getMessage("seek-heading-label"))
|
||||
|
||||
window.seekInput = QtGui.QLineEdit()
|
||||
window.seekInput.returnPressed.connect(self.seekPosition)
|
||||
window.seekButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'clock_go.png'),getMessage("en", "seektime-guibuttonlabel"))
|
||||
window.seekButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'clock_go.png'),getMessage("seektime-guibuttonlabel"))
|
||||
window.seekButton.pressed.connect(self.seekPosition)
|
||||
|
||||
self.seekButton.setToolTip(getMessage("en", "seektime-tooltip"))
|
||||
self.seekButton.setToolTip(getMessage("seektime-tooltip"))
|
||||
|
||||
window.seekLayout = QtGui.QHBoxLayout()
|
||||
window.seekInput.setMaximumWidth(50)
|
||||
@ -324,30 +324,30 @@ class MainWindow(QtGui.QMainWindow):
|
||||
window.seekGroup.setFixedSize(window.seekGroup.sizeHint())
|
||||
|
||||
def addMiscBox(self, window):
|
||||
window.miscGroup = QtGui.QGroupBox(getMessage("en", "othercommands-heading-label"))
|
||||
window.miscGroup = QtGui.QGroupBox(getMessage("othercommands-heading-label"))
|
||||
|
||||
window.unseekButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'arrow_undo.png'),getMessage("en", "undoseek-guibuttonlabel"))
|
||||
window.unseekButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'arrow_undo.png'),getMessage("undoseek-guibuttonlabel"))
|
||||
window.unseekButton.pressed.connect(self.undoSeek)
|
||||
self.unseekButton.setToolTip(getMessage("en", "undoseek-tooltip"))
|
||||
self.unseekButton.setToolTip(getMessage("undoseek-tooltip"))
|
||||
|
||||
window.miscLayout = QtGui.QHBoxLayout()
|
||||
window.miscLayout.addWidget(window.unseekButton)
|
||||
if constants.MERGE_PLAYPAUSE_BUTTONS == True:
|
||||
window.playpauseButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'control_pause_blue.png'),getMessage("en", "togglepause-guibuttonlabel"))
|
||||
window.playpauseButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'control_pause_blue.png'),getMessage("togglepause-guibuttonlabel"))
|
||||
window.playpauseButton.pressed.connect(self.togglePause)
|
||||
window.miscLayout.addWidget(window.playpauseButton)
|
||||
self.playpauseButton.setToolTip(getMessage("en", "togglepause-tooltip"))
|
||||
self.playpauseButton.setToolTip(getMessage("togglepause-tooltip"))
|
||||
else:
|
||||
window.playButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'control_play_blue.png'),getMessage("en", "play-guibuttonlabel"))
|
||||
window.playButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'control_play_blue.png'),getMessage("play-guibuttonlabel"))
|
||||
window.playButton.pressed.connect(self.play)
|
||||
window.playButton.setMaximumWidth(60)
|
||||
window.miscLayout.addWidget(window.playButton)
|
||||
window.pauseButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'control_pause_blue.png'),getMessage("en", "pause-guibuttonlabel"))
|
||||
window.pauseButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'control_pause_blue.png'),getMessage("pause-guibuttonlabel"))
|
||||
window.pauseButton.pressed.connect(self.pause)
|
||||
window.pauseButton.setMaximumWidth(60)
|
||||
window.miscLayout.addWidget(window.pauseButton)
|
||||
self.playButton.setToolTip(getMessage("en", "play-tooltip"))
|
||||
self.pauseButton.setToolTip(getMessage("en", "pause-tooltip"))
|
||||
self.playButton.setToolTip(getMessage("play-tooltip"))
|
||||
self.pauseButton.setToolTip(getMessage("pause-tooltip"))
|
||||
|
||||
window.miscGroup.setLayout(window.miscLayout)
|
||||
window.miscGroup.setFixedSize(window.miscGroup.sizeHint())
|
||||
@ -356,20 +356,20 @@ class MainWindow(QtGui.QMainWindow):
|
||||
def addMenubar(self, window):
|
||||
window.menuBar = QtGui.QMenuBar()
|
||||
|
||||
window.fileMenu = QtGui.QMenu(getMessage("en", "file-menu-label"), self)
|
||||
window.openAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'folder_explore.png'), getMessage("en", "openmedia-menu-label"))
|
||||
window.fileMenu = QtGui.QMenu(getMessage("file-menu-label"), self)
|
||||
window.openAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'folder_explore.png'), getMessage("openmedia-menu-label"))
|
||||
window.openAction.triggered.connect(self.browseMediapath)
|
||||
window.exitAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'cross.png'), getMessage("en", "file-menu-label"))
|
||||
window.exitAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'cross.png'), getMessage("file-menu-label"))
|
||||
window.exitAction.triggered.connect(self.exitSyncplay)
|
||||
window.menuBar.addMenu(window.fileMenu)
|
||||
|
||||
window.advancedMenu = QtGui.QMenu(getMessage("en", "advanced-menu-label"), self)
|
||||
window.setoffsetAction = window.advancedMenu.addAction(QtGui.QIcon(self.resourcespath + 'timeline_marker.png'),getMessage("en", "setoffset-menu-label"))
|
||||
window.advancedMenu = QtGui.QMenu(getMessage("advanced-menu-label"), self)
|
||||
window.setoffsetAction = window.advancedMenu.addAction(QtGui.QIcon(self.resourcespath + 'timeline_marker.png'),getMessage("setoffset-menu-label"))
|
||||
window.setoffsetAction.triggered.connect(self.setOffset)
|
||||
window.menuBar.addMenu(window.advancedMenu)
|
||||
|
||||
window.helpMenu = QtGui.QMenu(getMessage("en", "help-menu-label"), self)
|
||||
window.userguideAction = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'help.png'), getMessage("en", "userguide-menu-label"))
|
||||
window.helpMenu = QtGui.QMenu(getMessage("help-menu-label"), self)
|
||||
window.userguideAction = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'help.png'), getMessage("userguide-menu-label"))
|
||||
window.userguideAction.triggered.connect(self.openUserGuide)
|
||||
|
||||
window.menuBar.addMenu(window.helpMenu)
|
||||
|
||||
@ -38,7 +38,7 @@ def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None):
|
||||
break
|
||||
except ExceptionToCheck, e:
|
||||
if logger:
|
||||
msg = getMessage("en", "retrying-notification").format(str(e), mdelay)
|
||||
msg = getMessage("retrying-notification").format(str(e), mdelay)
|
||||
logger.warning(msg)
|
||||
time.sleep(mdelay)
|
||||
mtries -= 1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user