Example #1
0
File: gm.py Project: zhaozw/hall37
    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
Example #2
0
 def buildMatch(cls, conf, room):
     match = None
     master = None
     ctrlRoomIdList = gdata.bigRoomidsMap().get(room.bigRoomId, [])
     if conf.start.isUserCountType():
         conf.start.userMaxCountPerMatch = conf.start.userMaxCount
         conf.start.signinMaxCount = conf.start.signinMaxCount
     else:
         conf.start.userMaxCountPerMatch = int(conf.start.userMaxCount / max(len(ctrlRoomIdList), 1))
         conf.start.signinMaxCountPerMatch = int(conf.start.signinMaxCount / max(len(ctrlRoomIdList), 1))
         
     if cls.isMaster(conf, room):
         master, match = cls.buildMaster(conf, room)
         room.matchMaster = master
     else:
         match = cls.buildArea(conf, room)
     ftlog.info('GroupMatch.buildMatch roomId=', room.roomId,
                'ctrlRoomIdList=', ctrlRoomIdList,
                'ctrlRoomCount=', len(ctrlRoomIdList),
                'userMaxCount=', conf.start.userMaxCount,
                'userMaxCountPerMatch=', conf.start.userMaxCountPerMatch,
                'signinMaxCount=', conf.start.signinMaxCount,
                'signinMaxCountPerMatch=', conf.start.signinMaxCountPerMatch)
     if master:
         master.matchStatusDao = MatchStatusDaoDizhu(room)
     match.signIF = SignIFDizhu(room, conf.tableId, conf.seatId)
     match.tableController= TableControllerDizhu(room)
     match.playerNotifier = PlayerNotifierDizhu(room)
     match.matchRewards = MatchRewardsDizhu(room)
     match.userInfoLoader = UserInfoLoaderDizhu()
     return match, master
Example #3
0
    def buildMatch(self):
        ctrlRoomIdList = gdata.bigRoomidsMap().get(self.bigRoomId, [])
        if self.conf.start.isUserCountType():
            self.conf.start.userMaxCountPerMatch = self.conf.start.userMaxCount
            self.conf.start.signinMaxCount = self.conf.start.signinMaxCount
        else:
            self.conf.start.userMaxCountPerMatch = int(self.conf.start.userMaxCount / max(len(ctrlRoomIdList), 1))
            self.conf.start.signinMaxCountPerMatch = int(self.conf.start.signinMaxCount / max(len(ctrlRoomIdList), 1))

        master = None
        if self.isMaster:
            master, match = self.buildMaster()
        else:
            match = self.buildArea()
        ftlog.info('DizhuGroupMatchCtrlRoom.buildMatch roomId=', self.roomId,
                   'ctrlRoomIdList=', ctrlRoomIdList,
                   'ctrlRoomCount=', len(ctrlRoomIdList),
                   'userMaxCount=', self.conf.start.userMaxCount,
                   'userMaxCountPerMatch=', self.conf.start.userMaxCountPerMatch,
                   'signinMaxCount=', self.conf.start.signinMaxCount,
                   'signinMaxCountPerMatch=', self.conf.start.signinMaxCountPerMatch)
        if master:
            master.matchStatusDao = MatchStatusDaoDizhu(self)
        match.signIF = SignIFDizhu(self, self.conf.tableId, self.conf.seatId)
        match.tableController= TableControllerDizhu(self)
        match.playerNotifier = PlayerNotifierDizhu(self)
        match.matchRankRewardsSelector = MatchRankRewardsSelectorDizhu(self)
        match.matchRewards = MatchRewardsDizhu(self)
        match.userInfoLoader = UserInfoLoaderDizhu()
        return match, master
Example #4
0
 def getRealRoomIdListWithBigRoomId(cls, roomId):
     '''
     获取某个房间的真实房间ID
     :param roomId是配置中的ID,如:6015
     :return 返回真实ID的元组,如:(60151000, ...)
     '''
     return gdata.bigRoomidsMap()[roomId]
Example #5
0
def collectCtrlRoomIdsByFTPlayMode(ftPlayMode):
    bigRoomIds = gdata.gameIdBigRoomidsMap().get(DIZHU_GAMEID)
    ctrlRoomIds = []
    for bigRoomId in bigRoomIds:
        roomConf = gdata.getRoomConfigure(bigRoomId)
        if ((roomConf.get('typeName') in ('dizhuFT', 'dizhu_friend')) 
            and ftPlayMode == roomConf.get('ftPlayMode')):
            ctrlRoomIds.extend(gdata.bigRoomidsMap().get(bigRoomId, []))
    ctrlRoomIds.sort()
    return ctrlRoomIds
Example #6
0
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))
Example #7
0
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)
Example #8
0
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)
Example #9
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)
Example #10
0
 def buildMaster(cls, conf, room):
     ftlog.info('GroupMatch.buildMaster roomId=', room.roomId)
     master = MatchMaster(room, room.bigmatchId, conf)
     area = MatchArea(room, room.bigmatchId, conf, MatchMasterStubLocal(master))
     master.addAreaStub(MatchAreaStubLocal(master, area))
     if not conf.start.isUserCountType():
         ctrlRoomIdList = gdata.bigRoomidsMap().get(room.bigRoomId, [])
         for ctrlRoomId in ctrlRoomIdList:
             if ctrlRoomId != area.roomId:
                 master.addAreaStub(MatchAreaStubRemote(master, ctrlRoomId))
     return master, area
Example #11
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)
Example #12
0
    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
Example #13
0
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)
Example #14
0
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))
Example #15
0
 def buildMaster(self):
     ftlog.info('DizhuGroupCtrlRoom.buildMaster'
                'roomId=', self.roomId,
                'masterRoomId=', self.masterRoomId,
                'isMaster=', self.isMaster,
                'bigmatchId=', self.bigmatchId)
     master = MatchMaster(self, self.bigmatchId, self.conf)
     area = MatchArea(self, self.bigmatchId, self.conf, MatchMasterStubLocal(master))
     master.addAreaStub(MatchAreaStubLocal(master, area))
     if not self.conf.start.isUserCountType():
         ctrlRoomIdList = gdata.bigRoomidsMap().get(self.bigRoomId, [])
         for ctrlRoomId in ctrlRoomIdList:
             if ctrlRoomId != area.roomId:
                 master.addAreaStub(MatchAreaStubRemote(master, ctrlRoomId))
     return master, area
Example #16
0
    def _canQuickStartDizhuMatch(cls, userId, gameId, roomId, playMode):
        '''
        检测比赛房间是否符合快开条件
        @return ok{Bool} 是否满足条件进入地主比赛
        '''
        roomconf = gdata.roomIdDefineMap()[roomId].configure

        bigRoomId = gdata.getBigRoomId(roomId)
        ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
        ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]
        reason = cls._canQuickEnterMatchRoom(userId, gameId, ctrlRoomId, 1)
        ftlog.debug(
            "DizhuQuickStartV4_0._canQuickStartDizhuMatch: roomCond|userId=",
            userId, "roomId=", roomId, "bigRoomId=", bigRoomId, "ctrlRoomId=",
            ctrlRoomId, "reason=", reason)
        if reason != TYRoom.ENTER_ROOM_REASON_OK:
            return False

        # 若不存在开关,或者开关为0,代表房间关闭比赛快开
        quickMatchToggle = roomconf.get("quickMatchToggle", 0)
        ftlog.debug("DizhuQuickStartV4_0._canQuickStartDizhuMatch: userId=",
                    userId, "roomId=", roomId, "quickMatchToggle=",
                    quickMatchToggle)
        if quickMatchToggle == 0:
            return False

        # 获取选择比赛快开的条件列表
        coin_toplimit = roomconf.get("quickMatchCoinTopLimit", 0)

        # 获得用户的coin
        chip = userchip.getChip(userId)
        ftlog.debug("DizhuQuickStartV4_0._canQuickStartDizhuMatch: userId=",
                    userId, "roomId=", roomId, "chip=", chip, "coin_toplimit",
                    coin_toplimit)

        # 直接去比赛,不判断金币
        if playMode == dizhuconf.PLAYMODE_STRAIGHT_MATCH:
            return True

        if chip < coin_toplimit:
            return True

        return False
Example #17
0
File: gm.py Project: zhaozw/hall37
    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
Example #18
0
    def buildMatch(cls, conf, room):
        ctrlRoomIdList = gdata.bigRoomidsMap().get(room.bigRoomId, [])
        if conf.start.isUserCountType():
            conf.start.userMaxCountPerMatch = conf.start.userMaxCount
            conf.start.signinMaxCount = conf.start.signinMaxCount
        else:
            conf.start.userMaxCountPerMatch = int(conf.start.userMaxCount /
                                                  max(len(ctrlRoomIdList), 1))
            conf.start.signinMaxCountPerMatch = int(
                conf.start.signinMaxCount / max(len(ctrlRoomIdList), 1))

        master = MatchMaster(room, conf)
        master.matchStatusDao = MatchStatusDaoRedis(room)
        master.matchFactory = ErdayiMatchFactory()
        area = MatchAreaLocal(master, room, conf)
        master.addArea(area)

        if conf.matchId3:
            cls.checkMatchingSequence(room, conf.matchId3)
        ftlog.info('ErdayiMatch.buildMatch roomId=', room.roomId,
                   'ctrlRoomIdList=', ctrlRoomIdList, 'ctrlRoomCount=',
                   len(ctrlRoomIdList), 'userMaxCount=',
                   conf.start.userMaxCount, 'userMaxCountPerMatch=',
                   conf.start.userMaxCountPerMatch, 'signinMaxCount=',
                   conf.start.signinMaxCount, 'signinMaxCountPerMatch=',
                   conf.start.signinMaxCountPerMatch)

        master.matchStatusDao = MatchStatusDaoRedis(room)

        area.signinRecordDao = SigninRecordDaoRedis(room.gameId)
        area.tableController = TableControllerErdayi(area)
        area.playerNotifier = PlayerNotifierErday(room)
        area.matchRewards = MatchRewardsErdayi(room)
        area.matchUserIF = MatchUserIFErdayi(room, conf.tableId, conf.seatId)
        area.signerInfoLoader = SignerInfoLoaderErdayi()
        area.matchFactory = ErdayiMatchFactory()
        area.signinFee = SigninFeeErdayi(room)

        return area, master
Example #19
0
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))
Example #20
0
    def buildMatch(self):
        ctrlRoomIdList = gdata.bigRoomidsMap().get(self.bigRoomId, [])
        if self.conf.start.isUserCountType():
            self.conf.start.userMaxCountPerMatch = self.conf.start.userMaxCount
            self.conf.start.signinMaxCount = self.conf.start.signinMaxCount
        else:
            self.conf.start.userMaxCountPerMatch = int(
                self.conf.start.userMaxCount / max(len(ctrlRoomIdList), 1))
            self.conf.start.signinMaxCountPerMatch = int(
                self.conf.start.signinMaxCount / max(len(ctrlRoomIdList), 1))

        master = MatchMaster(self, self.conf)
        master.matchStatusDao = MatchStatusDaoRedis(self)
        master.matchFactory = ErdayiMatchFactory()
        area = MatchAreaLocal(master, self, self.conf)
        master.addArea(area)

        if self.conf.matchId3:
            self.checkMatchingSequence(self, self.conf.matchId3)

        ftlog.info('DizhuErdayiMatchCtrlRoom.buildMatch roomId=', self.roomId,
                   'ctrlRoomIdList=', ctrlRoomIdList, 'ctrlRoomCount=',
                   len(ctrlRoomIdList), 'userMaxCount=',
                   self.conf.start.userMaxCount, 'userMaxCountPerMatch=',
                   self.conf.start.userMaxCountPerMatch, 'signinMaxCount=',
                   self.conf.start.signinMaxCount, 'signinMaxCountPerMatch=',
                   self.conf.start.signinMaxCountPerMatch)

        area.signinRecordDao = SigninRecordDaoRedis(self.gameId)
        area.tableController = TableControllerErdayi(area)
        area.playerNotifier = PlayerNotifierErday(self)
        area.matchRewards = MatchRewardsErdayi(self)
        area.matchUserIF = MatchUserIFErdayi(self, self.conf.tableId,
                                             self.conf.seatId)
        area.signerInfoLoader = SignerInfoLoaderErdayi()
        area.matchFactory = ErdayiMatchFactory()
        area.signinFee = SigninFeeErdayi(self)

        return area, master
Example #21
0
    def _chooseDizhuMatchRoom(cls, userId, gameId, playMode):
        '''
        地主专属,选择一个比赛场返回
        @return1 roomid{int}: 比赛房间的ID
        @return2 ok{Bool}: 是否成功匹配到房间
        '''
        if gameId != 6:
            return 0, False

        #1.获取所有符合条件的比赛场
        ctrlroomid_list = cls._getDizhuMatchCandidateRoomIds()
        ftlog.debug('DizhuQuickStartV4_0._chooseDizhuMatchRoom: userId=',
                    userId, 'ctrlroomid_list=', ctrlroomid_list)

        #2.选快开比赛房间
        for roomid in ctrlroomid_list:
            ok = cls._canQuickStartDizhuMatch(userId, gameId, roomid, playMode)
            if ok == True:
                ftlog.debug(
                    "DizhuQuickStartV4_0._chooseDizhuMatchRoom: before userId=",
                    userId, "roomid=", roomid)

                bigRoomId = gdata.getBigRoomId(roomid)
                if bigRoomId == 0:
                    break
                ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
                ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]

                ftlog.debug(
                    "DizhuQuickStartV4_0._chooseDizhuMatchRoom: after userId=",
                    userId, "roomid=", roomid, "bigRoomId=", bigRoomId,
                    'ctrlRoomId=', ctrlRoomId)
                return ctrlRoomId, True

        ftlog.debug('DizhuQuickStartV4_0._chooseDizhuMatchRoom->exit', 0,
                    False, "userId=", userId)
        return 0, False
Example #22
0
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))
Example #23
0
 def getMasterRoomId(self):
     if self.conf.start.isUserCountType():
         return self.roomId
     ctrlRoomIdList = sorted(gdata.bigRoomidsMap().get(self.bigRoomId, []))
     return ctrlRoomIdList[0]
Example #24
0
 def _check_param_bigRoomId(self, msg, key, params):
     roomId = msg.getParam('roomId')
     if roomId in gdata.bigRoomidsMap():
         return None, roomId
     return 'ERROR of big roomId !' + str(roomId), None
Example #25
0
 def getMasterRoomId(cls, conf, room):
     if conf.start.isUserCountType():
         return room.roomId
     ctrlRoomIdList = sorted(gdata.bigRoomidsMap().get(room.bigRoomId, []))
     return ctrlRoomIdList[0]
Example #26
0
    def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, playMode,
                        clientId):
        '''UT server中处理来自客户端的quick_start请求  
        Args:
            msg
                cmd : quick_start
                if roomId == 0:
                    表示快速开始,服务器为玩家选择房间,然后将请求转给GR
                    
                if roomId > 0 and tableId == 0 : 
                    表示玩家选择了房间,将请求转给GR
                    
                if roomId > 0 and tableId == roomId * 10000 :
                    表示玩家在队列里断线重连,将请求转给GR
                    
                if roomId > 0 and tableId > 0:
                    if onlineSeatId > 0: 
                        表示玩家在牌桌里断线重连,将请求转给GT
                    else:
                        表示玩家选择了桌子,将请求转给GR
        '''
        assert isinstance(userId, int) and userId > 0
        assert isinstance(roomId, int) and roomId >= 0
        assert isinstance(tableId, int) and tableId >= 0
        ftlog.debug("MajiangQuickStartV4_0.onCmdQuickStart clientId:",
                    clientId, " userId:", userId, " roomId:", roomId,
                    " tableId:", tableId, " gameId:", gameId, " playMode:",
                    playMode)

        isCreate = False
        if roomId > 0:
            isCreate = cls.isFriendRoom(roomId)

        isReconnect = False
        # 单开, 无论何时quick_start进入都检查loc
        if not pokerconf.isOpenMoreTable(clientId):
            loc = onlinedata.checkUserLoc(userId, clientId, gameId)
            ftlog.debug('MajiangQuickStartV4_0.onCmdQuickStart 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 isCreate and (lroomId == 0) and (ltableId == 0):
                    # 好友桌的快速开始必须有loc,没有loc则进桌失败
                    ftlog.debug(
                        'MajiangQuickStartV4_0.onCmdQuickStart room is friendTable, loc is 0, means, table is dissolved...'
                    )
                    cls._onEnterRoomFailed(
                        msg, TYRoom.ENTER_ROOM_REASON_FRIEND_DISSOLVE, userId,
                        clientId, roomId)
                    return

                if lgameId == gameId and lroomId > 0:
                    roomId = lroomId
                    tableId = ltableId
                    isReconnect = True
                    ftlog.debug(
                        'MajiangQuickStartV4_0.onCmdQuickStart old client roomId:',
                        roomId,
                        ' tableId:',
                        tableId,
                        caller=cls)

        if (not isReconnect) and roomId > 0 and tableId > 0:
            reason = cls._canQuickEnterRoom(userId, gameId, roomId, 1)
            if reason != TYRoom.ENTER_ROOM_REASON_OK:
                cls._onEnterRoomFailed(msg, reason, userId, gameId, clientId,
                                       roomId)
                return

        if roomId == 0:  # 玩家点击快速开始
            chosenRoomId, checkResult = cls._chooseRoom(
                userId, gameId, playMode)
            ftlog.info(
                "MajiangQuickStartV4_0.onCmdQuickStart after choose room userId:",
                userId,
                " chosenRoomId:",
                chosenRoomId,
                " checkResult:",
                checkResult,
                caller=cls)
            if checkResult == TYRoom.ENTER_ROOM_REASON_OK:
                #找到合适的房间 根据roomId找到合适的table
                TYRoomMixin.queryRoomQuickStartReq(msg, chosenRoomId,
                                                   0)  # 请求转给GR
            else:
                candidateRoomIds = cls._getCandidateRoomIds(gameId, playMode)
                if candidateRoomIds:
                    rid = candidateRoomIds[0]
                    msg.setParam('candidateRoomId', rid)
                cls._onEnterRoomFailed(msg, checkResult, userId, clientId,
                                       roomId)
            return

        if tableId == 0:  # 玩家只选择了房间
            bigRoomId = gdata.getBigRoomId(roomId)
            if bigRoomId == 0:
                cls._onEnterRoomFailed(msg,
                                       TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR,
                                       userId, gameId, clientId, roomId)
                return
            ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
            ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]

            reason = cls._canQuickEnterRoom(userId, gameId, ctrlRoomId, 1)
            if reason == TYRoom.ENTER_ROOM_REASON_OK:
                TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId,
                                                   0)  # 请求转给GR或GT
            else:
                cls._onEnterRoomFailed(msg, reason, userId, gameId, clientId,
                                       roomId)
            return

        if tableId == roomId * 10000:  # 玩家在队列里断线重连
            TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId)  # 请求转给GR
            return

        onlineSeat = onlinedata.getOnlineLocSeatId(userId, roomId, tableId)

        if onlineSeat:
            extParam = {}
            extParam['seatId'] = onlineSeat
            moParams = msg.getKey('params')
            for k, v in moParams.items():
                if not k in extParam:
                    extParam[k] = v
            ftlog.debug('extParam=', extParam)
            TYRoomMixin.querySitReq(userId, roomId, tableId, clientId,
                                    extParam)  # 玩家断线重连,请求转给GT
        else:  # 玩家选择了桌子,
            shadowRoomId = tableId / 10000
            ctrRoomId = gdata.roomIdDefineMap()[shadowRoomId].parentId
            TYRoomMixin.queryRoomQuickStartReq(
                msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId)  # 请求转给GR
Example #27
0
    def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, playMode, clientId):
        '''UT server中处理来自客户端的quick_start请求  
        Args:
            msg
                cmd : quick_start
                if roomId == 0:
                    表示快速开始,服务器为玩家选择房间,然后将请求转给GR
                    
                if roomId > 0 and tableId == 0 : 
                    表示玩家选择了房间,将请求转给GR
                    
                if roomId > 0 and tableId == roomId * 10000 :
                    表示玩家在队列里断线重连,将请求转给GR
                    
                if roomId > 0 and tableId > 0:
                    if onlineSeatId > 0: 
                        表示玩家在牌桌里断线重连,将请求转给GT
                    else:
                        表示玩家选择了桌子,将请求转给GR
        '''
        assert isinstance(userId, int) and userId > 0
        assert isinstance(roomId, int) and roomId >= 0
        assert isinstance(tableId, int) and tableId >= 0

        ftlog.debug("<< |clientId:", clientId,
                    "|userId, roomId, tableId:", userId, roomId, tableId,
                    "|gameId, playMode:", gameId, playMode, caller=cls)

        isReconnect = False

        # 单开, 无论何时quick_start进入都检查loc
        if not pokerconf.isOpenMoreTable(clientId):
            loc = onlinedata.checkUserLoc(userId, clientId, gameId)
            ftlog.debug('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:
                    roomId = lroomId
                    tableId = ltableId
                    isReconnect = True
                    ftlog.debug('old client, reset roomId, tableId->', roomId, tableId, caller=cls)

        if (not isReconnect) and roomId > 0 and tableId > 0:
            reason = cls._canQuickEnterRoom(userId, gameId, roomId, 1)
            if reason != TYRoom.ENTER_ROOM_REASON_OK:
                cls._onEnterRoomFailed(msg, reason, userId, gameId, clientId, roomId)
                return

        if roomId == 0:  # 玩家点击快速开始
            chosenRoomId, checkResult = cls._chooseRoom(userId, gameId, playMode)
            ftlog.info("after choose room", "|userId, chosenRoomId, checkResult:", userId, chosenRoomId, checkResult,
                       caller=cls)
            if checkResult == TYRoom.ENTER_ROOM_REASON_OK:
                # 找到合适的房间 根据roomId找到合适的table

                TYRoomMixin.queryRoomQuickStartReq(msg, chosenRoomId, 0)  # 请求转给GR
            else:
                candidateRoomIds = cls._getCandidateRoomIds(gameId, playMode)
                if candidateRoomIds:
                    rid = candidateRoomIds[0]
                    msg.setParam('candidateRoomId', rid)
                cls._onEnterRoomFailed(msg, checkResult, userId, clientId, roomId)
            return

        if tableId == 0:  # 玩家只选择了房间
            bigRoomId = gdata.getBigRoomId(roomId)
            if bigRoomId == 0:
                cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR, userId, gameId, clientId, roomId)
                return
            ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
            ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]

            reason = cls._canQuickEnterRoom(userId, gameId, ctrlRoomId, 1)
            if reason == TYRoom.ENTER_ROOM_REASON_OK:
                TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId, 0)  # 请求转给GR或GT
            else:
                cls._onEnterRoomFailed(msg, reason, userId, gameId, clientId, roomId)
            return

        if tableId == roomId * 10000:  # 玩家在队列里断线重连
            TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId)  # 请求转给GR
            return

        onlineSeat = onlinedata.getOnlineLocSeatId(userId, roomId, tableId)

        if onlineSeat:
            extParam = {}
            extParam['seatId'] = onlineSeat
            moParams = msg.getKey('params')
            for k, v in moParams.items():
                if not k in extParam:
                    extParam[k] = v
            ftlog.debug('extParam=', extParam)
            TYRoomMixin.querySitReq(userId, roomId, tableId, clientId, extParam)  # 玩家断线重连,请求转给GT
        else:  # 玩家选择了桌子, 
            shadowRoomId = tableId / 10000
            ctrRoomId = gdata.roomIdDefineMap()[shadowRoomId].parentId
            TYRoomMixin.queryRoomQuickStartReq(msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId)  # 请求转给GR
Example #28
0
 def _check_param_bigRoomId(self, msg, key, params):
     roomId = msg.getParam('roomId')
     if roomId in gdata.bigRoomidsMap():
         return None, roomId
     return 'ERROR of big roomId !' + str(roomId), None
def _quickStart(cls, msg, userId, gameId, roomId, tableId, playMode, clientId):
    '''UT server中处理来自客户端的quick_start请求
            Args:
                msg
                    cmd : quick_start
                    if roomId == 0:
                        表示快速开始,服务器为玩家选择房间,然后将请求转给GR

                    if roomId > 0 and tableId == 0 :
                        表示玩家选择了房间,将请求转给GR

                    if roomId > 0 and tableId == roomId * 10000 :
                        表示玩家在队列里断线重连,将请求转给GR

                    if roomId > 0 and tableId > 0:
                        if onlineSeatId > 0:
                            表示玩家在牌桌里断线重连,将请求转给GT
                        else:
                            表示玩家选择了桌子,将请求转给GR
            '''
    assert isinstance(userId, int) and userId > 0
    assert isinstance(roomId, int) and roomId >= 0
    assert isinstance(tableId, int) and tableId >= 0

    mixId = msg.getParam('mixId', '')
    _, version, _ = strutil.parseClientId(clientId)
    if ftlog.is_debug():
        ftlog.debug("DizhuQuickStart._quickStart: clientId=", clientId,
                    "userId=", userId, "roomId=", roomId, "tableId=",
                    tableId, "mixId=", mixId, "version=", version, "type:",
                    type(version), "playMode=", playMode)

    if playMode == "match":
        playMode = dizhuconf.PLAYMODE_123

    if ftlog.is_debug():
        ftlog.debug("DizhuQuickStart << |clientId:",
                    clientId,
                    "mixId:",
                    mixId,
                    "|userId, roomId, tableId:",
                    userId,
                    roomId,
                    tableId,
                    "|gameId, playMode:",
                    gameId,
                    playMode,
                    caller=cls)

    bigRoomId = gdata.getBigRoomId(roomId)
    if ftlog.is_debug():
        ftlog.debug('DizhuQuickStart bigRoomId:', bigRoomId)
    if bigRoomId == 0:
        cls._onEnterRoomFailed(msg, ENTER_ROOM_REASON_ROOM_ID_ERROR, userId,
                               clientId, roomId)
        return

    if strutil.getGameIdFromBigRoomId(bigRoomId) != gameId:
        cls._onEnterRoomFailed(msg, ENTER_ROOM_REASON_ROOM_ID_ERROR, userId,
                               clientId, roomId)
        return

    if tableId == 0:  # 玩家只选择了房间
        if roomId != bigRoomId:
            ctrlRoomId = gdata.roomIdDefineMap()[roomId].parentId or roomId
            queryRoomId = roomId
        else:
            ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
            ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]
            queryRoomId = ctrlRoomId

        buyin = msg.getParam("buyin", 0)  # 兼容 pc
        innerTable = msg.getParam("innerTable", 0)  # innerTable 区分不同版本弹窗

        if ftlog.is_debug():
            ftlog.debug('DizhuQuickStart._quickStart', 'buyin=', buyin,
                        'innerTable=', innerTable, 'mixId=', mixId)

        if buyin:
            innerTable = 1

        roomdef = gdata.roomIdDefineMap()[ctrlRoomId]
        roomConf = roomdef.configure

        # 免费场重起maxCoin配置
        maxCoin = roomConf.get('maxCoin', 0)
        userChip = userchip.getChip(userId)
        if maxCoin > 0 and userChip >= maxCoin and innerTable == 0:
            cls._onEnterRoomFailed(msg, ENTER_ROOM_REASON_GREATER_MAX, userId,
                                   clientId, roomId)
            return
        # 混房的话从大到小选择一个mixId
        if roomConf.get('isMix') and not mixId:
            _, _, mixId = cls._chooseRoom(userId, [ctrlRoomId])
            if mixId:
                msg.setParam('mixId', mixId)
            else:
                msg.setParam('mixId', roomConf.get('mixConf')[0].get('mixId'))
                if innerTable == 0:
                    cls._onEnterRoomFailed(msg, ENTER_ROOM_REASON_LESS_MIN,
                                           userId, clientId, roomId)
                else:
                    mixConf = cls.getMixConf(
                        roomConf,
                        roomConf.get('mixConf')[0].get('mixId'))
                    new_table_remote.processLoseRoundOver(
                        DIZHU_GAMEID,
                        userId,
                        clientId,
                        mixConf.get('roomId'),
                        minCoin=mixConf.get('minCoin'))
                return
        reasonType, reason = cls._canQuickEnterRoom(userId, ctrlRoomId,
                                                    innerTable, mixId)
        if reason == ENTER_ROOM_REASON_OK:
            TYRoomMixin.queryRoomQuickStartReq(msg, queryRoomId,
                                               0)  # 请求转给GR或GT
        else:
            if reasonType == ENTER_ROOM_REASON_TYPE_NORMAL:
                if reason == ENTER_ROOM_REASON_NOT_OPEN and innerTable == 1:
                    if ftlog.is_debug():
                        ftlog.debug(
                            'DizhuQuickStart._quickStart not open userId=',
                            userId, 'roomId=', ctrlRoomId, 'msg=', msg,
                            'playmode=', playMode)
                    # 直接踢出房间
                    mp = MsgPack()
                    mp.setCmd('room')
                    mp.setParam('action', 'leave')
                    mp.setParam('reason', TYRoom.LEAVE_ROOM_REASON_ACTIVE)
                    mp.setParam('gameId', gameId)
                    mp.setParam('roomId', roomId)
                    mp.setParam('userId', userId)
                    router.sendRoomServer(mp, roomId)
                    return

                if reason == ENTER_ROOM_REASON_LESS_MIN or reason == ENTER_ROOM_REASON_GREATER_MAX:
                    if innerTable == 1:
                        ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
                        ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]
                        if roomdef.configure.get('isMix', 0):
                            continueLuckyGift = cls.getMixConf(
                                roomdef.configure,
                                mixId).get('continueLuckyGift', 0)
                            continueLuckyVer = cls.getMixConf(
                                roomdef.configure,
                                mixId).get('continueLuckyVer', 0)
                        else:
                            continueLuckyGift = roomdef.configure.get(
                                'continueLuckyGift', 0)
                            continueLuckyVer = roomdef.configure.get(
                                'continueLuckyVer', 0)
                        dizhuVersion = SessionDizhuVersion.getVersionNumber(
                            userId)
                        if continueLuckyGift and dizhuVersion >= continueLuckyVer:
                            # 发送转运礼包
                            if ftlog.is_debug():
                                ftlog.debug(
                                    'DizhuQuickStart._quickStart _less_min userId=',
                                    userId, 'roomId=', ctrlRoomId, 'msg=', msg,
                                    'playmode=', playMode,
                                    'continueLuckyGift=', continueLuckyGift,
                                    'continueLuckyVer=', continueLuckyVer,
                                    'dizhuVersion=', dizhuVersion)
                            if mixId and roomConf.get('isMix'):
                                mixConf = cls.getMixConf(roomConf, mixId)
                                new_table_remote.processLoseRoundOver(
                                    DIZHU_GAMEID,
                                    userId,
                                    clientId,
                                    mixConf.get('roomId'),
                                    minCoin=mixConf.get('minCoin'))
                            else:
                                new_table_remote.processLoseRoundOver(
                                    DIZHU_GAMEID, userId, clientId, roomId)
                        else:
                            roomDef = gdata.roomIdDefineMap()[ctrlRoomId]
                            playMode = roomDef.configure.get('playMode', None)
                            if ftlog.is_debug():
                                ftlog.debug(
                                    'DizhuQuickStart._quickStart _less_min userId=',
                                    userId, 'roomId=', ctrlRoomId, 'msg=', msg,
                                    'playmode=', playMode)
                            msgpack = MsgPack()
                            msgpack.setCmd("quick_start")
                            msgpack.setParam("userId", userId)
                            msgpack.setParam("gameId", gameId)
                            msgpack.setParam("clientId", clientId)
                            msgpack.setParam("innerTable", 1)
                            msgpack.setParam("apiver",
                                             msg.getParam("apiver", 3.7))
                            cls.onCmdQuickStart(msgpack, userId, gameId, 0, 0,
                                                playMode, clientId)
                            if ftlog.is_debug():
                                ftlog.debug(
                                    'DizhuQuickStart._quickStart reenter_less_min userId=',
                                    userId, 'roomId=', ctrlRoomId, 'msgpack=',
                                    msgpack.pack())
                    else:
                        cls._onEnterRoomFailed(msg, reason, userId, clientId,
                                               roomId)
                else:
                    cls._onEnterRoomFailed(msg, reason, userId, clientId,
                                           roomId)
            else:
                cls._sendTodoTaskToUserWithTip(userId, reason)
        return

    if tableId == roomId * 10000:  # 玩家在队列里断线重连
        TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId)  # 请求转给GR
        return

    onlineSeat = onlinedata.getOnlineLocSeatId(userId, roomId, tableId)

    if onlineSeat:
        # 牌桌里坐着的玩家断线重连,请求转给GT
        # TYRoomMixin.querySitReq(userId, roomId, tableId, clientId) # GT人多时会有超时异常
        TYRoomMixin.sendSitReq(userId, roomId, tableId, clientId)
    else:  # 玩家选择了桌子,
        shadowRoomId = tableId / 10000
        ctrRoomId = gdata.roomIdDefineMap()[shadowRoomId].parentId
        TYRoomMixin.queryRoomQuickStartReq(msg,
                                           ctrRoomId,
                                           tableId,
                                           shadowRoomId=shadowRoomId)  # 请求转给GR
    return
Example #30
0
    def _onEnterRoomFailed(cls, msg, checkResult, userId, clientId, roomId=0):
        # PC的补丁,需要返回一个失败的quick_start消息
        mixId = msg.getParam('mixId')
        # mo = MsgPack()
        # mo.setCmd('quick_start')
        # mo.setResult('gameId', DIZHU_GAMEID)
        # mo.setResult('userId', userId)
        # mo.setResult('roomId', 0)
        # mo.setResult('seatId', 0)
        # mo.setResult('tableId', 0)
        # router.sendToUser(mo, userId)

        if checkResult == ENTER_ROOM_REASON_CONFLICT:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_INNER_ERROR:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_QUIT_ROOM_ERROR:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_ROOM_FULL:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_LESS_MIN:
            innerTable = msg.getParam("innerTable", 0)
            if ftlog.is_debug():
                ftlog.debug('DizhuQuickStart enter_less_min msg=', msg, 'innerTable=', innerTable)
            if innerTable == 1:
                return cls._sendToDoTaskJumpToStore(userId)

            if roomId <= 0:
                roomId = msg.getParam('roomId')
                if not roomId:
                    roomId = msg.getParam('candidateRoomId')
                if not roomId:
                    return
            cls._sendTodoTaskBuyChip(userId, roomId, clientId, mixId)
            # cls._sendChargeLeadTodoTask(userId, roomId, clientId)

        elif checkResult == ENTER_ROOM_REASON_GREATER_MAX:
            playMode = msg.getParam('playMode')
            if not playMode:
                # 找到当前要进入的房间的玩法
                if roomId <= 0:
                    roomId = msg.getParam('roomId')
                    if not roomId:
                        roomId = msg.getParam('candidateRoomId')
                if roomId > 0:
                    if roomId in gdata.roomIdDefineMap():
                        playMode = gdata.roomIdDefineMap()[roomId].configure.get('playMode', None)
                    elif roomId in gdata.bigRoomidsMap():
                        roomId = gdata.bigRoomidsMap()[roomId][0]
                        playMode = gdata.roomIdDefineMap()[roomId].configure.get('playMode', None)

            cls._sendTodoTaskJumpHighRoom(userId, playMode, clientId)

        elif checkResult == ENTER_ROOM_REASON_GREATER_ALL:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_TABLE_FULL:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_WRONG_TIME:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_NOT_QUALIFIED:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_ROOM_ID_ERROR:
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_DASHIFEI_LEVEL:
            if cls._sendTodoTaskToUserWithRoomKey(userId, roomId, msg, "vipOrDashifenTip"):
                return
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_NOT_OPEN:
            if cls._sendTodoTaskToUserWithRoomKey(userId, roomId, msg, "openTimeListTip"):
                return
            cls._sendTodoTaskToUser(userId, checkResult)

        elif checkResult == ENTER_ROOM_REASON_VIP_LEVEL:
            if cls._sendTodoTaskToUserWithRoomKey(userId, roomId, msg, "vipOrDashifenTip"):
                return
            cls._sendTodoTaskToUser(userId, checkResult)
        elif checkResult == ENTER_ROOM_REASON_LESS_MIN_QUICKSTART:
            cls._sendTodoTaskBuyChip(userId, roomId, clientId, mixId)
        else:  # TYRoom.ENTER_ROOM_REASON_INNER_ERROR :
            cls._sendTodoTaskToUser(userId, ENTER_ROOM_REASON_INNER_ERROR)
Example #31
0
    def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, playMode,
                        clientId):
        '''UT server中处理来自客户端的quick_start请求
        Args:
            msg
                cmd : quick_start
                if roomId == 0:
                    表示快速开始,服务器为玩家选择房间,然后将请求转给GR

                if roomId > 0 and tableId == 0 :
                    表示玩家选择了房间,将请求转给GR

                if roomId > 0 and tableId == roomId * 10000 :
                    表示玩家在队列里断线重连,将请求转给GR

                if roomId > 0 and tableId > 0:
                    if onlineSeatId > 0:
                        表示玩家在牌桌里断线重连,将请求转给GT
                    else:
                        表示玩家选择了桌子,将请求转给GR
        '''
        assert isinstance(userId, int) and userId > 0
        assert isinstance(roomId, int) and roomId >= 0
        assert isinstance(tableId, int) and tableId >= 0

        if ftlog.is_debug():
            ftlog.debug("<< |clientId:",
                        clientId,
                        "|userId, roomId, tableId:",
                        userId,
                        roomId,
                        tableId,
                        "|gameId, playMode:",
                        gameId,
                        playMode,
                        caller=cls)

        # 单开, 无论何时quick_start进入都检查loc
        if not pokerconf.isOpenMoreTable(clientId):
            loc = onlinedata.checkUserLoc(userId, clientId, gameId)
            if ftlog.is_debug():
                ftlog.debug('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:
                    ftlog.debug('onCmdQuickStart 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('old client, reset roomId, tableId->',
                                    roomId,
                                    tableId,
                                    caller=cls)

        if roomId == 0:  # 玩家点击快速开始
            chosenRoomId, checkResult = cls._chooseRoom(
                userId, gameId, playMode)
            ftlog.debug("after choose room",
                        "|userId, chosenRoomId, checkResult:",
                        userId,
                        chosenRoomId,
                        checkResult,
                        caller=cls)
            if checkResult == TYRoom.ENTER_ROOM_REASON_OK:
                TYRoomMixin.queryRoomQuickStartReq(msg, chosenRoomId,
                                                   0)  # 请求转给GR
            else:
                candidateRoomIds = cls._getCandidateRoomIds(gameId, playMode)
                if candidateRoomIds:
                    rid = candidateRoomIds[0]
                    msg.setParam('candidateRoomId', rid)
                cls._onEnterRoomFailed(msg, checkResult, userId, clientId,
                                       roomId)
                return

        bigRoomId = gdata.getBigRoomId(roomId)
        ftlog.debug('bigRoomId:', bigRoomId)
        if bigRoomId == 0:
            cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR,
                                   userId, clientId, roomId)
            return

        if strutil.getGameIdFromBigRoomId(bigRoomId) != gameId:
            cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR,
                                   userId, clientId, roomId)
            return

        if tableId == 0:  # 玩家只选择了房间
            if gameId == 6 and roomId != bigRoomId:
                ctrlRoomId = gdata.roomIdDefineMap()[roomId].parentId or roomId
                queryRoomId = roomId
            else:
                ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
                ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]
                queryRoomId = ctrlRoomId
            reason = cls._canQuickEnterRoom(userId, gameId, ctrlRoomId, 1)
            if reason == TYRoom.ENTER_ROOM_REASON_OK:
                if gameId == 6:
                    TYRoomMixin.queryRoomQuickStartReq(msg, queryRoomId,
                                                       0)  # 请求转给GR或GT
                else:
                    TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId,
                                                       0)  # 请求转给GR或GT
            elif reason == TYRoom.ENTER_ROOM_REASON_LESS_MIN or reason == TYRoom.ENTER_ROOM_REASON_GREATER_MAX:
                if gameId == 6:
                    innerTable = msg.getParam("innerTable",
                                              0)  # innerTable 区分不同版本弹窗
                    if innerTable == 1:
                        roomDef = gdata.roomIdDefineMap()[ctrlRoomId]
                        playMode = roomDef.configure.get('playMode', None)
                        if ftlog.is_debug():
                            ftlog.debug('enter_less_min userId=', userId,
                                        'roomId=', ctrlRoomId, 'msg=', msg,
                                        'playmode=', playMode)
                        msgpack = MsgPack()
                        msgpack.setCmd("quick_start")
                        msgpack.setParam("userId", userId)
                        msgpack.setParam("gameId", gameId)
                        msgpack.setParam("clientId", clientId)
                        msgpack.setParam("innerTable", 1)
                        msgpack.setParam("apiver", msg.getParam("apiver",
                                                                3.7))  # 驱动
                        cls.onCmdQuickStart(msgpack, userId, gameId, 0, 0,
                                            playMode, clientId)
                        if ftlog.is_debug():
                            ftlog.debug('reenter_less_min userId=', userId,
                                        'roomId=', ctrlRoomId, 'msgpack=',
                                        msgpack.pack())
                    else:
                        cls._onEnterRoomFailed(msg, reason, userId, clientId,
                                               roomId)
                else:
                    cls._onEnterRoomFailed(msg, reason, userId, clientId,
                                           roomId)
            else:
                cls._onEnterRoomFailed(msg, reason, userId, clientId, roomId)
            return

        if tableId == roomId * 10000:  # 玩家在队列里断线重连 4400150010001
            TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId)  # 请求转给GR
            return

        onlineSeat = onlinedata.getOnlineLocSeatId(userId, roomId, tableId)

        if onlineSeat:
            if onlineSeat == gdata.roomIdDefineMap(
            )[roomId].configure['tableConf']['maxSeatN'] + 1:
                # 牌桌里旁观的玩家断线重连,请求转给GT
                TYRoomMixin.sendTableCallObserveReq(userId, roomId, tableId,
                                                    clientId)
            else:
                # 牌桌里坐着的玩家断线重连,请求转给GT
                # TYRoomMixin.querySitReq(userId, roomId, tableId, clientId) # GT人多时会有超时异常
                TYRoomMixin.sendSitReq(userId, roomId, tableId, clientId)
        else:  # 玩家选择了桌子,
            shadowRoomId = tableId / 10000
            ctrRoomId = gdata.roomIdDefineMap()[shadowRoomId].parentId
            TYRoomMixin.queryRoomQuickStartReq(
                msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId)  # 请求转给GR
Example #32
0
    def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, clientId,
                        kindId):
        """UT server中处理来自客户端的quick_start请求  
        Args:
            msg
                cmd : quick_start
                if roomId == 0:
                    表示快速开始,服务器为玩家选择房间,然后将请求转给GR
                    
                if roomId > 0 and tableId == 0 : 
                    表示玩家选择了房间,将请求转给GR
                    
                if roomId > 0 and tableId == roomId * 10000 :
                    表示玩家在队列里断线重连,将请求转给GR
                    
                if roomId > 0 and tableId > 0:
                    if onlineSeatId > 0: 
                        表示玩家在牌桌里断线重连,将请求转给GT
                    else:
                        表示玩家选择了桌子,将请求转给GR
        """
        assert isinstance(userId, int) and userId > 0
        assert isinstance(roomId, int) and roomId >= 0
        assert isinstance(tableId, int) and tableId >= 0
        if ftlog.is_debug():
            ftlog.debug("onCmdQuickStart->", userId, "msg =", msg, "roomId =",
                        roomId, "tableId =", tableId, "clientId =", clientId)
        isRobot = userId < config.ROBOT_MAX_USER_ID
        if not isRobot and not util.isUsableClientVersion(userId):
            cls.onQuickStartFailed(cls.ENTER_ROOM_REASON_VERSION_DISABLE,
                                   userId, clientId, roomId)
            return

        # 单开, 无论何时quick_start进入都检查loc
        if not pokerconf.isOpenMoreTable(clientId):
            locList = onlinedata.getOnlineLocList(userId)
            if ftlog.is_debug():
                ftlog.debug("onCmdQuickStart->getOnlineLocList->", userId,
                            locList)
            try:
                for lRoomId, lTableId, lSeatId in locList:
                    roomGameId = strutil.getGameIdFromInstanceRoomId(lRoomId)
                    if roomGameId == FISH_GAMEID:
                        roomId = lRoomId
                        tableId = lTableId
                        ftlog.info(
                            "onCmdQuickStart->reconnect roomId, tableId->",
                            userId, roomId, tableId)
                    else:
                        cls.onQuickStartFailed(
                            cls.ENTER_ROOM_REASON_STATE_ERROR, userId,
                            clientId, roomId)
                        return
                    break
            except:
                ftlog.warn("onCmdQuickStart->error", userId, roomId, tableId)

        redState = gamedata.getGameAttrInt(userId, FISH_GAMEID,
                                           GameData.redState)
        if isRobot is False and redState == 0:
            ctrlRoomId = config.getCommonValueByKey("newbieRoomId")
            chosenTableId = 0
            shadowRoomId = None
            if gdata.getBigRoomId(roomId) == gdata.getBigRoomId(
                    ctrlRoomId) and tableId:
                chosenTableId = tableId
                shadowRoomId = tableId / 10000
            TYRoomMixin.queryRoomQuickStartReq(
                msg, ctrlRoomId, chosenTableId,
                shadowRoomId=shadowRoomId)  # 请求转给GR
            return

        if roomId == 0:  # 玩家点击快速开始
            chosenRoomId, reason = cls._chooseRoom(userId, gameId)
            ftlog.info("onCmdQuickStart->chosenRoomId", chosenRoomId,
                       "userId =", userId, "reason =", reason)
            if reason == cls.ENTER_ROOM_REASON_OK:
                TYRoomMixin.queryRoomQuickStartReq(msg, chosenRoomId,
                                                   0)  # 请求转给GR
            else:
                cls.onQuickStartFailed(reason, userId, clientId, roomId)
            return

        if tableId == 0:  # 玩家只选择了房间
            bigRoomId = gdata.getBigRoomId(roomId)
            if bigRoomId == 0:
                cls.onQuickStartFailed(cls.ENTER_ROOM_REASON_ROOM_ID_ERROR,
                                       userId, clientId, roomId)
                return
            ctrlRoomIds = gdata.bigRoomidsMap()[bigRoomId]
            ctrlRoomId = ctrlRoomIds[userId % len(ctrlRoomIds)]
            reason = cls.canQuickEnterRoom(userId, gameId, ctrlRoomId, kindId)
            if reason == cls.ENTER_ROOM_REASON_OK:
                roomConf = gdata.roomIdDefineMap()[roomId].configure
                fee = roomConf.get("fee_%s" % kindId, {}) or roomConf.get(
                    "fee", {})
                rewards = fee.get("rewards", [])
                if fee:
                    _consume = [{"name": fee["kindId"], "count": fee["count"]}]
                    ret = util.consumeItems(userId, _consume, "ROOM_GAME_FEE")
                    if ret and rewards:
                        util.addRewards(userId, rewards,
                                        "BI_NFISH_VOUCHER_REWARDS", kindId)
                TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId,
                                                   0)  # 请求转给GR或GT
            else:
                cls.onQuickStartFailed(reason, userId, clientId, roomId)
            return

        if tableId == roomId * 10000:  # 玩家在队列里断线重连
            TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId)  # 请求转给GR
            return

        onlineSeat = onlinedata.getOnlineLocSeatId(userId, roomId, tableId)

        if onlineSeat:
            TYRoomMixin.querySitReq(userId, roomId, tableId, clientId,
                                    {"seatId": onlineSeat})  # 玩家断线重连,请求转给GT
        else:  # 玩家选择了桌子
            shadowRoomId = tableId / 10000
            ctrlRoomId = gdata.roomIdDefineMap()[shadowRoomId].parentId
            TYRoomMixin.queryRoomQuickStartReq(
                msg, ctrlRoomId, tableId, shadowRoomId=shadowRoomId)  # 请求转给GR
Example #33
0
def _updateRoomDefine(keylist, sleepTime):
    import json
    from poker.entity.game import quick_start
    isall = 1 if len(keylist) == 1 and keylist[0] == 'all' else 0
    if _DEBUG:
        debug('_syncConfigure._updateRoomDefine-> in', keylist)
    _sleepnb(sleepTime)
    keylist = set(keylist)
    changedGameIds = []
    changedBigRoomIds = []
    for gid, bigRoomIds in gdata.gameIdBigRoomidsMap().items():
        rkey = 'game:' + str(gid) + ':room:0'
        if isall or rkey in keylist:
            changedGameIds.append([rkey, gid])
        for bigRoomId in bigRoomIds:
            rkey = 'game:' + str(gid) + ':room:' + str(bigRoomId)
            if isall or rkey in keylist:
                changedBigRoomIds.append([rkey, bigRoomId])

    changeRoomIds = set([])
    for changed in changedGameIds:
        rkey = changed[0]
        gid = changed[1]
        if _DEBUG:
            debug('_syncConfigure._updateRoomDefine-> reload roomdef', rkey)
        roomdict = ftcon.getConfNoCache('GET', rkey)
        if roomdict:
            roomdict = json.loads(roomdict)
        if not isinstance(roomdict, dict):
            continue
        for roomIdStr, configure in roomdict.items():
            bigRoomId = int(roomIdStr)
            # 所有BIGROOMID下的configure是同一个对象,update第一个即可
            roomid0 = gdata.bigRoomidsMap()[bigRoomId][0]
            room0 = gdata.roomIdDefineMap()[roomid0]
            room0.configure.update(configure)
            changeRoomIds.add(bigRoomId)
            if _DEBUG:
                debug(
                    '_syncConfigure._updateRoomDefine-> reload roomdef by 0.json',
                    bigRoomId)
            _sleepnb(sleepTime)

    for changed in changedBigRoomIds:
        rkey = changed[0]
        bigRoomId = changed[1]
        if _DEBUG:
            debug('_syncConfigure._updateRoomDefine-> reload roomdef', rkey)
        extdict = ftcon.getConfNoCache('GET', rkey)
        if extdict:
            extdict = json.loads(extdict)
        if not isinstance(extdict, dict):
            continue
            # 所有BIGROOMID下的configure是同一个对象,update第一个即可
        roomid0 = gdata.bigRoomidsMap()[bigRoomId][0]
        room0 = gdata.roomIdDefineMap()[roomid0]
        room0.configure.update(extdict)
        changeRoomIds.add(bigRoomId)
        if _DEBUG:
            debug(
                '_syncConfigure._updateRoomDefine-> reload roomdef by ' +
                str(bigRoomId) + '.json', bigRoomId)
        _sleepnb(sleepTime)

    if changeRoomIds:
        for _, roomIns in gdata.rooms().items():
            if roomIns.bigRoomId in changeRoomIds:
                if _DEBUG:
                    debug('_syncConfigure._updateRoomDefine-> reload roomins',
                          roomIns.roomId)
                rdef = gdata.roomIdDefineMap().get(roomIns.roomId)
                roomIns.doReloadConf(rdef)
                _sleepnb(sleepTime)

        quick_start._CANDIDATE_ROOM_IDS = {}

    _sleepnb(sleepTime)
    if _DEBUG:
        debug('_syncConfigure._updateRoomDefine-> out')
Example #34
0
def _updateRoomDefine(keylist, sleepTime):
    import json
    from poker.entity.game import quick_start
    isall = 1 if len(keylist) == 1 and keylist[0] == 'all' else 0
    if _DEBUG:
        debug('_syncConfigure._updateRoomDefine-> in', keylist)
    _sleepnb(sleepTime)
    keylist = set(keylist)
    changedGameIds = []
    changedBigRoomIds = []
    for gid, bigRoomIds in gdata.gameIdBigRoomidsMap().items():
        rkey = 'game:' + str(gid) + ':room:0'
        if isall or rkey in keylist:
            changedGameIds.append([rkey, gid])
        for bigRoomId in bigRoomIds:
            rkey = 'game:' + str(gid) + ':room:' + str(bigRoomId)
            if isall or rkey in keylist:
                changedBigRoomIds.append([rkey, bigRoomId])

    changeRoomIds = set([])
    for changed in changedGameIds:
        rkey = changed[0]
        gid = changed[1]
        if _DEBUG:
            debug('_syncConfigure._updateRoomDefine-> reload roomdef', rkey)
        roomdict = ftcon.getConfNoCache('GET', rkey)
        if roomdict:
            roomdict = json.loads(roomdict)
        if not isinstance(roomdict, dict):
            continue
        for roomIdStr, configure in roomdict.items():
            bigRoomId = int(roomIdStr)
            # 所有BIGROOMID下的configure是同一个对象,update第一个即可
            roomid0 = gdata.bigRoomidsMap()[bigRoomId][0]
            room0 = gdata.roomIdDefineMap()[roomid0]
            room0.configure.update(configure)
            changeRoomIds.add(bigRoomId)
            if _DEBUG:
                debug('_syncConfigure._updateRoomDefine-> reload roomdef by 0.json', bigRoomId)
            _sleepnb(sleepTime)

    for changed in changedBigRoomIds:
        rkey = changed[0]
        bigRoomId = changed[1]
        if _DEBUG:
            debug('_syncConfigure._updateRoomDefine-> reload roomdef', rkey)
        extdict = ftcon.getConfNoCache('GET', rkey)
        if extdict:
            extdict = json.loads(extdict)
        if not isinstance(extdict, dict):
            continue
            # 所有BIGROOMID下的configure是同一个对象,update第一个即可
        roomid0 = gdata.bigRoomidsMap()[bigRoomId][0]
        room0 = gdata.roomIdDefineMap()[roomid0]
        room0.configure.update(extdict)
        changeRoomIds.add(bigRoomId)
        if _DEBUG:
            debug('_syncConfigure._updateRoomDefine-> reload roomdef by ' + str(bigRoomId) + '.json', bigRoomId)
        _sleepnb(sleepTime)

    if changeRoomIds:
        for _, roomIns in gdata.rooms().items():
            if roomIns.bigRoomId in changeRoomIds:
                if _DEBUG:
                    debug('_syncConfigure._updateRoomDefine-> reload roomins', roomIns.roomId)
                rdef = gdata.roomIdDefineMap().get(roomIns.roomId)
                roomIns.doReloadConf(rdef)
                _sleepnb(sleepTime)

        quick_start._CANDIDATE_ROOM_IDS = {}

    _sleepnb(sleepTime)
    if _DEBUG:
        debug('_syncConfigure._updateRoomDefine-> out')
Example #35
0
 def _getQueryRoomId(cls, userId, bigRoomId):
     ''' 获取 queryroomid '''
     ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]  # gr
     return ctrRoomIds[userId % len(ctrRoomIds)]
Example #36
0
    def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, playMode, clientId):
        '''UT server中处理来自客户端的quick_start请求  
        Args:
            msg
                cmd : quick_start
                if roomId == 0:
                    表示快速开始,服务器为玩家选择房间,然后将请求转给GR
                    
                if roomId > 0 and tableId == 0 : 
                    表示玩家选择了房间,将请求转给GR
                    
                if roomId > 0 and tableId == roomId * 10000 :
                    表示玩家在队列里断线重连,将请求转给GR
                    
                if roomId > 0 and tableId > 0:
                    if onlineSeatId > 0: 
                        表示玩家在牌桌里断线重连,将请求转给GT
                    else:
                        表示玩家选择了桌子,将请求转给GR
        '''
        assert isinstance(userId, int) and userId > 0
        assert isinstance(roomId, int) and roomId >= 0
        assert isinstance(tableId, int) and tableId >= 0

        if ftlog.is_debug():
            ftlog.debug("<< |clientId:", clientId,
                        "|userId, roomId, tableId:", userId, roomId, tableId,
                        "|gameId, playMode:", gameId, playMode, caller=cls)

        # 单开, 无论何时quick_start进入都检查loc
        if not pokerconf.isOpenMoreTable(clientId):
            loc = onlinedata.checkUserLoc(userId, clientId, gameId)
            if ftlog.is_debug():
                ftlog.debug('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:
                    ftlog.debug('onCmdQuickStart 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('old client, reset roomId, tableId->', roomId, tableId, caller=cls)

        if roomId == 0:  # 玩家点击快速开始
            chosenRoomId, checkResult = cls._chooseRoom(userId, gameId, playMode)
            ftlog.debug("after choose room", "|userId, chosenRoomId, checkResult:", userId, chosenRoomId, checkResult,
                        caller=cls)
            if checkResult == TYRoom.ENTER_ROOM_REASON_OK:
                TYRoomMixin.queryRoomQuickStartReq(msg, chosenRoomId, 0)  # 请求转给GR
            else:
                candidateRoomIds = cls._getCandidateRoomIds(gameId, playMode)
                if candidateRoomIds:
                    rid = candidateRoomIds[0]
                    msg.setParam('candidateRoomId', rid)
                cls._onEnterRoomFailed(msg, checkResult, userId, clientId, roomId)
            return

        bigRoomId = gdata.getBigRoomId(roomId)
        ftlog.debug('bigRoomId:', bigRoomId)
        if bigRoomId == 0:
            cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR, userId, clientId, roomId)
            return

        if strutil.getGameIdFromBigRoomId(bigRoomId) != gameId:
            cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR, userId, clientId, roomId)
            return

        if tableId == 0:  # 玩家只选择了房间
            if gameId == 6 and roomId != bigRoomId:
                ctrlRoomId = gdata.roomIdDefineMap()[roomId].parentId
                queryRoomId = roomId
            else:
                ctrRoomIds = gdata.bigRoomidsMap()[bigRoomId]
                ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]
                queryRoomId = ctrlRoomId
            reason = cls._canQuickEnterRoom(userId, gameId, ctrlRoomId, 1)
            if reason == TYRoom.ENTER_ROOM_REASON_OK:
                if gameId == 6:
                    TYRoomMixin.queryRoomQuickStartReq(msg, queryRoomId, 0)  # 请求转给GR或GT
                else:
                    TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId, 0)  # 请求转给GR或GT
            elif reason == TYRoom.ENTER_ROOM_REASON_LESS_MIN or reason == TYRoom.ENTER_ROOM_REASON_GREATER_MAX:
                if gameId == 6:
                    innerTable = msg.getParam("innerTable", 0)  # innerTable 区分不同版本弹窗
                    if innerTable == 1:
                        roomDef = gdata.roomIdDefineMap()[ctrlRoomId]
                        playMode = roomDef.configure.get('playMode', None)
                        if ftlog.is_debug():
                            ftlog.debug('enter_less_min userId=', userId, 'roomId=', ctrlRoomId, 'msg=', msg,
                                        'playmode=', playMode)
                        msgpack = MsgPack()
                        msgpack.setCmd("quick_start")
                        msgpack.setParam("userId", userId)
                        msgpack.setParam("gameId", gameId)
                        msgpack.setParam("clientId", clientId)
                        msgpack.setParam("innerTable", 1)
                        msgpack.setParam("apiver", msg.getParam("apiver", 3.7))
                        cls.onCmdQuickStart(msgpack, userId, gameId, 0, 0, playMode, clientId)
                        if ftlog.is_debug():
                            ftlog.debug('reenter_less_min userId=', userId, 'roomId=', ctrlRoomId, 'msgpack=',
                                        msgpack.pack())
                    else:
                        cls._onEnterRoomFailed(msg, reason, userId, clientId, roomId)
                else:
                    cls._onEnterRoomFailed(msg, reason, userId, clientId, roomId)
            else:
                cls._onEnterRoomFailed(msg, reason, userId, clientId, roomId)
            return

        if tableId == roomId * 10000:  # 玩家在队列里断线重连
            TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId)  # 请求转给GR
            return

        onlineSeat = onlinedata.getOnlineLocSeatId(userId, roomId, tableId)

        if onlineSeat:
            if onlineSeat == gdata.roomIdDefineMap()[roomId].configure['tableConf']['maxSeatN'] + 1:
                # 牌桌里旁观的玩家断线重连,请求转给GT
                TYRoomMixin.sendTableCallObserveReq(userId, roomId, tableId, clientId)
            else:
                # 牌桌里坐着的玩家断线重连,请求转给GT
                # TYRoomMixin.querySitReq(userId, roomId, tableId, clientId) # GT人多时会有超时异常
                TYRoomMixin.sendSitReq(userId, roomId, tableId, clientId)
        else:  # 玩家选择了桌子, 
            shadowRoomId = tableId / 10000
            ctrRoomId = gdata.roomIdDefineMap()[shadowRoomId].parentId
            TYRoomMixin.queryRoomQuickStartReq(msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId)  # 请求转给GR