def saveSession(): filename = promptSaveFile(translate('views', 'Save Game Session'), translate('views', 'Random Game files (*.rgg)'), MAP_DIR) if not filename: return jsondump(GlobalState.session.dump(), checkFileExtension(filename, ".rgg"))
def respondICWhisperTarget(sender, message, chname, portrait): if len(portrait) > 1: portfile = makePortableFilename(path.join(PORTRAIT_DIR, portrait)) ICSay(translate('remote', '<table><tr><td><img src="{port}" width="{size}" height="{size}"></td><td>{name} whispers: {message}</td></tr></table><br />').format( port=portfile, size=getPortraitSize(), name=linkedName(chname), message=message)) else: ICSay(translate('remote', '{name} whispers: {message}').format( name=linkedName(chname), message=message))
def _cleanValue(self, value): try: value = int(value) except: raise validationError(translate('integerField', 'You must enter a number for the {0} field.').format(self.name)) if self.min is None or self.min <= value: if self.max is None or self.max >= value: return value raise validationError( translate('integerField', 'You must enter a number for {0} between {1} and {2}.'). format(self.name, self.min or translate('integerField', 'negative infinity'), self.max or translate('integerField', 'infinity')))
def respondICSay(chname, message, portrait): if len(portrait) > 1: portfile = makePortableFilename(path.join(PORTRAIT_DIR, portrait)) IAMTHEDOOMPHANTOM = crm.translateFile(makePortableFilename(path.join(PORTRAIT_DIR, portrait)), RESOURCE_IMAGE) #^ Don't remember whether this is still needed for transfer etc. ICSay(translate('remote', '<table><tr><td><img src="{port}" width="{size}" height="{size}"></td><td>{name}: {sayText}</td></tr></table><br />').format( port=portfile, size=getPortraitSize(), name=linkedName(chname), sayText=message)) else: ICSay(translate('remote', '{name}: {sayText}</p>').format( name=linkedName(chname), sayText=message))
def loadSession(): """Allows the user to load a new map.""" filename = promptLoadFile(translate('views', 'Open Game Session'), translate('views', 'Random Game files (*.rgg)'), MAP_DIR) if not filename: return try: obj = jsonload(filename) _loadSession(obj) sendSession(GlobalState.session.dump()) except Exception as e: showErrorMessage( translate('views', "Unable to read {0}.").format(filename)) print(e)
def _cleanValue(self, value): if value is None and self.allowEmpty: return '' if isinstance(value, BASE_STRING): if self.allowEmpty or len(value) > 0: return value raise validationError(translate('stringField', 'You must enter text into the {0} field.').format(self.name))
def chat(st, chname, portrait): """Parses and executes chat commands.""" st = UNICODE_STRING(st) if (len(st) <= 0): return if ('<' in st and '>' not in st) or ('<' in st and '>' in st and '<' in str(st)[str(st).rfind('>'):]): ICSay( translate( 'chat', "Please type &#60; if you wish to include < in your message." )) return if st[0] != '/' or len(st) > 1 and st[1] == '/': if len(st) > 1 and st[1] == '/': st = st[1:] command = 'say' message = st.strip() else: command, message = splitword(st[1:]) command = str(command).lower() #print command, message if command in chatCommands: chatCommands[command](message, chname, portrait) else: if command not in ('help', '?'): ICSay( translate('chatdoc', "Invalid command.", 'Unknown chat command name.')) elif message in chatCommands: ICSay(translate('chatdoc', chatCommands[message].documentation)) return ICSay( translate( 'chatdoc', "Command Help:<br>" "Typing ordinary text and pressing 'enter' " "will display to all players. Other commands may be invoked " "with '/' plus the name of the command plus any arguments." "<dl><dt>Commands</dt><dd>{commandList}</dd></dl><br>").format( commandList=translate( 'chatdoc', '</dd><dd>', 'Goes inbetween the commands in the commandList.'). join(chatCommandNames)))
def emote(message, chname, portrait): if not message: ICSay( translate( 'chat', "Syntax: /me DOES ACTION. Displays '[HANDLE] DOES " "ACTION' in italic font.")) else: sendICEmote(message, chname, portrait)
def emote(message): if not message: say( translate( 'chat', "Syntax: /me DOES ACTION. Displays '[HANDLE] DOES " "ACTION' in italic font.")) else: sendEmote(message)
def whisper(message): if not message: say( translate( 'chat', "Syntax: /whisper HANDLE MESSAGE. Sends a message " "only to the specified user. Spaces MUST be correct." " Handle may be caps-sensitive.")) else: target, rest = splitword(message) if target.lower() == localuser().username: emote(translate('chat', "mutters something.")) elif not rest: say( translate('chat', "What do you want to tell {target}?").format( target=target)) else: sendWhisper(target, rest)
def clientConnect(client, username): """Occurs when the client is ready to start sending data.""" #print "Client connected." renameuser(localhandle(), username) _closeAllMaps() setUwidgetLocal() say(translate('remote', "Welcome, {name}!").format(name=username)) client.preemptivelyOpenTransferSocket()
def clearSession(): if promptYesNo( translate( 'views', 'Are you sure you want to clear the current session completely for all connected players?' )) == 16384: _clearSession() sendClearSession()
def randomname(message): if len(message) <= 0: say( translate( 'chat', "Syntax: /generate NAMETYPE. For a list of available generators, see /generate keys. Use /generate help NAMETYPE for more information on a generator." )) else: generateName(*splitword(message.lower()))
def clientDisconnect(client, errorMessage): """Occurs when the client connection disconnects without being told to. errorMessage -- a human-readable error message for why the connection failed """ #print "Client disconnected." say(translate('remote', "Disconnected. {0}").format(errorMessage)) clearUserList()
def __init__(self, host=None, port=6812, username=translate('net', 'Anonymous', 'default connection username'), passw=''): self.host = host or localUser() or localHost() self.port = port self.username = username self.password = passw
def respondError(message, *args, **kwargs): """Responds as an error message. message -- the error message to send should be fake translated so it is done on the client instead of the server. Extra arguments are passed to format the translated string. """ say(translate('error', message).format(*args, **kwargs))
def __init__(self, mapExistenceCheck=None, pogExistenceCheck=None, charExistenceCheck=None): main = mainWindow self.menubar = main.menuBar() self.mapExistenceCheck = mapExistenceCheck self.pogExistenceCheck = pogExistenceCheck self.charExistenceCheck = charExistenceCheck # ACTIONS self.newMapAct = QAction(translate("menubar", "&New Map..."), main) self.newMapAct.setShortcut("Ctrl+N") self.loadMapAct = QAction(translate("menubar", "Load Map..."), main) #self.loadMapAct.setShortcut("Ctrl+L") self.saveMapAct = QAction(translate("menubar", "Save Map As..."), main) #self.saveMapAct.setShortcut("Ctrl+S") self.closeSpecificMapAct = QAction(translate("menubar", "Close Map"), main) self.closeMapAct = QAction(translate("menubar", "&Close All Maps"), main) self.closeMapAct.setShortcut("Ctrl+Shift+W") self.loadSessAct = QAction(translate("menubar", "&Load Session..."), main) self.loadSessAct.setShortcut("Ctrl+L") self.saveSessAct = QAction(translate("menubar", "&Save Session As..."), main) self.saveSessAct.setShortcut("Ctrl+S") self.clearSessAct = QAction(translate("menubar", "Clear Session"), main) self.deletePogsAct = QAction(translate("menubar", "Delete All Pogs"), main) self.saveCharsAct = QAction( translate("menubar", "Save IC Characters As..."), main) self.loadCharsAct = QAction( translate("menubar", "Load IC Characters..."), main) self.gfxSettingsAct = QAction( translate("menubar", "Configure Graphics..."), main) self.drawTimerSettingsAct = QAction( translate("menubar", "Configure FPS..."), main) self.hostGameAct = QAction(translate("menubar", "&Host Game..."), main) self.hostGameAct.setShortcut("Ctrl+H") self.joinGameAct = QAction(translate("menubar", "&Join Game..."), main) self.joinGameAct.setShortcut("Ctrl+J") self.disconnectAct = QAction(translate("menubar", "&Disconnect"), main) self.disconnectAct.setShortcut("Ctrl+D") self.sendFileAct = QAction(translate("menubar", "Send file..."), main) self.createSurveyAct = QAction( translate("menubar", "Create Survey..."), main) self.aboutAct = QAction(translate("menubar", "&About"), main) self.aboutAct.setShortcut("Ctrl+A") self.thicknessOneAct = QAction(translate("menubar", "&One"), main) self.thicknessTwoAct = QAction(translate("menubar", "&Two"), main) self.thicknessThreeAct = QAction(translate("menubar", "&Three"), main) self.toggleAlertsAct = QAction( translate("menubar", "Chat Username Notify"), main) self.toggleAlertsAct.setCheckable(True) self.toggleAlertsAct.setChecked(True) self.toggleTimestampsAct = QAction( translate("menubar", "OOC Chat Timestamps"), main) self.toggleTimestampsAct.setCheckable(True) self.toggleTimestampsAct.setChecked(False) self.toggleRightclickAct = QAction( translate("menubar", "Right-Click Opens Pog Ctrl-Click Menu"), main) self.toggleRightclickAct.setCheckable(True) self.toggleRightclickAct.setChecked(True) self.lockToGridAct = QAction( translate("menubar", "Lock Pogs to Map Grid"), main) self.lockToGridAct.setCheckable(True) self.lockToGridAct.setChecked(False) try: js = jsonload(path.join(SAVE_DIR, "ui_settings.rgs")) if loadString('chatWidget.notify', js.get('notify')) == "Off": self.toggleAlertsAct.setChecked(False) except: pass try: js = jsonload(path.join(SAVE_DIR, "ui_settings.rgs")) if loadString('chatWidget.rightclick', js.get('rightclick')) == "Off": self.toggleRightclickAct.setChecked(False) except: pass try: js = jsonload(path.join(SAVE_DIR, "ui_settings.rgs")) if loadString('chatWidget.timestamp', js.get('timestamp')) == "On": self.toggleTimestampsAct.setChecked(True) except: pass try: js = jsonload(path.join(SAVE_DIR, "ui_settings.rgs")) if loadString('chatWidget.gridlock', js.get('gridlock')) == "On": self.lockToGridAct.setChecked(True) except: pass self.setTimestampFormatAct = QAction( translate("menubar", "Set Timestamp Format..."), main) self.portraitMenu = QAction( translate("menubar", "Set IC Portrait Size..."), main) self.selectIcon = QAction(QIcon("./data/FAD-select-icon.png"), "Select Tool", main) self.selectIcon.setShortcut("Ctrl+T") self.selectIcon.setToolTip("Select Tool (Ctrl+T)") #self.moveIcon = QAction(QIcon("./data/FAD-move-icon.png"), "Move Tool", main) #self.moveIcon.setShortcut("Ctrl+M") #self.moveIcon.setToolTip("Move Tool (Ctrl+M)") self.drawIcon = QAction(QIcon("./data/FAD-freehand-icon.png"), "Draw Tool", main) self.drawIcon.setShortcut("Ctrl+E") self.drawIcon.setToolTip("Draw Tool (Ctrl+E)") self.deleteIcon = QAction(QIcon("./data/FAD-eraser-icon.png"), "Delete Tool", main) self.deleteIcon.setShortcut("Ctrl+R") self.deleteIcon.setToolTip("Delete Tool (Ctrl+R)") # MENUS fileMenu = QMenu(translate("menubar", "&File"), main) fileMenu.addAction(self.newMapAct) fileMenu.addAction(self.loadMapAct) fileMenu.addAction(self.saveMapAct) fileMenu.addSeparator() fileMenu.addAction(self.closeSpecificMapAct) fileMenu.addAction(self.closeMapAct) fileMenu.addSeparator() fileMenu.addAction(self.deletePogsAct) fileMenu.addSeparator() fileMenu.addAction(self.saveCharsAct) fileMenu.addAction(self.loadCharsAct) fileMenu.addSeparator() fileMenu.addAction(self.saveSessAct) fileMenu.addAction(self.loadSessAct) fileMenu.addAction(self.clearSessAct) self.mapExistsActs = [ self.saveMapAct, self.closeSpecificMapAct, self.closeMapAct ] self.pogExistsActs = [ self.deletePogsAct, ] self.characterExistsActs = [ self.saveCharsAct, ] self.internetMenu = QMenu(translate("menubar", "&Internet"), main) self.internetMenu.addAction(self.hostGameAct) self.internetMenu.addAction(self.joinGameAct) self.internetMenu.addSeparator() self.internetMenu.addAction(self.createSurveyAct) self.internetMenu.addAction(self.sendFileAct) self.internetMenu.addSeparator() self.internetMenu.addAction(self.disconnectAct) self.connectedActs = [ self.createSurveyAct, self.sendFileAct, self.disconnectAct ] self.disconnectedActs = [self.hostGameAct, self.joinGameAct] self.thicknessMenu = QMenu(translate("menubar", "&Thickness"), main) for x in range(1, 11): self.thicknessMenu.addAction(QAction(str(x), main)) self.colourMenu = QMenu(translate("menubar", "&Colour"), main) #Don't translate colour names yet self.colourMenu.addAction(QAction("White", main)) self.colourMenu.addAction(QAction("Red", main)) self.colourMenu.addAction(QAction("Orange", main)) self.colourMenu.addAction(QAction("Yellow", main)) self.colourMenu.addAction(QAction("Green", main)) self.colourMenu.addAction(QAction("Blue", main)) self.colourMenu.addAction(QAction("Purple", main)) self.colourMenu.addAction(QAction("Black", main)) self.colourMenu.addAction(QAction("Custom...", main)) drawMenu = QMenu(translate("menubar", "&Draw"), main) drawMenu.addMenu(self.thicknessMenu) drawMenu.addMenu(self.colourMenu) self.stylesMenu = QMenu(translate("menubar", "&Styles"), main) for style in list(sheets.keys()): act = QAction(style, main) act.isDark = sheets[style][1] self.stylesMenu.addAction(act) self.langMenu = QMenu(translate("menubar", "&Language"), main) ned = QAction(translate("menubar", "Dutch"), main) ned.setIconText("Dutch") self.langMenu.addAction(ned) eng = QAction(translate("menubar", "English"), main) eng.setIconText("English") self.langMenu.addAction(eng) nhn = QAction(translate("menubar", "Japanese"), main) nhn.setIconText("Japanese") self.langMenu.addAction(nhn) deu = QAction(translate("menubar", "German"), main) deu.setIconText("German") self.langMenu.addAction(deu) self.optionsMenu = QMenu(translate("menubar", "&Options"), main) self.optionsMenu.addMenu(self.langMenu) self.optionsMenu.addMenu(self.stylesMenu) self.optionsMenu.addSeparator() self.optionsMenu.addAction(self.toggleAlertsAct) self.optionsMenu.addAction(self.toggleTimestampsAct) self.optionsMenu.addAction(self.toggleRightclickAct) self.optionsMenu.addAction(self.lockToGridAct) self.optionsMenu.addAction(self.setTimestampFormatAct) self.optionsMenu.addAction(self.portraitMenu) self.optionsMenu.addAction(self.gfxSettingsAct) self.optionsMenu.addAction(self.drawTimerSettingsAct) self.windowMenu = QMenu(translate("menubar", "Window"), main) self.helpMenu = QMenu(translate("menubar", "&Help"), main) self.helpMenu.addAction(self.aboutAct) # MENUBAR self.menubar.addMenu(fileMenu) self.menubar.addMenu(self.internetMenu) self.menubar.addMenu(drawMenu) self.menubar.addMenu(self.optionsMenu) if list(int(r) for r in PYQT_VERSION_STR.split(".")) < [4, 8, 0]: warning = QMessageBox() warning.setText("".join(( "Your version of PyQt (", PYQT_VERSION_STR, ") is incompatible with RGG's Window menu, which requires 4.8.0 or newer. Right-click on the menu bar to get an alternate menu." ))) warning.exec_() else: self.menubar.addMenu(self.windowMenu) self.menubar.addMenu(self.helpMenu) self.menubar.addSeparator() self.menubar.addAction(self.selectIcon) #self.menubar.addAction(self.moveIcon) self.menubar.addAction(self.drawIcon) self.menubar.addAction(self.deleteIcon) # EVENTS self.selectIconClicked() self.selectIcon.triggered.connect(self.selectIconClicked) #self.moveIcon.triggered.connect(self.moveIconClicked) self.drawIcon.triggered.connect(self.drawIconClicked) self.deleteIcon.triggered.connect(self.deleteIconClicked) fileMenu.aboutToShow.connect(self.updateFileMenu) self.internetMenu.aboutToShow.connect(self.updateInternetMenu) self.windowMenu.aboutToShow.connect(self.updateWidgetMenu) self.aboutAct.triggered.connect(self.about)
def respondSay(username, message): say(translate('remote', '{name}: {sayText}').format( name=linkedName(username), sayText=message))
def _cleanValue(self, value): if value <= self.max and value >= self.min: return value raise validationError(translate('sliderField', 'You must enter a valid choice for the {0} field.').format(self.name))
def respondWhisperTarget(sender, message): say(translate('remote', '{username} whispers: {message}').format( username=linkedName(sender), message=message))
def respondWhisperSender(target, message): say(translate('remote', 'To {username}: {message}').format( username=linkedName(target), message=message))
def respondEmote(username, message): say(translate('remote', '<i>{name} {emote}</i>').format( name=linkedName(username), emote=message))
def disconnectionMessage(message, error, *args, **kwargs): """Special translation for a disconnection message.""" #print "Server dropped user." error = translate('socket', error) say(translate('error', message).format(*args, error=disconnect, **kwargs))
def _cleanValue(self, value): if len(self.choices) <= 0: return '' if value in self.choices: return value raise validationError(translate('dropDownField', 'You must enter a valid choice for the {0} field.').format(self.name))
def randomname(message, chname, portrait): if len(message) <= 0: ICSay(translate('chat', "Syntax: /generate NAMETYPE.")) else: generateName(*splitword(message.lower()))
def respondUserJoin(username): say(translate('remote', "{name} has joined!").format(name=username)) addUserToList(username)
def respondDice(username, message): say(translate('remote', '{sayText}').format( sayText=message)) ICSay(translate('remote', '{sayText}').format( sayText=message))