def _fetchAllRoomInfos(self, uid, gid, playMode): ftlog.debug("|gameId, roomIds:", gid, [room.roomId for room in gdata.roomIdDefineMap().values() if room.gameId == gid]) ftlog.debug("|gameId, bigRoomIds:", gid, list(gdata.gameIdBigRoomidsMap()[gid])) ctlRoomIds = [bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap()[gid]] ctlRoomIds.sort() ftlog.debug("|gameId, ctrRoomIds:", gid, ctlRoomIds) roomInfos = [] ucount_infos = bireport.getRoomOnLineUserCount(gid, True) ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos) if playMode : for ctlRoomId in ctlRoomIds : roomDef = gdata.roomIdDefineMap()[ctlRoomId] ftlog.debug('_generateRoomList ', 'roomDef=', roomDef) roomConfig = roomDef.configure if roomConfig.get('playMode', None) == playMode \ and (not roomConfig.get('ismatch', 0)) \ and (not roomConfig.get(MFTDefine.IS_CREATE, 0)): # 有playMode 非比赛 非自建桌 roomDesc = {} roomDesc["play_mode"] = roomConfig["playMode"] roomDesc["min_coin"] = roomConfig["minCoin"] roomDesc["max_coin"] = roomConfig["maxCoin"] roomDesc["base_chip"] = roomConfig["tableConf"]["base_chip"] roomDesc["service_fee"] = roomConfig["tableConf"]["service_fee"] playerCount = ucount_infos[1].get(str(roomDef.bigRoomId), 0) ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos[1], roomDef.bigRoomId, ctlRoomId, playerCount) roomInfos.append([ ctlRoomId, playerCount, "", "", "", roomDesc ]) return roomInfos
def _canQuickEnterMatchRoomParent(cls, userId, gameId, roomId, isOnly): try: chip = userchip.getChip(userId) ftlog.debug(gdata.roomIdDefineMap()[roomId].configure) roomConfig = gdata.roomIdDefineMap()[roomId].configure if isOnly: minCoinQs = roomConfig['minCoin'] maxCoinQs = roomConfig['maxCoin'] else: minCoinQs = roomConfig['minCoinQS'] maxCoinQs = roomConfig['maxCoinQS'] ftlog.debug('roomId =', roomId, 'minCoinQs =', minCoinQs, 'maxCoinQs =', maxCoinQs, 'chip =', chip, caller=cls) if chip < minCoinQs: return TYRoom.ENTER_ROOM_REASON_LESS_MIN if maxCoinQs > 0 and chip >= maxCoinQs: return TYRoom.ENTER_ROOM_REASON_GREATER_MAX return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def _remoteTableLeave(self, userId, reason=LEAVE_ROOM_REASON_ACTIVE, locList=None): if not locList: locList = onlinedata.getOnlineLocList(userId) if ftlog.is_debug(): ftlog.debug("<< |roomId, userId: ", self.roomId, userId, "|locList:", locList, caller=self) for loc in locList: onlineRoomId, onlineTableId = loc[0], loc[1] if not onlineRoomId in gdata.roomIdDefineMap(): onlinedata.removeOnlineLoc(userId, onlineRoomId, onlineTableId) continue ctrlRoomId = gdata.roomIdDefineMap()[onlineRoomId].parentId if ctrlRoomId == self.roomId: ftlog.hinfo( "table leave |userId, onlineRoomId, onlineTableId:", userId, onlineRoomId, onlineTableId, caller=self) clientId = sessiondata.getClientId(userId) tableLeaveResultStr = self.queryTableManageTableLeaveReq( userId, onlineRoomId, onlineTableId, clientId, {"reason": reason}) if not tableLeaveResultStr: ftlog.warn( "table leave timeout, |userId, onlineRoomId, onlineTableId, reason:", userId, onlineRoomId, onlineTableId, reason, caller=self) # 玩家离开牌桌只返回成功 # tableLeaveResult = json.loads(tableLeaveResultStr) # ftlog.debug("|tableLeaveResult:", tableLeaveResult) # if tableLeaveResult.get("error"): # return False # if not tableLeaveResult["result"]["isOK"]: # return False if ftlog.is_debug(): locList = onlinedata.getOnlineLocList(userId) ftlog.debug(">> |roomId, userId: ", self.roomId, userId, "|locList:", locList, caller=self) # return True return True
def onMsgTableBegin(self): roomTypeName = self.getRoomConfKey('typeName') ftlog.debug('RobotUser.onMsgTableBegin roomId=', self.roomId, 'roomTypeName=', roomTypeName) if roomTypeName in (rooms.tyRoomConst.ROOM_TYPE_NAME_BIG_MATCH, rooms.tyRoomConst.ROOM_TYPE_NAME_ARENA_MATCH, rooms.tyRoomConst.ROOM_TYPE_NAME_GROUP_MATCH, rooms.tyRoomConst.ROOM_TYPE_NAME_ERDAYI_MATCH, 'dizhu_group_match', 'dizhu_arena_match', 'dizhu_erdayi_match'): ftlog.debug('send enter and sign in match !!!') moEnterMatch = MsgPack() moEnterMatch.setCmdAction('room', 'enter') moEnterMatch.setParam('userId', self.userId) moEnterMatch.setParam('gameId', self.gameId) moEnterMatch.setParam('clientId', self.clientId) moEnterMatch.setParam('roomId', self.roomId) self.writeMsg(moEnterMatch) moSigninMatch = MsgPack() moSigninMatch.setCmdAction('room', 'signin') moSigninMatch.setParam('userId', self.userId) moSigninMatch.setParam('gameId', self.gameId) moSigninMatch.setParam('clientId', self.clientId) moSigninMatch.setParam('roomId', self.roomId) self.writeMsg(moSigninMatch) elif roomTypeName in ('dizhu_custom_match', ): moSigninMatch = MsgPack() moSigninMatch.setCmdAction('custom_match', 'signin') moSigninMatch.setParam('userId', self.userId) moSigninMatch.setParam('gameId', self.gameId) moSigninMatch.setParam('clientId', self.clientId) moSigninMatch.setParam('matchId', self.matchId) self.writeMsg(moSigninMatch) else: self.adjustChip() mo = MsgPack() mo.setCmdAction('game', 'quick_start') mo.setParam('userId', self.userId) mo.setParam('gameId', self.gameId) mo.setParam('clientId', self.clientId) mo.setParam('roomId', self.roomId) mo.setParam('tableId', self.tableId) ctrlRoomId = gdata.roomIdDefineMap()[ self.roomId].parentId or self.roomId if gdata.roomIdDefineMap()[ctrlRoomId].configure.get('isMix'): mixId = gdata.roomIdDefineMap()[ctrlRoomId].configure.get( 'mixConf')[0].get('mixId') mo.setParam('mixId', mixId) ftlog.debug('send quick Start !!!', 'userId=', self.userId, 'gameId=', self.gameId, 'clientId=', self.clientId, 'roomId=', self.roomId, 'tableId=', self.tableId, 'mixId=', mo.getParam('mixId', '')) self.writeMsg(mo) return
def _canQuickEnterCreateRoom(cls, userId, gameId, roomId): try: ftlog.debug(gdata.roomIdDefineMap()[roomId].configure) roomConfig = gdata.roomIdDefineMap()[roomId].configure ismatch = roomConfig.get('ismatch') isBigMatch = False if roomConfig.get('typeName', '') == 'majiang_bigmatch': isBigMatch = True if ismatch and not isBigMatch: return TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def getFailedInfo(cls, reason, userId, roomId): """ 获取失败提示信息 """ lang = util.getLanguage(userId) roomConf = {} if gdata.roomIdDefineMap().get(roomId): roomConf = gdata.roomIdDefineMap()[roomId].configure info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON", lang=lang) if reason == cls.ENTER_ROOM_REASON_LESS_LEVEL: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_LEVEL", lang=lang) % roomConf["minLevel"] elif reason == cls.ENTER_ROOM_REASON_MAINTENANCE: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_MAINTENANCE", lang=lang) elif reason == cls.ENTER_ROOM_REASON_VERSION_DISABLE: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_VERSION_DISABLE", lang=lang) elif reason == cls.ENTER_ROOM_REASON_LESS_FEES: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_FEES", lang=lang) elif reason == cls.ENTER_ROOM_REASON_LESS_BULLET: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_BULLET", lang=lang) elif reason == cls.ENTER_ROOM_REASON_LESS_COIN: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_COIN", lang=lang) % util.formatScore(roomConf["minCoin"], lang=lang) elif reason == cls.ENTER_ROOM_REASON_TIME_LIMIT: info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON_NOT_OPEN", lang=lang) if roomConf.get("typeName") == config.FISH_ROBBERY: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_TIME_LIMIT", lang=lang) elif reason == cls.ENTER_ROOM_REASON_EXCESSIVE_LOSS: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_EXCESSIVE_LOSS", lang=lang) % config.getMultiLangTextConf(roomConf["name"], lang=lang) elif reason == cls.ENTER_ROOM_REASON_NOT_OPEN: info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON_NOT_OPEN", lang=lang) elif reason == cls.ENTER_ROOM_REASON_GRAND_PRIX_LESS_FEES: # 大奖赛门票不足 info = config.getMultiLangTextConf( "ENTER_ROOM_REASON_GRAND_PRIX_LESS_FEES", lang=lang) elif reason == cls.ENTER_ROOM_REASON_GRAND_PRIX_NOE_OPEN: info = config.getMultiLangTextConf( "ENTER_ROOM_REASON_GRAND_PRIX_NOE_OPEN", lang=lang) return info
def _canQuickEnterCreateRoom(cls, userId, gameId, roomId): try: ftlog.debug(gdata.roomIdDefineMap()[roomId].configure) roomConfig = gdata.roomIdDefineMap()[roomId].configure ismatch = roomConfig.get('ismatch') isBigMatch = False if roomConfig.get('typeName', '') == 'majiang_bigmatch': isBigMatch = True if ismatch and not isBigMatch: return TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def _initializeTables(gdatas): ''' 初始化所有的桌子对象 ''' if _DEBUG: debug('initializeTables begin') srvid = gdata.serverId() roomids = gdata.srvIdRoomIdListMap().get(srvid, None) # 获取所有房间ids if roomids: allrooms = gdata.roomIdDefineMap() # 房间定义映射 tyrooms = gdata.rooms() # 所有房间实例字典 for roomid in roomids: room = tyrooms[roomid] roomdefine = allrooms[roomid] gameins = gdata.games()[roomdefine.gameId] # 房间游戏实例TYGame if _DEBUG: debug('initializeTables roomid=', roomid, 'tableCount=', roomdefine.tableCount) if roomdefine.tableCount > 0: # 桌子数 baseid = roomid * 10000 + 1 # 桌子开始的id for x in xrange(roomdefine.tableCount): tableid = baseid + x tableins = gameins.newTable(room, tableid) # 创建桌子 room.maptable[tableid] = tableins # 桌子映射实例 if _DEBUG: debug('initializeTables end')
def onTableWinlose(cls, event): ''' 监听非比赛场的结局胜负 ''' ok = cls.checkActivityDate() if not ok: if ftlog.is_debug(): ftlog.debug('ActivityDdzFund.onTableWinlose OutDate userId=', event.userId, 'roomId=', event.roomId) return userId = event.userId status = cls.loadFundStatus(userId, event.timestamp) if not status.isActivated: ftlog.debug('ActivityDdzFund.onTableWinlose userId=', userId, 'roomId=', event.roomId, 'status=', status.__dict__) return roomLevel = gdata.roomIdDefineMap()[event.roomId].configure.get('roomLevel', 1) data_wrapper = UserPlayDataDatabase(userId) bigRoomId = event.mixConfRoomId or gdata.getBigRoomId(event.roomId) data_wrapper.increase(event.winlose.isWin, False, roomLevel, bigRoomId) ftlog.info('ActivityDdzFund.onTableWinlose userId=', userId, 'isWin=', event.winlose.isWin, 'isMatch=', True, 'roomLevel=', 0, 'roomId=', event.roomId, 'bigRoomId=', bigRoomId)
def _publishWinLoseEvent(roomId, tableId, seatUid, roundId, winUserIds, isDizhu, winuserid, seat_delta, detalChipAll, findChips, windoubles, bomb, chuntian, winslam, clientId, topValidCard, skillLevelUp): from dizhu.game import TGDizhu ebus = TGDizhu.getEventBus() hallebus = TGHall.getEventBus() isWin = True if seatUid in winUserIds else False winlose = Winlose(winuserid, topValidCard, isWin, isDizhu, seat_delta, findChips, windoubles, bomb, chuntian > 1, winslam) ebus.publishEvent( UserTableWinloseEvent(DIZHU_GAMEID, seatUid, roomId, tableId, winlose, skillLevelUp)) isWinNum = 0 if isWin: isWinNum = 1 roomLevel = gdata.roomIdDefineMap()[roomId].configure.get('roomLevel', 1) ftlog.debug('hallebus push gameoverevent userId=', seatUid) hallebus.publishEvent( GameOverEvent(seatUid, DIZHU_GAMEID, clientId, roomId, tableId, isWinNum, roomLevel)) finalUserChip = userchip.getChip(seatUid) finalTableChip = userchip.getTableChip(seatUid, DIZHU_GAMEID, tableId) bireport.reportGameEvent('TABLE_WIN', seatUid, DIZHU_GAMEID, roomId, tableId, roundId, detalChipAll, 0, 0, [], clientId, finalTableChip, finalUserChip) return finalUserChip
def adjustChip(self, minCoin=None, maxCoin=None): if not isinstance(minCoin, int) or not isinstance(maxCoin, int) \ or minCoin < 0 or maxCoin < 0 or minCoin >= maxCoin: roomDef = gdata.roomIdDefineMap()[self.roomId] roomConf = roomDef.configure if roomConf.get('isMix'): maxCoin = roomConf.get('mixConf')[0].get('maxCoin', 0) minCoin = roomConf.get('mixConf')[0].get('minCoin', 0) maxCoin = maxCoin if maxCoin > 0 else minCoin + 100000 else: maxCoin = roomConf['maxCoin'] minCoin = roomConf['minCoin'] maxCoin = maxCoin if maxCoin > 0 else minCoin + 100000 uchip = userchip.getChip(self.userId) ftlog.debug('adjustChip->userId, uchip, minCoin, maxCoin =', self.snsId, self.userId, uchip, minCoin, maxCoin) if uchip < minCoin or uchip > maxCoin: nchip = random.randint(minCoin + 1, minCoin + 1000) dchip = nchip - uchip trueDelta, finalCount = userchip.incrChip( self.userId, self.gameId, dchip, daoconst.CHIP_NOT_ENOUGH_OP_MODE_NONE, 'SYSTEM_ADJUST_ROBOT_CHIP', self.roomId, self.clientId) ftlog.debug('adjustChip->userId, trueDelta, finalCount=', self.snsId, self.userId, trueDelta, finalCount)
def enterOneTable(self, userId, shadowRoomId, tableId): '''指定桌子坐下 Returns False: 重试超过次数 ''' if ftlog.is_debug(): ftlog.debug("<< |userId, roomId, shadowRoomId, tableId", userId, self.roomId, shadowRoomId, tableId, caller=self) if gdata.roomIdDefineMap()[shadowRoomId].tableCount == 1: return tableId for _ in xrange(5): # 这张桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试 result = daobase.executeTableCmd( shadowRoomId, 0, "ZREM", self.getTableScoresKey(shadowRoomId), tableId) # ZREM key member删除元素 if ftlog.is_debug(): ftlog.debug("after ZREM tableId", "|userId, shadowRoomId, tableId, result:", userId, shadowRoomId, tableId, result, caller=self) if result == 1: return tableId FTTasklet.getCurrentFTTasklet().sleepNb(1) return 0
def _trySitDown(self, shadowRoomId, tableId, userId, clientId, extParams): """尝试坐下""" with self._keyLock.lock(userId): table = None for _ in xrange(3): try: if userId in self._allPlayerDict: tableId = self._allPlayerDict[userId] if tableId == 0: self._updateUsableTableList() if not self._usableTableList: continue table = choice(self._usableTableList) else: assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap()[shadowRoomId].bigRoomId == self.bigRoomId table = self._allTableDict[tableId] if table.processing or table.getTableScore() == 0: continue table.processing = True msg = self.makeSitMsg(userId, shadowRoomId, tableId, clientId, extParams) isOK = table.doSit(msg, userId, msg.getParam("seatId", 0), clientId) if not isOK: continue return isOK except Exception, e: ftlog.error("_trySitDown error", userId, shadowRoomId, tableId, clientId, extParams, traceback.format_exc()) finally:
def onMsgTableBegin(self): roomTypeName = gdata.roomIdDefineMap()[ self.roomId].configure['typeName'] if roomTypeName == "majiang_bigmatch": moSigninMatch = MsgPack() moSigninMatch.setCmdAction('room', 'signin') moSigninMatch.setParam('userId', self.userId) moSigninMatch.setParam('gameId', self.gameId) moSigninMatch.setParam('clientId', self.clientId) moSigninMatch.setParam('roomId', self.roomId) self.writeMsg(moSigninMatch) self.isMatch = True else: ftlog.debug('send quick Start !!!') self.adjustChip() mo = MsgPack() mo.setCmdAction('game', 'quick_start') mo.setParam('userId', self.userId) mo.setParam('gameId', self.gameId) mo.setParam('clientId', self.clientId) mo.setParam('roomId', self.roomId) mo.setParam('tableId', self.tableId) self.writeMsg(mo) self.isMatch = False return
def _do_http_gm_room_list(self, gameId, httpRequest, httpArgs, httpResult): '''获取房间列表''' roomOnlineInfos = daobase._executeBiCmd('HGETALL', daoconst.BI_KEY_ROOM_ONLINES % (gameId)) roomOnlineInfos = dict(utils.pairwise(roomOnlineInfos)) bigRoomOnlineInfos = {} for roomId, onlineInfo in roomOnlineInfos.items(): bigRoomId = gdata.getBigRoomId(roomId) tcs = map(int, onlineInfo.split('|')) ucount, tcount = tcs[0], tcs[-1] if bigRoomId not in bigRoomOnlineInfos: bigRoomOnlineInfos[bigRoomId] = [0, 0] bigRoomOnlineInfos[bigRoomId][0] += ucount bigRoomOnlineInfos[bigRoomId][1] += tcount roomList = [] for bigRoomId in gdata.gameIdBigRoomidsMap()[gameId]: ctrlRoomId = gdata.bigRoomidsMap()[bigRoomId][0] roomDefine = gdata.roomIdDefineMap()[ctrlRoomId] ucount, tcount = bigRoomOnlineInfos.get(roomDefine.bigRoomId, [0, 0]) roomInfo = { 'bigRoomId': bigRoomId, 'tableCount': roomDefine.configure['gameServerCount'] * roomDefine.configure['gameTableCount'], 'name': roomDefine.configure['tableConf'].get('tname', ''), 'playingPlayers': ucount, 'playingTables': tcount, } roomList.append(roomInfo) httpResult['roomList'] = roomList
def _chooseCreateRoom(cls, userId, gameId, playMode, playerCount = 4, hasRobot = 0, itemId = None): '''服务端为玩家选择要创建的房间''' candidateRoomIds = MajiangQuickStartV4_0._getCandidateRoomIds(gameId, playMode) ftlog.debug("MajiangCreateTable._chooseCreateRoom:", candidateRoomIds , ' playMode=', playMode , ' playerCount=', playerCount , ' hasRobot=', hasRobot) for roomId in candidateRoomIds : roomConfig = gdata.roomIdDefineMap()[roomId].configure tableConf = roomConfig.get('tableConf', {}) ftlog.debug('_chooseCreateRoom tableConf:', tableConf) if roomConfig.get(MFTDefine.IS_CREATE,0) \ and (tableConf.get(MTDefine.MAXSEATN, 4) == playerCount) \ and (roomConfig.get(MTDefine.HAS_ROBOT, 0) == hasRobot): roomItemId = roomConfig.get(MFTDefine.CREATE_ITEM, 0) if not hasRobot and itemId and (itemId != roomItemId): ftlog.debug('MajiangCreateTable.check playMode ok, hasRobot ok, but fangKa item no ok, curRoomConsume:', roomItemId , ' findRoomConsume:', itemId) continue ret = cls._canQuickEnterCreateRoom(userId, gameId, roomId) ftlog.debug("MajiangCreateTable.check roomId, ret:", roomId, ret, caller=cls) if ret == TYRoom.ENTER_ROOM_REASON_OK: return roomId, TYRoom.ENTER_ROOM_REASON_OK return 0, TYRoom.ENTER_ROOM_REASON_LESS_MIN
def doQuickStart(self, msg): ''' Note: 1> 由于不同游戏评分机制不同,例如德州会根据游戏阶段评分,所以把桌子评分存到redis里,方便各游戏服务器自由刷新。 2> 为了防止同一张桌子同时被选出来分配座位,选桌时会把tableScore里选出的桌子删除,玩家坐下成功后再添加回去,添回去之前无需刷新该桌子的评分。 3> 玩家自选桌时,可能选中一张正在分配座位的桌子,此时需要休眠后重试,只到该桌子完成分配或者等待超时。 ''' assert self.roomId == msg.getParam("roomId") userId = msg.getParam("userId") shadowRoomId = msg.getParam("shadowRoomId") tableId = msg.getParam("tableId") exceptTableId = msg.getParam('exceptTableId') clientId = msg.getParam("clientId") ftlog.hinfo(getMethodName(), "<<", "|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId, self.roomId, shadowRoomId, tableId) if tableId == 0: # 服务器为玩家选择桌子并坐下 shadowRoomId = choice(self.roomDefine.shadowRoomIds) tableId = self.getBestTableId(userId, shadowRoomId, exceptTableId) else: # 玩家自选桌子坐下 assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap()[ shadowRoomId].bigRoomId == self.roomDefine.bigRoomId tableId = self.enterOneTable(userId, shadowRoomId, tableId) if not tableId: ftlog.error(getMethodName(), "getFreeTableId timeout", "|userId, roomId, tableId:", userId, self.roomId, tableId) return if ftlog.is_debug(): ftlog.info(getMethodName(), "after choose table", "|userId, shadowRoomId, tableId:", userId, shadowRoomId, tableId) extParams = msg.getKey('params') self.querySitReq(userId, shadowRoomId, tableId, clientId, extParams)
def _initCandidateRoomIdsByGameId(cls, gameId): roomids = {'': []} ctlRoomIds = [bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap().get(gameId, [])] for ctlRoomId in ctlRoomIds: roomDef = gdata.roomIdDefineMap()[ctlRoomId] playMode = roomDef.configure.get('playMode', '') ismatch = roomDef.configure.get('ismatch', 0) if ismatch == 0: sortVal = roomDef.configure.get('quickIndex', 0) if not playMode in roomids: roomids[playMode] = [] roomids[playMode].append([ctlRoomId, sortVal]) croomids = {} allids = [] for k, v in roomids.items(): v.sort(key=lambda x: x[1]) rids = [x[0] for x in v] croomids[k] = rids allids.extend(rids) ftlog.debug('_initCandidateRoomIds->', gameId, k, '=', croomids[k]) allids.sort() croomids['_all_'] = allids ftlog.debug('_initCandidateRoomIds->', gameId, '_all_', '=', croomids['_all_']) return croomids
def _initCandidateRoomIdsByGameId(cls, gameId): """通过游戏gameId初始化推荐房间Ids""" roomids = {'': []} ctlRoomIds = [ bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap().get(gameId, []) ] for ctlRoomId in ctlRoomIds: roomDef = gdata.roomIdDefineMap()[ctlRoomId] playMode = roomDef.configure.get('playMode', '') ismatch = roomDef.configure.get('ismatch', 0) if ismatch == 0: sortVal = roomDef.configure.get('quickIndex', 0) if not playMode in roomids: roomids[playMode] = [] roomids[playMode].append([ctlRoomId, sortVal]) croomids = {} allids = [] for k, v in roomids.items(): v.sort(key=lambda x: x[1]) rids = [x[0] for x in v] croomids[k] = rids allids.extend(rids) ftlog.debug('_initCandidateRoomIds->', gameId, k, '=', croomids[k]) allids.sort() croomids['_all_'] = allids ftlog.debug('_initCandidateRoomIds->', gameId, '_all_', '=', croomids['_all_']) return croomids
def __initializeTables(gdatas): ''' 初始化所有的桌子对象 ''' if _DEBUG: debug('initializeTables begin') srvid = gdata.serverId() roomids = gdata.srvIdRoomIdListMap().get(srvid, None) if roomids: allrooms = gdata.roomIdDefineMap() tyrooms = gdata.rooms() for roomid in roomids: room = tyrooms[roomid] roomdefine = allrooms[roomid] gameins = gdata.games()[roomdefine.gameId] if _DEBUG: debug('initializeTables roomid=', roomid, 'tableCount=', roomdefine.tableCount) if roomdefine.tableCount > 0: baseid = roomid * 10000 + 1 for x in xrange(roomdefine.tableCount): tableid = baseid + x tableins = gameins.newTable(room, tableid) assert (isinstance(tableins, TYTable)) room.maptable[tableid] = tableins if _DEBUG: debug('initializeTables end')
def _getDizhuMatchCandidateRoomIds(cls): ''' 初始化地主比赛的待选房间列表 ''' # 若存在初始化好的地主比赛房间列表,则直接返回 global _DIZHU_QMATCH_CANDIDATE_ROOM_IDS if _DIZHU_QMATCH_CANDIDATE_ROOM_IDS: return _DIZHU_QMATCH_CANDIDATE_ROOM_IDS gameId = 6 # ctrlroomid_list = [ # [ ctrlroomid, quickindex], # ... # ] ctrlroomid_quickindex_list = [] # 生成的控制房间的房间id列表,ctrlroomid = bigRoomId * 10000 + 1000 ctrlroomid_list = [ bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap().get(gameId, []) ] for ctrlroomid in ctrlroomid_list: roomdef = gdata.roomIdDefineMap()[ctrlroomid] ismatch = roomdef.configure.get('ismatch', 0) # 只选择比赛场,ismatch!=0为比赛场 if ismatch != 0: quickindex = roomdef.configure.get('quickIndex', 0) ctrlroomid_quickindex_list.append([ctrlroomid, quickindex]) # 默认是升序 ctrlroomid_quickindex_list.sort(key=lambda x: x[1]) _DIZHU_QMATCH_CANDIDATE_ROOM_IDS = [ x[0] for x in ctrlroomid_quickindex_list ] return _DIZHU_QMATCH_CANDIDATE_ROOM_IDS
def __initializeTables(gdatas): ''' 初始化所有的桌子对象 ''' if _DEBUG: debug('initializeTables begin') srvid = gdata.serverId() roomids = gdata.srvIdRoomIdListMap().get(srvid, None) if roomids: allrooms = gdata.roomIdDefineMap() tyrooms = gdata.rooms() for roomid in roomids: room = tyrooms[roomid] roomdefine = allrooms[roomid] gameins = gdata.games()[roomdefine.gameId] if _DEBUG: debug('initializeTables roomid=', roomid, 'tableCount=', roomdefine.tableCount) if roomdefine.tableCount > 0: baseid = roomid * 10000 + 1 for x in xrange(roomdefine.tableCount): tableid = baseid + x tableins = gameins.newTable(room, tableid) assert (isinstance(tableins, TYTable)) room.maptable[tableid] = tableins if _DEBUG: debug('initializeTables end')
def _chooseRoom(cls, userId, startRooms, **kwargs): inRoom = False reasonType = None reason = None mixId = '' lastCtrRoomId = 0 mixRoomReversed = kwargs.get('mixRoomReversed', 1) userChip = userchip.getChip(userId) for ctrRoomId in startRooms: lastCtrRoomId = ctrRoomId roomConfig = gdata.roomIdDefineMap()[ctrRoomId].configure if roomConfig.get('segment') == 1: continue if not mixRoomReversed: maxCoin = roomConfig.get('maxCoin', -1) if maxCoin > 0 and userChip >= maxCoin: continue if roomConfig.get('isMix', 0): mixrooms = reversed(roomConfig.get('mixConf', [])) if mixRoomReversed else roomConfig.get('mixConf', []) for mixConf in mixrooms: mixId = mixConf.get('mixId') # 兼容积分榜 if kwargs.get('rankId', '-1') == '0': minQuickStartChip = mixConf.get('minCoin', -1) else: minQuickStartChip = mixConf.get('minQuickStartChip', -1) if userChip < minQuickStartChip: continue reasonType, reason = cls._canQuickEnterRoom(userId, ctrRoomId, mixId=mixConf.get('mixId')) if reason == ENTER_ROOM_REASON_OK: return ctrRoomId, ENTER_ROOM_REASON_OK, mixId elif roomConfig.get('typeName') == 'dizhu_arena_match' and roomConfig.get('matchConf', {}).get('feeRewardList', []): for i in reversed(roomConfig.get('matchConf', {}).get('feeRewardList', [])): reasonType, reason = cls._canQuickEnterRoom(userId, ctrRoomId, mixId=i.get('mixId')) if reason == ENTER_ROOM_REASON_OK: mixId = i.get('mixId') return ctrRoomId, ENTER_ROOM_REASON_OK, mixId else: mixId = '' else: if kwargs.get('rankId', '-1') == '1': maxCoin = roomConfig.get('maxCoin', -1) if maxCoin > 0 and userChip >= maxCoin: return 0, ENTER_ROOM_REASON_GREATER_MAX, mixId reasonType, reason = cls._canQuickEnterRoom(userId, ctrRoomId) if ftlog.is_debug(): ftlog.debug("|roomId, ret:", ctrRoomId, (reasonType, reason), caller=cls) if reason == ENTER_ROOM_REASON_OK: return ctrRoomId, ENTER_ROOM_REASON_OK, mixId # 中途退出在房间内 if reason == ENTER_ROOM_REASON_QUIT_ROOM_ERROR: inRoom = True # 大积分排行榜 if kwargs.get('rankId', '-1') in ['0', '1']: return lastCtrRoomId, ENTER_ROOM_REASON_LESS_MIN, mixId return lastCtrRoomId, ENTER_ROOM_REASON_QUIT_ROOM_ERROR if inRoom else ENTER_ROOM_REASON_LESS_MIN_QUICKSTART, mixId
def __get_room_ratio(roomId): bigRoomId = gdata.roomIdDefineMap()[roomId].bigRoomId if not bigRoomId: return 1 confs = dizhuconf.getSkillSCoreRatioRoom() for conf_ in confs: if bigRoomId in conf_['roomlist']: return conf_['ratio'] return 1
def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly): """是否能快速进入房间""" try: chip = userchip.getChip(userId) if ftlog.is_debug(): ftlog.debug(gdata.roomIdDefineMap()[roomId].configure) roomConfig = gdata.roomIdDefineMap()[roomId].configure if ftlog.is_debug(): ftlog.debug('userId =', userId, 'minCoin =', roomConfig.get('minCoin'), 'maxCoin =', roomConfig.get('maxCoin'), 'minCoinQS =', roomConfig.get('minCoinQS'), 'maxCoinQS =', roomConfig.get('maxCoinQS'), 'chip =', chip, 'isOnly =', isOnly) if isOnly: minCoinQs = roomConfig['minCoin'] maxCoinQs = roomConfig['maxCoin'] else: minCoinQs = roomConfig['minCoinQS'] maxCoinQs = roomConfig['maxCoinQS'] ismatch = roomConfig.get('ismatch') if ismatch or minCoinQs <= 0: return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED if ftlog.is_debug(): ftlog.debug('roomId =', roomId, 'minCoinQs =', minCoinQs, 'maxCoinQs =', maxCoinQs, 'chip =', chip, caller=cls) if chip < minCoinQs: return TYRoom.ENTER_ROOM_REASON_LESS_MIN if maxCoinQs > 0 and chip >= maxCoinQs: return TYRoom.ENTER_ROOM_REASON_GREATER_MAX return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly): ret = cls._canQuickEnterRoomBase(userId, gameId, roomId, isOnly) if ret != TYRoom.ENTER_ROOM_REASON_OK: return ret roomConfig = gdata.roomIdDefineMap()[roomId].configure # 检测准入情况,配置中若没有准入时间(openTimeList),则默认准许全天进入 if not cls._checkOpenTime(roomConfig, datetime.now().time()): return TYRoom.ENTER_ROOM_REASON_NOT_OPEN if roomConfig.get('typeName') in ('dizhuFT', 'dizhu_friend'): return TYRoom.ENTER_ROOM_REASON_NOT_OPEN clientId = sessiondata.getClientId(userId) if not dizhuhallinfo.canDisplayRoom(gameId, userId, clientId, roomId, roomConfig): if ftlog.is_debug(): ftlog.debug( 'DizhuQuickStartV4_0._canQuickEnterMatchRoom NotCanDisplayRoom', 'gameId=', gameId, 'userId=', userId, 'clientId=', clientId, 'roomId=', roomId) return TYRoom.ENTER_ROOM_REASON_NOT_OPEN # 大师分和vip准入筛选 # 两个条件是`或者`的关系 dashifenLevel = roomConfig.get('dashifenLevel', 0) vipLevel = roomConfig.get('vipLevel', 0) ftlog.debug('_canQuickEnterRoom->', userId, gameId, roomId, 'dashifenLevel=', dashifenLevel, 'vipLevel=', vipLevel) if dashifenLevel <= 0 and vipLevel <= 0: return TYRoom.ENTER_ROOM_REASON_OK # 若大师分不满足情况,则再检测VIP,不能直接返回大师分不满足的错误 if dashifenLevel > 0: dashifen = 0 from dizhu.game import TGDizhu info = TGDizhu.getDaShiFen(userId, None) ftlog.debug('_canQuickEnterRoom->', userId, gameId, roomId, 'dashifenInfo=', info) if info: dashifen = info.get('level', 0) if dashifen >= dashifenLevel: return TYRoom.ENTER_ROOM_REASON_OK if vipLevel > 0: vip = 0 vipInfo = hallvip.userVipSystem.getUserVip(userId) ftlog.debug('_canQuickEnterRoom->', userId, gameId, roomId, 'vipInfo=', vipInfo) if vipInfo: vip = vipInfo.vipLevel.level if vip >= vipLevel: return TYRoom.ENTER_ROOM_REASON_OK return TYRoom.ENTER_ROOM_REASON_DASHIFEI_LEVEL
def getResponseDelaySecond(self): roomConf = gdata.roomIdDefineMap()[self.roomId].configure robotUserOpTime = roomConf.get('robotUserOpTime', None) if robotUserOpTime: return random.randint(int(min(robotUserOpTime)), int(max(robotUserOpTime))) if self.responseDelaySecond < 0: delay = 0 else: delay = random.randint(0, self.responseDelaySecond) # 随机延迟进入 return delay
def _communicateTableServer(userId, roomId, msgpack, head1, isQuery, timeout=None, notimeoutex=0): if timeout == None: timeout = _runenv._RPC_TIME_OUT assert (isinstance(msgpack, (MsgPack, basestring))) assert (isinstance(roomId, (int, long)) and roomId >= 0) assert (isinstance(userId, (int, long)) and userId >= 0) allrooms = gdata.roomIdDefineMap() if roomId in allrooms: roomDef = allrooms[roomId] if roomDef.parentId == 0: ftlog.warn('ERROR, cat not localtion the roomId of->', userId, roomId, msgpack) return else: # this roomId is big roomId assert (isinstance(userId, (int, long)) and userId >= 0) bigrooms = gdata.bigRoomidsMap() if roomId in bigrooms: msgpack, shadowRoomId = __getRoomIdByTableId(msgpack) ftlog.debug('_communicateTableServer allrooms = ', allrooms, 'shadowRoomId =', shadowRoomId) if shadowRoomId: roomDef = allrooms[shadowRoomId] else: ftlog.warn('ERROR, cat not localtion the roomId of->', userId, roomId, msgpack) return else: ftlog.warn('ERROR, cat not localtion the roomId of->', userId, roomId, msgpack) return if isinstance(msgpack, MsgPack): msgpack = msgpack.pack() dst = roomDef.serverId ftlog.debug('_communicateTableServer->dst=', dst, 'head1=', head1, 'roomId=', str(roomId), 'timeout=', timeout, 'msgpack=[' + msgpack + ']') if isQuery: response = wrapper.query(dst, msgpack, head1, str(roomId), timeout, notimeoutex=notimeoutex) ftlog.debug('_communicateTableServer->dst=', dst, 'head1=', head1, 'roomId=', str(roomId), 'response=[' + str(response) + ']') return response else: return wrapper.send(dst, msgpack, head1, str(roomId))
def addOnlineLoc(userId, roomId, tableId, seatId, checkConfict=True): ''' 添加一个用户的在线位置, 注意: 子键值为roomId+'.'+tableId, 因此不允许用户再同一个桌子的不同桌位坐下 通常此方法在用户真实坐在某一个桌位后调用 ''' assert (isinstance(roomId, int) and roomId > 0) assert (roomId in gdata.roomIdDefineMap() or roomId in gdata.bigRoomidsMap()) assert (isinstance(tableId, int) and tableId > roomId) assert (isinstance(seatId, int) and seatId > 0) return dbuser._addOnlineLoc(userId, roomId, tableId, seatId, checkConfict)
def _doJoinCreateTable(self, room, msg): assert room.roomId == msg.getParam("roomId") userId = msg.getParam("userId") shadowRoomId = msg.getParam("shadowRoomId") tableId = msg.getParam("tableId") clientId = msg.getParam("clientId") ftlog.info("<<|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId, room.roomId, shadowRoomId, tableId) assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap()[shadowRoomId].bigRoomId == room.roomDefine.bigRoomId extParams = msg.getKey('params') room.querySitReq(userId, shadowRoomId, tableId, clientId, extParams)
def setBigRoomOnlineLoc(userId, roomId, tableId, seatId): ''' 添加一个用户的在线位置, 注意: 子键值为roomId+'.'+tableId, 因此不允许用户再同一个桌子的不同桌位坐下 此方法将会检查当前的所有loc,如果存在和roomId一直的bigRoomId的loc那么删除原loc设置新loc ''' assert (isinstance(roomId, int) and roomId > 0) assert (roomId in gdata.roomIdDefineMap() or roomId in gdata.bigRoomidsMap()) assert (isinstance(tableId, int) and tableId > roomId) assert (isinstance(seatId, int) and seatId > 0) return dbuser._setBigRoomOnlineLoc(userId, roomId, tableId, seatId)
def addOnlineLoc(userId, roomId, tableId, seatId, checkConfict=True): ''' 添加一个用户的在线位置, 注意: 子键值为roomId+'.'+tableId, 因此不允许用户再同一个桌子的不同桌位坐下 通常此方法在用户真实坐在某一个桌位后调用 ''' assert (isinstance(roomId, int) and roomId > 0) assert (roomId in gdata.roomIdDefineMap() or roomId in gdata.bigRoomidsMap()) assert (isinstance(tableId, int) and tableId > roomId) assert (isinstance(seatId, int) and seatId > 0) return dbuser._addOnlineLoc(userId, roomId, tableId, seatId, checkConfict)
def getResponseDelaySecond(self): roomConf = gdata.roomIdDefineMap()[self.roomId].configure robotUserOpTime = roomConf.get('robotUserOpTime', None) if robotUserOpTime: return random.randint(int(min(robotUserOpTime)), int(max(robotUserOpTime))) if self.responseDelaySecond < 0: delay = 0 else: delay = random.randint(0, self.responseDelaySecond) # 随机延迟进入 return delay
def _sendChargeLeadTodoTask(cls, userId, roomId, clientId, mixId): bigRoomId = gdata.getBigRoomId(roomId) ctrRoomId = bigRoomId * 10000 + 1000 roomConfig = gdata.roomIdDefineMap()[ctrRoomId].configure mixConfRoomId = cls.getMixConf(roomConfig, mixId).get('roomId', 0) if roomConfig.get('isMix', 0) and mixConfRoomId: roomId = mixConfRoomId product, _ = hallproductselector.selectLessbuyProduct(DIZHU_GAMEID, userId, clientId, roomId) t = TodoTaskPayOrder(product) msg = TodoTaskHelper.makeTodoTaskMsg(DIZHU_GAMEID, userId, t) router.sendToUser(msg, userId)
def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly): try: chip = userchip.getChip(userId) if ftlog.is_debug(): ftlog.debug(gdata.roomIdDefineMap()[roomId].configure) roomConfig = gdata.roomIdDefineMap()[roomId].configure if ftlog.is_debug(): ftlog.debug('userId =', userId, 'minCoin =', roomConfig.get('minCoin'), 'maxCoin =', roomConfig.get('maxCoin'), 'minCoinQS =', roomConfig.get('minCoinQS'), 'maxCoinQS =', roomConfig.get('maxCoinQS'), 'chip =', chip, 'isOnly =', isOnly) if isOnly: minCoinQs = roomConfig['minCoin'] maxCoinQs = roomConfig['maxCoin'] else: minCoinQs = roomConfig['minCoinQS'] maxCoinQs = roomConfig['maxCoinQS'] ismatch = roomConfig.get('ismatch') if ismatch or minCoinQs <= 0: return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED if ftlog.is_debug(): ftlog.debug('roomId =', roomId, 'minCoinQs =', minCoinQs, 'maxCoinQs =', maxCoinQs, 'chip =', chip, caller=cls) if chip < minCoinQs: return TYRoom.ENTER_ROOM_REASON_LESS_MIN if maxCoinQs > 0 and chip >= maxCoinQs: return TYRoom.ENTER_ROOM_REASON_GREATER_MAX return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def doQuickStart(self, msg): assert self.roomId == msg.getParam("roomId") userId = msg.getParam("userId") shadowRoomId = msg.getParam("shadowRoomId") tableId = msg.getParam("tableId") clientId = msg.getParam("clientId") ftlog.hinfo("doQuickStart <<", "|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId, self.roomId, shadowRoomId, tableId) # msg = TYPluginCenter.event(TYPluginUtils.updateMsg(cmd='EV_QUICK_START', params=TYPluginUtils.mkdict( # userId=userId, roomId=self.roomId), result={}), self.gameId) # # if msg.getResult("reason") != None: # info = u'玩家需要验证' # self.sendQuickStartRes(self.gameId, userId, msg.getResult("reason"), self.bigRoomId, 0, info) # return if tableId == 0: isOk, reason = self.doEnter(userId) elif tableId == self.roomId * 10000: if userId in self._roomUsers: isOk = True # 玩家在队列里时断线重连 reason = TYRoom.ENTER_ROOM_REASON_OK else: # 服务器重启造成玩家已经不在房间对象里了 onlinedata.removeOnlineLoc(userId, self.roomId, tableId) isOk = False reason = TYRoom.ENTER_ROOM_REASON_CONFLICT else: # 防御性代码,处理快速开始online错乱 onlineSeat = onlinedata.getOnlineLocSeatId(userId, shadowRoomId, tableId) if onlineSeat == 0: # 断线重连过程中玩家因为超时、金币不足或比赛淘汰等原因已被踢出房间 isOk = False reason = TYRoom.ENTER_ROOM_REASON_CONFLICT ftlog.warn("doQuickStart conflict!", "|userId, onlineLocList:", userId, onlinedata.getOnlineLocList(userId), "|shadowRoomId, tableId:", shadowRoomId, tableId) else: ftlog.error("doQuickStart conflict!", "|onlineSeat:", onlineSeat) if onlineSeat == gdata.roomIdDefineMap()[shadowRoomId].configure['tableConf']['maxSeatN'] + 1: # 牌桌里旁观的玩家断线重连,请求转给GT self.sendTableCallObserveReq(userId, shadowRoomId, tableId, clientId) elif onlineSeat > 0: # 牌桌里坐着的玩家断线重连,请求转给GT self.querySitReq(userId, shadowRoomId, tableId, clientId) return if isOk: self._onQuickStartOk(userId) elif reason == TYRoom.ENTER_ROOM_REASON_CONFLICT: info = u'玩家已经在游戏中,状态冲突' self.sendQuickStartRes(self.gameId, userId, reason, self.bigRoomId, 0, info) else: self.sendQuickStartRes(self.gameId, userId, reason, self.bigRoomId, 0, '')
def setBigRoomOnlineLoc(userId, roomId, tableId, seatId): ''' 添加一个用户的在线位置, 注意: 子键值为roomId+'.'+tableId, 因此不允许用户再同一个桌子的不同桌位坐下 此方法将会检查当前的所有loc,如果存在和roomId一直的bigRoomId的loc那么删除原loc设置新loc ''' assert (isinstance(roomId, int) and roomId > 0) assert (roomId in gdata.roomIdDefineMap() or roomId in gdata.bigRoomidsMap()) assert (isinstance(tableId, int) and tableId > roomId) assert (isinstance(seatId, int) and seatId > 0) return dbuser._setBigRoomOnlineLoc(userId, roomId, tableId, seatId)
def _fetchAllRoomInfos(self, uid, gid, playMode): ftlog.debug("|gameId, roomIds:", gid, [ room.roomId for room in gdata.roomIdDefineMap().values() if room.gameId == gid ]) ftlog.debug("|gameId, bigRoomIds:", gid, list(gdata.gameIdBigRoomidsMap()[gid])) ctlRoomIds = [ bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap()[gid] ] ctlRoomIds.sort() ftlog.debug("|gameId, ctrRoomIds:", gid, ctlRoomIds) roomInfos = [] ucount_infos = bireport.getRoomOnLineUserCount(gid, True) ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos) if playMode: for ctlRoomId in ctlRoomIds: roomDef = gdata.roomIdDefineMap()[ctlRoomId] ftlog.debug('_generateRoomList ', 'roomDef=', roomDef) roomConfig = roomDef.configure if roomConfig.get('playMode', None) == playMode \ and (not roomConfig.get('ismatch', 0)) \ and (not roomConfig.get(MFTDefine.IS_CREATE, 0)): # 有playMode 非比赛 非自建桌 roomDesc = {} roomDesc["play_mode"] = roomConfig["playMode"] roomDesc["min_coin"] = roomConfig["minCoin"] roomDesc["max_coin"] = roomConfig["maxCoin"] roomDesc["base_chip"] = roomConfig["tableConf"][ "base_chip"] roomDesc["service_fee"] = roomConfig["tableConf"][ "service_fee"] playerCount = ucount_infos[1].get(str(roomDef.bigRoomId), 0) ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos[1], roomDef.bigRoomId, ctlRoomId, playerCount) roomInfos.append( [ctlRoomId, playerCount, "", "", "", roomDesc]) return roomInfos
def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly): try: chip = userchip.getChip(userId) ftlog.debug(gdata.roomIdDefineMap()[roomId].configure, caller=cls) roomConfig = gdata.roomIdDefineMap()[roomId].configure ismatch = roomConfig.get('ismatch') isBigMatch = False if roomConfig.get('typeName', '') == 'majiang_bigmatch': isBigMatch = True if ismatch and not isBigMatch: return cls._canQuickEnterMatch(userId, gameId, roomId, chip) if isOnly: minCoinQs = roomConfig['minCoin'] maxCoinQs = roomConfig['maxCoin'] else: minCoinQs = roomConfig['minCoinQS'] maxCoinQs = roomConfig['maxCoinQS'] ftlog.debug('MajiangQuickStartV4_0 roomId:', roomId, 'minCoinQs:', minCoinQs, 'maxCoinQs:', maxCoinQs, 'chip:', chip, caller=cls) if chip < minCoinQs and (minCoinQs != -1): return TYRoom.ENTER_ROOM_REASON_LESS_MIN if maxCoinQs > 0 and chip >= maxCoinQs: return TYRoom.ENTER_ROOM_REASON_GREATER_MAX return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, playMode, clientId): # 单开, 无论何时quick_start进入都检查loc if not pokerconf.isOpenMoreTable(clientId): loc = onlinedata.checkUserLoc(userId, clientId, gameId) if ftlog.is_debug(): ftlog.debug('DizhuQuickStart old client, checkUserLoc->', loc, caller=cls) if isinstance(loc, basestring): lgameId, lroomId, ltableId, lseatId = loc.split('.') lgameId, lroomId, ltableId, lseatId = strutil.parseInts(lgameId, lroomId, ltableId, lseatId) if lgameId == gameId and lroomId > 0: if ftlog.is_debug(): ftlog.debug('DizhuQuickStart _quickStart re-connected |userId, loc:', userId, loc, '|roomId, tableId:', roomId, tableId, caller=cls) roomId = lroomId tableId = ltableId msg.setParam('isReConnected', True) if ftlog.is_debug(): ftlog.debug('DizhuQuickStart old client, reset roomId, tableId->', roomId, tableId, caller=cls) if not tableId and game.isShutDown(): cls._sendTodoTaskToUser(userId, ENTER_ROOM_REASON_GAME_SHUTDOWN_GO) return # 带有roomId if roomId: cls._quickStart(msg, userId, gameId, roomId, tableId, playMode, clientId) return # 不带 roomId 服务器来选择房间 ctrlRoomIds, mixRoomReversed = cls._getQuickStartRoomList(userId, playMode, rankId=msg.getParam('rankId', '-1')) # 快开列表 chose_roomid, ok, mixId = cls._chooseRoom(userId, ctrlRoomIds, rankId=msg.getParam('rankId', '-1'), mixRoomReversed=mixRoomReversed) # 选择一个 if ok == ENTER_ROOM_REASON_OK: bigroomid = gdata.getBigRoomId(chose_roomid) ismatch = gdata.roomIdDefineMap()[chose_roomid].configure.get('ismatch', 0) if ftlog.is_debug(): ftlog.debug("DizhuQuickStart._chooseRoom: userId=", userId, "roomId=", chose_roomid, 'mixId=', mixId) if ismatch: cls.notifyQuickGotoDizhuMatch(gameId, userId, bigroomid, mixId=mixId) else: msg.setParam('mixId', mixId) ctrRoomIds = gdata.bigRoomidsMap()[bigroomid] ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)] TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId, 0) # 请求发给 GR elif ok == ENTER_ROOM_REASON_QUIT_ROOM_ERROR: cls._sendTodoTaskToUser(userId, ok) elif (ok == ENTER_ROOM_REASON_LESS_MIN or ok == ENTER_ROOM_REASON_LESS_MIN_QUICKSTART) and msg.getParam('rankId', '-1') in ['0', '1']: cls._sendTodoTaskBuyChip(userId, chose_roomid, clientId, mixId) elif ok == ENTER_ROOM_REASON_LESS_MIN_QUICKSTART: cls._sendTodoTaskBuyChip(userId, chose_roomid, clientId, mixId) else: cls._sendTodoTaskJumpHighRoom(userId, playMode, clientId, rankId='-1') return
def getBestTableId(self, userId, shadowRoomId, exceptTableId=None): '''原子化从redis里获取和删除评分最高的桌子Id Return: None: tableScores 队列为空, 所有桌子都在分配座位中 ''' def getBestTableIdFromRedis(shadowRoomId): '''从redis里取出并删除一个评分最高的牌桌 ''' tableId, tableScore = 0, 0 datas = daobase.executeTableLua(shadowRoomId, 0, room_scripts.ALIAS_GET_BEST_TABLE_ID_LUA, 1, self.getTableScoresKey(shadowRoomId), 0) if datas and len(datas) == 2: tableId, tableScore = datas[0], datas[1] return tableId, tableScore if ftlog.is_debug(): ftlog.debug("<<", "|shadowRoomId, exceptTableId:", shadowRoomId, exceptTableId, caller=self) pigTables = [] tableId = 0 for _ in xrange(5): # 所有桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试 if gdata.roomIdDefineMap()[shadowRoomId].tableCount == 1: tableId = shadowRoomId * 10000 + 1 tableScore = 100 else: tableId, tableScore = getBestTableIdFromRedis(shadowRoomId) # 从redis取一个牌桌 # 该牌桌被客户端指定排除了,另外再取一个牌桌 if exceptTableId and tableId and exceptTableId == tableId: tableId1, tableScore1 = getBestTableIdFromRedis(shadowRoomId) # 把之前从redis取出的牌桌加回redis self._updateTableScore(shadowRoomId, tableScore, tableId, force=True) tableId, tableScore = tableId1, tableScore1 if ftlog.is_debug(): ftlog.debug('getBestTableId shadowRoomId, tableId, tableScore=', shadowRoomId, tableId, tableScore) if tableId: if TYGame(self.gameId).isWaitPigTable(userId, self, tableId): pigTables.append([shadowRoomId, tableScore, tableId]) tableId = 0 continue else: break else: FTTasklet.getCurrentFTTasklet().sleepNb(0.2) if ftlog.is_debug(): ftlog.debug('getBestTableId pigTables=', pigTables) if pigTables: for pig in pigTables: self._updateTableScore(pig[0], pig[1], pig[2], False) return tableId
def getRpcDstRoomServerId(roomId, canChangeRoomId): allrooms = gdata.roomIdDefineMap() if roomId in allrooms: roomDef = allrooms[roomId] return roomDef.serverId elif canChangeRoomId: # this roomId may be big roomId bigrooms = gdata.bigRoomidsMap() if roomId in bigrooms: ctrlroomIds = bigrooms[roomId] ctrlRoomId = ctrlroomIds[0] # ctrlRoom0 做为 ctrlRooms 的调度器 roomDef = allrooms[ctrlRoomId] return roomDef.serverId ftlog.warn('getRpcDstRoomServerId roomId error !!', roomId, canChangeRoomId)
def _doJoinCreateTable(self, room, msg): assert room.roomId == msg.getParam("roomId") userId = msg.getParam("userId") shadowRoomId = msg.getParam("shadowRoomId") tableId = msg.getParam("tableId") clientId = msg.getParam("clientId") ftlog.info("<<|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId, room.roomId, shadowRoomId, tableId) assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap( )[shadowRoomId].bigRoomId == room.roomDefine.bigRoomId extParams = msg.getKey('params') room.querySitReq(userId, shadowRoomId, tableId, clientId, extParams)
def _remoteCall(markParams, argl, argd): srvtype = markParams['remoteServerType'] syncCall = markParams['remoteSyncCall'] remoteGroupByIndex = markParams['remoteGroupByIndex'] remoteGroupBy = markParams['remoteGroupBy'] cmd = markParams['remoteCmd'] action = markParams['remoteAction'] groupVal = argl[remoteGroupByIndex] msgpack = MsgPack() msgpack.setCmdAction(cmd, action) msgpack.setParam(remoteGroupBy, groupVal) msgpack.setParam('argl', argl[1:]) # 去掉self, cls msgpack.setParam('argd', argd) msgpack.setParam('clientId', configure.CLIENTID_RPC) msgpack = msgpack.pack() jstr = None if srvtype == gdata.SRV_TYPE_UTIL: jstr = _communicateServer(_utilServer, groupVal, groupVal, msgpack, 'RQ', syncCall) elif srvtype == gdata.SRV_TYPE_ROOM: assert (groupVal in gdata.roomIdDefineMap()) jstr = _communicateRoomServer(0, groupVal, msgpack, 'RQ', syncCall) elif srvtype == gdata.SRV_TYPE_TABLE: assert (groupVal in gdata.roomIdDefineMap()) jstr = _communicateTableServer(0, groupVal, msgpack, 'RQ', syncCall) elif srvtype == gdata.SRV_TYPE_CENTER: jstr = _communicateServer(_centerServer, groupVal, groupVal, msgpack, 'RQ', syncCall) else: raise Exception('ERROR RPC cmd route false !!' + cmd + '.' + action) ret = None if syncCall and jstr: mo = MsgPack() try: mo.unpack(jstr) except: raise Exception('the json data error 5 !! [' + repr(jstr) + ']') ret = mo.getKey('result') return ret
def onMsgTableBegin(self): ftlog.debug('|self.roomId:', self.roomId, caller=self) roomTypeName = gdata.roomIdDefineMap()[self.roomId].configure['typeName'] # if roomTypeName in (rooms.tyRoomConst.ROOM_TYPE_NAME_NORMAL, # rooms.tyRoomConst.ROOM_TYPE_NAME_QUEUE, # rooms.tyRoomConst.ROOM_TYPE_NAME_SNG, # rooms.tyRoomConst.ROOM_TYPE_NAME_HUNDREDS, # rooms.tyRoomConst.ROOM_TYPE_NAME_DTG): # self._enterRoom() if roomTypeName in (rooms.tyRoomConst.ROOM_TYPE_NAME_CUSTOM): self._enterTable() # if roomTypeName == rooms.tyRoomConst.ROOM_TYPE_NAME_MTT: # self._signinMtt() return
def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly): try: chip = userchip.getChip(userId) ftlog.debug(gdata.roomIdDefineMap()[roomId].configure, caller=cls) roomConfig = gdata.roomIdDefineMap()[roomId].configure ismatch = roomConfig.get('ismatch') isBigMatch = False if roomConfig.get('typeName', '') == 'majiang_bigmatch': isBigMatch = True if ismatch and not isBigMatch: return cls._canQuickEnterMatch(userId, gameId, roomId, chip) if isOnly: minCoinQs = roomConfig['minCoin'] maxCoinQs = roomConfig['maxCoin'] else: minCoinQs = roomConfig['minCoinQS'] maxCoinQs = roomConfig['maxCoinQS'] if minCoinQs <= 0: return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED ftlog.debug('roomId =', roomId, 'minCoinQs =', minCoinQs, 'maxCoinQs =', maxCoinQs, 'chip =', chip, caller=cls) if chip < minCoinQs: return TYRoom.ENTER_ROOM_REASON_LESS_MIN if maxCoinQs > 0 and chip >= maxCoinQs: return TYRoom.ENTER_ROOM_REASON_GREATER_MAX return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def _remoteCall(markParams, argl, argd): srvtype = markParams['remoteServerType'] syncCall = markParams['remoteSyncCall'] remoteGroupByIndex = markParams['remoteGroupByIndex'] remoteGroupBy = markParams['remoteGroupBy'] cmd = markParams['remoteCmd'] action = markParams['remoteAction'] groupVal = argl[remoteGroupByIndex] msgpack = MsgPack() msgpack.setCmdAction(cmd, action) msgpack.setParam(remoteGroupBy, groupVal) msgpack.setParam('argl', argl[1:]) # 去掉self, cls msgpack.setParam('argd', argd) msgpack.setParam('clientId', configure.CLIENTID_RPC) msgpack = msgpack.pack() jstr = None if srvtype == gdata.SRV_TYPE_UTIL: jstr = _communicateServer(_utilServer, groupVal, groupVal, msgpack, 'RQ', syncCall) elif srvtype == gdata.SRV_TYPE_ROOM: assert (groupVal in gdata.roomIdDefineMap()) jstr = _communicateRoomServer(0, groupVal, msgpack, 'RQ', syncCall) elif srvtype == gdata.SRV_TYPE_TABLE: assert (groupVal in gdata.roomIdDefineMap()) jstr = _communicateTableServer(0, groupVal, msgpack, 'RQ', syncCall) elif srvtype == gdata.SRV_TYPE_CENTER: jstr = _communicateServer(_centerServer, groupVal, groupVal, msgpack, 'RQ', syncCall) else: raise Exception('ERROR RPC cmd route false !!' + cmd + '.' + action) ret = None if syncCall and jstr: mo = MsgPack() try: mo.unpack(jstr) except: raise Exception('the json data error 5 !! [' + repr(jstr) + ']') ret = mo.getKey('result') return ret
def _sendMatchSignsToUser(self, userId, gameId, clientId): signs = {} for roomdef in gdata.roomIdDefineMap().values(): if roomdef.shadowId == 0 and roomdef.configure.get('ismatch'): roomId = roomdef.roomId issignin = daobase.executeTableCmd(roomId, 0, 'SISMEMBER', 'signs:' + str(roomId), userId) if issignin: signs[roomdef.bigRoomId] = 1 if signs: mo = MsgPack() mo.setCmd('m_signs') mo.setResult('gameId', gameId) mo.setResult('userId', userId) mo.setResult('signs', signs) router.sendToUser(mo, userId)
def _getRoomOnLineUserCount(gameId, withShadowRoomInfo): ''' 重BI数据库中取得当前的游戏的所有的在线人数信息 return allcount, counts, details, allobcount, obcounts, obdetails allcount int,游戏内所有房间的人数的总和 counts 字典dict,key为大房间ID(bigRoomId),value为该大房间内的人数总和 details 字典dict,key为房间实例ID(roomId),value为该房间内的人数 allobcount, obcounts, obdetails 观察者数量,需要table类实现observersNum属性 此数据由每个GR,GT进程每10秒钟向BI数据库进行汇报一次 ''' rkey = daoconst.BI_KEY_ROOM_ONLINES % (gameId) datas = daobase._executeBiCmd('HGETALL', rkey) counts = {} details = {} allcount = 0 allobcount = 0 obdetails = {} obcounts = {} if datas: allrooms = gdata.roomIdDefineMap() for x in xrange(len(datas) / 2): i = x * 2 roomId = int(datas[i]) roomConf = allrooms.get(roomId, None) if roomConf: bigRoomId = str(roomConf.bigRoomId) tks = datas[i + 1].split('|') ucount, ocount = strutil.parseInts(tks[0], tks[-1]) ucount += roomConf.configure.get('dummyUserCount', 0) if withShadowRoomInfo: details[str(roomId)] = ucount if bigRoomId in counts: counts[bigRoomId] += ucount else: counts[bigRoomId] = ucount allcount += ucount if withShadowRoomInfo: obdetails[str(roomId)] = ocount if bigRoomId in obcounts: obcounts[bigRoomId] += ocount else: obcounts[bigRoomId] = ocount allobcount += ocount else: daobase._sendBiCmd('HDEL', rkey, roomId) return allcount, counts, details, allobcount, obcounts, obdetails
def callUpRobot(self, msg, roomId, tableId, userCount, seatCount, users): ''' 唤醒机器人 (由TABLE进程SEND命令触发, 无需响应) 检查该桌子是否需要进入机器人 具体的机器人进入策略由各个游戏自己负责 ''' ftlog.debug("<<|roomId, tableId, userCount, seatCount, users:", roomId, tableId, userCount, seatCount, users) roomConf = gdata.roomIdDefineMap()[roomId].configure delay = roomConf.get('robotUserCallUpTime', -1) if delay < 0: if self.callUpDelaySecond < 0: delay = 0 else: delay = random.randint(0, self.callUpDelaySecond) # 随机延迟进入 evt = RobotEvent(delay, 'callup', msg, roomId, tableId, userCount, seatCount, users) self.eventQueue.append(evt) return
def _chooseCreateRoom(cls, userId, gameId, playMode, playerCount=4): """ 服务端为玩家选择要创建的房间 """ candidateRoomIds = MajiangQuickStartV4_0._getCandidateRoomIds(gameId, playMode) ftlog.debug("<<|candidateRoomIds:", candidateRoomIds, 'playMode=', playMode, caller=cls) for roomId in candidateRoomIds: roomConfig = gdata.roomIdDefineMap()[roomId].configure tableConf = roomConfig.get('tableConf', {}) ftlog.debug('_chooseCreateRoom tableConf:', tableConf) if roomConfig.get(MFTDefine.IS_CREATE, 0) and (tableConf.get(MTDefine.MAXSEATN, 4) == playerCount): ret = cls._canQuickEnterCreateRoom(userId, gameId, roomId) ftlog.debug("|roomId, ret:", roomId, ret, caller=cls) if ret == TYRoom.ENTER_ROOM_REASON_OK: return roomId, TYRoom.ENTER_ROOM_REASON_OK return 0, TYRoom.ENTER_ROOM_REASON_LESS_MIN
def adjustChip(self, minCoin=None, maxCoin=None): if not isinstance(minCoin, int) or not isinstance(maxCoin, int) \ or minCoin < 0 or maxCoin < 0 or minCoin >= maxCoin: roomDef = gdata.roomIdDefineMap()[self.roomId] roomConf = roomDef.configure maxCoin = roomConf['maxCoin'] minCoin = roomConf['minCoin'] maxCoin = maxCoin if maxCoin > 0 else minCoin + 100000 uchip = userchip.getChip(self.userId) ftlog.debug('adjustChip->userId, uchip, minCoin, maxCoin =', self.snsId, self.userId, uchip, minCoin, maxCoin) if uchip < minCoin or uchip > maxCoin: nchip = random.randint(minCoin + 1, minCoin + 1000) dchip = nchip - uchip trueDelta, finalCount = userchip.incrChip(self.userId, self.gameId, dchip, daoconst.CHIP_NOT_ENOUGH_OP_MODE_NONE, 'SYSTEM_ADJUST_ROBOT_CHIP', self.roomId, self.clientId) ftlog.debug('adjustChip->userId, trueDelta, finalCount=', self.snsId, self.userId, trueDelta, finalCount)
def doHallSigns(self): msg = runcmd.getMsgPack() ftlog.debug('msg=', msg) gameId = msg.getParam("gameId") userId = msg.getParam("userId") msgRes = MsgPack() msgRes.setCmd('m_signs') msgRes.setResult('gameId', gameId) msgRes.setResult('userId', userId) signs = {} for roomdef in gdata.roomIdDefineMap().values(): if roomdef.shadowId == 0 and roomdef.configure.get('ismatch'): roomId = roomdef.roomId issignin = daobase.executeTableCmd(roomId, 0, 'SISMEMBER', 'signs:' + str(roomId), userId) if issignin: signs[roomdef.bigRoomId] = 1 msgRes.setResult('signs', signs) router.sendToUser(msgRes, userId)
def _do_http_gm_playing_table_list(self, gameId, httpRequest, httpArgs, httpResult): '''获取某个房间正在玩的牌桌列表''' bigRoomId = int(httpArgs['bigRoomId']) ctrlRoomIds = gdata.bigRoomidsMap()[bigRoomId] playingTableList = [] for ctrlRoomId in ctrlRoomIds: roomDef = gdata.roomIdDefineMap()[ctrlRoomId] for shadowRoomId in roomDef.shadowRoomIds: msg = utils.updateMsg(cmd='table', params={ 'action': 'gm', 'sa': 'playingTableList', 'gameId': gameId, 'roomId': shadowRoomId, 'tableId': shadowRoomId * 10000 + 1, }) ret = router.queryTableServer(msg, shadowRoomId) ftlog.debug('_do_http_gm_playing_table_list| shadowRoomId, ret:', shadowRoomId, ret) playingTableList += strutil.loads(ret)['result']['playingTableList'] httpResult['playingTableList'] = playingTableList
def __initializeRooms(gdatas): ''' 初始化所有的房间对象 ''' if _DEBUG: debug('initializeRooms begin') from poker.entity.game.rooms import getInstance srvid = gdata.serverId() roomids = gdata.srvIdRoomIdListMap().get(srvid, None) if roomids: tyrooms = {} gdatas['tyrooms.instance.dict'] = tyrooms allrooms = gdata.roomIdDefineMap() for roomid in roomids: roomdefine = allrooms[roomid] roomins = getInstance(roomdefine) assert (isinstance(roomins, TYRoom)) tyrooms[roomid] = roomins gdatas['tyrooms.instance.dict'] = makeReadonly(tyrooms) if _DEBUG: debug('initializeRooms end')
def _communicateTableServer(userId, roomId, msgpack, head1, isQuery, timeout=None, notimeoutex=0): if timeout == None: timeout = _runenv._RPC_TIME_OUT assert (isinstance(msgpack, (MsgPack, basestring))) assert (isinstance(roomId, (int, long)) and roomId >= 0) assert (isinstance(userId, (int, long)) and userId >= 0) allrooms = gdata.roomIdDefineMap() if roomId in allrooms: roomDef = allrooms[roomId] if roomDef.parentId == 0: ftlog.warn('ERROR, cat not localtion the roomId of->', userId, roomId, msgpack) return else: # this roomId is big roomId assert (isinstance(userId, (int, long)) and userId >= 0) bigrooms = gdata.bigRoomidsMap() if roomId in bigrooms: msgpack, shadowRoomId = __getRoomIdByTableId(msgpack) ftlog.debug('_communicateTableServer allrooms = ', allrooms, 'shadowRoomId =', shadowRoomId) if shadowRoomId: roomDef = allrooms[shadowRoomId] else: ftlog.warn('ERROR, cat not localtion the roomId of->', userId, roomId, msgpack) return else: ftlog.warn('ERROR, cat not localtion the roomId of->', userId, roomId, msgpack) return if isinstance(msgpack, MsgPack): msgpack = msgpack.pack() dst = roomDef.serverId ftlog.debug('_communicateTableServer->dst=', dst, 'head1=', head1, 'roomId=', str(roomId), 'timeout=', timeout, 'msgpack=[' + msgpack + ']') if isQuery: response = wrapper.query(dst, msgpack, head1, str(roomId), timeout, notimeoutex=notimeoutex) ftlog.debug('_communicateTableServer->dst=', dst, 'head1=', head1, 'roomId=', str(roomId), 'response=[' + str(response) + ']') return response else: return wrapper.send(dst, msgpack, head1, str(roomId))
def enterOneTable(self, userId, shadowRoomId, tableId): '''指定桌子坐下 Returns False: 重试超过次数 ''' if ftlog.is_debug(): ftlog.debug("<< |userId, roomId, shadowRoomId, tableId", userId, self.roomId, shadowRoomId, tableId, caller=self) if gdata.roomIdDefineMap()[shadowRoomId].tableCount == 1: return tableId for _ in xrange(5): # 这张桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试 result = daobase.executeTableCmd(shadowRoomId, 0, "ZREM", self.getTableScoresKey(shadowRoomId), tableId) if ftlog.is_debug(): ftlog.debug("after ZREM tableId", "|userId, shadowRoomId, tableId, result:", userId, shadowRoomId, tableId, result, caller=self) if result == 1: return tableId FTTasklet.getCurrentFTTasklet().sleepNb(1) return 0
def doAwardCertificate(self, userId, gameId, match_id, clientId): ''' TCP 发送的至UTIL服务的quick_start暂时不能用lock userid的方式, 因为,消息流 CO->UT->GR->GT->UT会死锁 ''' msg = runcmd.getMsgPack() roomId = msg.getParam("roomId") ftlog.debug('doAwardCertificate', userId, gameId, roomId, match_id, caller=self) if len(str(roomId)) != 4 and len(str(roomId)) != 8 and len(str(roomId)) != 0: roomIdx = roomId roomId = roomId * 100 ftlog.info("doAwardCertificate roomID error, from %d change to %d" % (roomIdx, roomId)) allrooms = gdata.roomIdDefineMap() ctrlRoomId = roomId if roomId in allrooms: roomDef = allrooms[roomId] if roomDef.parentId > 0: # this roomId is shadowRoomId ctrlRoomId = roomDef.parentId else: ftlog.warn("doAwardCertificate, error roomId", roomId) return ftlog.debug("ctrlRoomId:", ctrlRoomId) msg1 = MsgPack() msg1.setCmd('room') msg1.setParam('gameId', gameId) msg1.setParam('userId', userId) msg1.setParam('roomId', ctrlRoomId) msg1.setParam('action', "match_award_certificate") msg1.setParam('match_id', match_id) msg1.setParam('clientId', clientId) router.sendRoomServer(msg1, roomId) if router.isQuery(): mo = runcmd.newOkMsgPack(1) router.responseQurery(mo, '', str(userId))
def _communicateRoomServer(userId, roomId, msgpack, head1, isQuery, timeout=None, notimeoutex=0): if timeout == None: timeout = _runenv._RPC_TIME_OUT assert (isinstance(msgpack, (MsgPack, basestring))) assert (isinstance(roomId, (int, long)) and roomId >= 0) allrooms = gdata.roomIdDefineMap() if roomId in allrooms: roomDef = allrooms[roomId] if roomDef.parentId > 0: # this roomId is shadowRoomId ctrlRoomId = roomDef.parentId roomDef = allrooms[ctrlRoomId] msgpack = __changeMsgRoomId(msgpack, ctrlRoomId, roomId) else: # this roomId is big roomId assert (isinstance(userId, (int, long)) and userId >= 0) bigrooms = gdata.bigRoomidsMap() if roomId in bigrooms: ctrlroomIds = bigrooms[roomId] ctrlRoomId = ctrlroomIds[userId % len(ctrlroomIds)] # ctrlRoom0 做为 ctrlRooms 的调度器 roomDef = allrooms[ctrlRoomId] msgpack = __changeMsgRoomId(msgpack, ctrlRoomId, roomId) else: ftlog.warn('ERROR, cat not localtion the roomId of->', userId, roomId, msgpack) return if isinstance(msgpack, MsgPack): msgpack = msgpack.pack() dst = roomDef.serverId ftlog.debug('_communicateRoomServer->dst=', dst, 'head1=', head1, 'roomId=', str(roomId), 'timeout=', timeout, 'msgpack=[' + msgpack + ']') if isQuery: response = wrapper.query(dst, msgpack, head1, str(roomId), timeout, notimeoutex=notimeoutex) ftlog.debug('_communicateRoomServer->dst=', dst, 'head1=', head1, 'roomId=', str(roomId), 'response=[' + str(response) + ']') return response else: return wrapper.send(dst, msgpack, head1, str(roomId))