def perspective_setClientProperties( self, dbIdent, voiceId, maxGameId, clientVersion=None): """perspective_* methods are to be called remotely""" self.dbIdent = dbIdent self.voiceId = voiceId self.maxGameId = maxGameId clientVersion = nativeString(clientVersion) serverVersion = Internal.defaultPort if clientVersion != serverVersion: # we assume that versions x.y.* are compatible if clientVersion is None: # client passed no version info return fail(srvError(pb.Error, m18nE( 'Your client has a version older than 4.9.0 but you need %1 for this server'), serverVersion)) else: commonDigits = len([x for x in zip( clientVersion.split(b'.'), serverVersion.split(b'.')) if x[0] == x[1]]) if commonDigits < 2: return fail(srvError(pb.Error, m18nE( 'Your client has version %1 but you need %2 for this server'), clientVersion or '<4.9.0', '.'.join(serverVersion.split('.')[:2]) + '.*')) if Debug.table: logDebug(u'client has dbIdent={} voiceId={} maxGameId={} clientVersion {}'.format( self.dbIdent, self.voiceId, self.maxGameId, clientVersion)) self.server.sendTables(self)
def addUser(self, user): """add user to this table""" if user.name in list(x.name for x in self.users): raise srvError(pb.Error, i18nE('You already joined this table')) if len(self.users) == self.maxSeats(): raise srvError(pb.Error, i18nE('All seats are already taken')) self.users.append(user) if Debug.table: logDebug('%s seated on table %s' % (user.name, self)) self.sendChatMessage( ChatMessage(self.tableid, user.name, i18nE('takes a seat'), isStatusMessage=True))
def newTable(self, user, ruleset, playOpen, autoPlay, wantedGame, tableId=None): """user creates new table and joins it""" def gotRuleset(ruleset): """now we have the full ruleset definition from the client""" Ruleset.cached( ruleset).save() # make it known to the cache and save in db if tableId in self.tables: return fail( srvError( pb.Error, 'You want a new table with id=%d but that id is already used for table %s' % (tableId, self.tables[tableId]))) if Ruleset.hashIsKnown(ruleset): return self.__newTable(None, user, ruleset, playOpen, autoPlay, wantedGame, tableId) else: return self.callRemote( user, 'needRuleset', ruleset).addCallback(gotRuleset).addCallback( self.__newTable, user, ruleset, playOpen, autoPlay, wantedGame, tableId)
def _lookupTable(self, tableid): """return table by id or raise exception""" if tableid not in self.tables: raise srvError(pb.Error, i18nE('table with id <numid>%1</numid> not found'), tableid) return self.tables[tableid]
def perspective_setClientProperties(self, dbIdent, voiceId, maxGameId, clientVersion=None): """perspective_* methods are to be called remotely""" self.pinged() self.dbIdent = dbIdent self.voiceId = voiceId self.maxGameId = maxGameId serverVersion = Internal.defaultPort if clientVersion != serverVersion: # we assume that versions x.y.* are compatible if clientVersion is None: # client passed no version info return fail( srvError( pb.Error, i18nE( 'Your client has a version older than 4.9.0 but you need %1 for this server' ), serverVersion)) else: commonDigits = len([ x for x in zip(clientVersion.split(b'.'), serverVersion.split(b'.')) if x[0] == x[1] ]) if commonDigits < 2: return fail( srvError( pb.Error, i18nE( 'Your client has version %1 but you need %2 for this server' ), clientVersion or '<4.9.0', '.'.join(serverVersion.split('.')[:2]) + '.*')) if Debug.table: logDebug( 'client has dbIdent={} voiceId={} maxGameId={} clientVersion {}' .format(self.dbIdent, self.voiceId, self.maxGameId, clientVersion)) self.server.sendTables(self)
def collectGameIdAnswers(self, requests, gameid): """clients answered if the proposed game id is free""" if requests: # when errors happen, there might be no requests left for msg in requests: if msg.answer == Message.NO: self.proposeGameId(gameid + 1) return elif msg.answer != Message.OK: raise srvError( pb.Error, 'collectGameIdAnswers got neither NO nor OK') self.game.gameid = gameid self.initGame()
def readyForGameStart(self, user): """the table initiator told us he wants to start the game""" if len(self.users) < self.maxSeats() and self.owner != user: raise srvError( pb.Error, i18nE('Only the initiator %1 can start this game, you are %2'), self.owner.name, user.name) if self.suspendedAt: self.__connectPlayers() self.__checkDbIdents() self.initGame() else: self.game = self.__prepareNewGame() self.__connectPlayers() self.__checkDbIdents() self.proposeGameId(self.calcGameId())