Example #1
0
    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 tyconfig.getRoomDefine(shadowRoomId).tableCount == 1:
            return tableId

        for _ in xrange(5):  # 这张桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试
            result = roomdao.DaoTableScore.removeTableScore(
                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

            ftcore.sleep(1)

        return 0
Example #2
0
    def _initCandidateRoomIdsByGameId(cls, gameId):

        roomids = {'': []}
        for bigRoomId in tyconfig.getAllBigRoomIds():
            roomDef = tyconfig.getRoomDefine(bigRoomId)
            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(
                    [tyconfig.getControlRoomIds(bigRoomId)[0], 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
Example #3
0
def isFriendRoom(roomId):
    if roomId <= 0:
        return False

    roomType = tyconfig.getRoomDefine(roomId).configure
    tableType = roomType.get('tableType', 'normal')
    return tableType == 'create'
Example #4
0
    def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly):

        try:
            chip = hallrpcutil.getChip(userId)
            if ftlog.is_debug():
                ftlog.debug(tyconfig.getRoomDefine(roomId).configure)
            roomConfig = tyconfig.getRoomDefine(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
Example #5
0
def fetchAllRoomInfos(uid, gid, playMode):
    '''
    获取所有的现金桌房间信息
    '''
    if _DEBUG:
        debug('fetchAllRoomInfos->', uid, gid, playMode)
    roomInfos = []
    if playMode:
        ucount_infos = tybireport.getRoomOnLineUserCount(gid, True)
        bigRoomIds = tyglobal.bigRoomIdsMap().keys()
        bigRoomIds.sort()

        if _DEBUG:
            debug('bigRoomIds->', uid, gid, bigRoomIds)

        for bigRoomId in bigRoomIds:
            roomDef = tyconfig.getRoomDefine(bigRoomId)
            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[MTDefine.MIN_COIN]
                roomDesc["max_coin"] = roomConfig[MTDefine.MAX_COIN]
                roomDesc["max_table_coin"] = roomConfig.get(
                    MTDefine.MAX_TABLE_COIN, roomDesc["max_coin"])
                roomDesc["base_chip"] = roomConfig["tableConf"]["base_chip"]
                roomDesc["service_fee"] = roomConfig["tableConf"][
                    "service_fee"]
                roomDesc["maima"] = roomConfig["tableConf"].get("maima", 0)
                roomDesc["macount"] = roomConfig["tableConf"].get("macount", 0)
                roomDesc["laizi"] = roomConfig["tableConf"].get("laizi", 0)
                roomNameDesc = roomConfig['name']
                roomTaskDesc = roomConfig['tableConf'][
                    'taskDesc'] if 'taskDesc' in roomConfig['tableConf'] else ''
                playerCount = ucount_infos[1].get(str(roomDef.bigRoomId), 0)
                ftlog.debug('ucount_infos:', ucount_infos[1], ' bigRoomId:',
                            roomDef.bigRoomId, ' playerCount:', playerCount)

                roomInfos.append([
                    bigRoomId, playerCount, roomNameDesc, roomTaskDesc, "",
                    roomDesc
                ])
    return roomInfos
Example #6
0
    def _chooseCreateRoom(cls,
                          userId,
                          gameId,
                          playMode,
                          playerCount=4,
                          hasRobot=0,
                          itemId=None):
        '''服务端为玩家选择要创建的房间'''
        candidateRoomIds = MajiangQuickStartCoin._getCandidateRoomIds(
            gameId, playMode)
        ftlog.debug("MajiangCreateTable._chooseCreateRoom:", candidateRoomIds,
                    ' playMode=', playMode, ' playerCount=', playerCount,
                    ' hasRobot=', hasRobot)

        for roomId in candidateRoomIds:

            roomConfig = tyconfig.getRoomDefine(roomId).configure
            tableConf = roomConfig.get('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
            else:
                ftlog.debug('_chooseCeateRoom roomConf:', roomConfig)
        return 0, TYRoom.ENTER_ROOM_REASON_LESS_MIN
Example #7
0
    def _onEnterRoomFailed(cls,
                           msg,
                           checkResult,
                           userId,
                           gameId,
                           clientId,
                           roomId=0,
                           playMode=''):
        '''
        进入房间失败回调函数
        playMode为'',则进房间失败不用在帮用户选择房间
        '''
        ftlog.warn("|userId, reason, roomId:",
                   userId,
                   checkResult,
                   roomId,
                   caller=cls)  # 调用最小房间金币不够充值提醒的todotask
        if not roomId:
            roomId = msg.getParam('candidateRoomId', 0)
        if checkResult == TYRoom.ENTER_ROOM_REASON_LESS_MIN or checkResult == 104:
            product, _ = pluginCross.mj2productselector.selectLessbuyProduct(
                userId, clientId, roomId)
            if product:
                chooseRoomId, _ = cls._chooseRoom(userId, gameId, playMode)
                pluginCross.mj2todotask.sendQuickStartNeedCharge(
                    gameId, userId, product, chooseRoomId)

        if checkResult == TYRoom.ENTER_ROOM_REASON_GREATER_MAX and playMode:
            chooseRoomId, checkResult = cls._chooseRoom(
                userId, gameId, playMode)
            if checkResult == TYRoom.ENTER_ROOM_REASON_OK:
                roomConfig = tyconfig.getRoomDefine(chooseRoomId).configure
                nameDesc = roomConfig['tableConf'][
                    'nameDesc'] if 'nameDesc' in roomConfig[
                        'tableConf'] else '富豪'
                tipStr = '您已是%s,快去%s找角搓麻吧' % (nameDesc, roomConfig['name'])

                pluginCross.mj2todotask.sendQuickStartJumpRoom(
                    gameId, userId, chooseRoomId, playMode, tipStr)
Example #8
0
 def sendChangeBetsConfReqToAllShadowRoom(cls, ctrlRoomId, betsConf):
     for shadowRoomId in tyconfig.getRoomDefine(ctrlRoomId).shadowRoomIds:
         cls.sendChangeBetsConfReq(shadowRoomId, betsConf)
Example #9
0
    def getBestTableId(self, userId, shadowRoomId, exceptTableId=None):
        '''原子化从redis里获取和删除评分最高的桌子Id
        Return:
            None: tableScores 队列为空, 所有桌子都在分配座位中
        '''
        def getBestTableIdFromRedis(shadowRoomId):
            '''从redis里取出并删除一个评分最高的牌桌
            '''
            tableId, tableScore = 0, 0
            datas = roomdao.DaoTableScore.getBestTableId(shadowRoomId)
            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 tyconfig.getRoomDefine(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 tyglobal.gameIns().isWaitPigTable(userId, self, tableId):
                    pigTables.append([shadowRoomId, tableScore, tableId])
                    tableId = 0
                    continue
                else:
                    break
            else:
                ftcore.sleep(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
Example #10
0
    def _remoteTableLeave(self,
                          userId,
                          reason=LEAVE_ROOM_REASON_ACTIVE,
                          locList=None):
        if not locList:
            locList = pluginCross.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]
            onlineGameId = tyconfig.getRoomGameId(onlineRoomId)
            if onlineGameId <= 0:  # 房间已经无效
                pluginCross.onlinedata.removeOnLineLoc(userId, onlineRoomId,
                                                       onlineTableId)
                continue
            if onlineGameId != tyglobal.gameId():  # 不隶属与当前的游戏,不处理
                continue
            ctrlRoomId = tyconfig.getRoomDefine(onlineRoomId).parentId
            if ctrlRoomId == self.roomId:
                ftlog.hinfo(
                    "table leave |userId, onlineRoomId, onlineTableId:",
                    userId,
                    onlineRoomId,
                    onlineTableId,
                    caller=self)
                clientId = tysessiondata.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 = pluginCross.onlinedata.getOnLineLocList(userId)
            ftlog.debug(">> |roomId, userId: ",
                        self.roomId,
                        userId,
                        "|locList:",
                        locList,
                        caller=self)
#                 return True

        return True
Example #11
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):
            truelocs, _onTableIds = pluginCross.onlinedata.checkUserLoc(
                userId, clientId, gameId)
            if ftlog.is_debug():
                ftlog.debug('old client, checkUserLoc->', truelocs, caller=cls)
            for loc in truelocs:
                lgameId, lroomId, ltableId, lseatId = loc.split('.')
                lgameId, lroomId, ltableId, lseatId = ftstr.parseInts(
                    lgameId, lroomId, ltableId, lseatId)

                #                 if gameId == 60 and lgameId != gameId and lroomId > 0:
                #                     try:
                #                         ftlog.info("gtServerRpc.doPlayerLeave:", lgameId, userId, lroomId, ltableId, lseatId)
                #                         gtServerRpc.doPlayerLeave(lgameId, userId, lroomId, ltableId, lseatId, clientId)
                #                     except Exception as e:
                #                         ftlog.error(e)
                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 = tyconfig.getBigRoomId(roomId)
        ftlog.debug('bigRoomId:', bigRoomId)
        if bigRoomId == 0:
            cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR,
                                   userId, clientId, roomId)
            return

        if tyconfig.getRoomGameId(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 = tyconfig.getRoomDefine(roomId).parentId or roomId
            #                 queryRoomId = roomId
            #             else:
            ctrRoomIds = tyconfig.getControlRoomIds(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 = tyconfig.getRoomDefine(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 = pluginCross.onlinedata.getOnLineLocSeatId(
            userId, roomId, tableId)

        if onlineSeat:
            if onlineSeat == tyconfig.getRoomDefine(
                    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 = tyconfig.getTableRoomId(tableId)
            ctrRoomId = tyconfig.getRoomDefine(shadowRoomId).parentId
            TYRoomMixin.queryRoomQuickStartReq(
                msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId)  # 请求转给GR
Example #12
0
    def _canQuickEnterRoom(cls,
                           userId,
                           gameId,
                           roomId,
                           isUserChoosed,
                           where='roomlist'):
        '''
        是用户选择的,校验用户金币是否在[minCoin, maxCoin]之间
        牌桌内的快速开始,校验用户的金币是否在[minCoin, maxTableCoin]之间
        是服务推荐的,校验用户的金币是否在[minCoinQS, maxCoinQS]之间
        
        房间的minCoin/maxCoin可以重叠
        minCoinQS/maxCoinQS最好不要重叠
        '''
        if isFriendRoom(roomId):
            return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED

        try:
            chip = hallrpcutil.getChip(userId)
            ftlog.debug('MajiangQuickStartCoin:',
                        tyconfig.getRoomDefine(roomId).configure,
                        caller=cls)
            roomConfig = tyconfig.getRoomDefine(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 isUserChoosed:
                minCoinQs = roomConfig[MTDefine.MIN_COIN]
                maxCoinQs = roomConfig[MTDefine.MAX_COIN]
                if where == 'table':
                    maxCoinQs = roomConfig.get(MTDefine.MAX_TABLE_COIN,
                                               maxCoinQs)
                    ftlog.debug('quick_start from table, maxCoinQS:',
                                maxCoinQs)
            else:
                minCoinQs = roomConfig[MTDefine.MIN_COIN_QS]
                maxCoinQs = roomConfig[MTDefine.MAX_COIN_QS]

            ftlog.debug('MajiangQuickStartCoin 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
Example #13
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("MajiangQuickStartCoin.onCmdQuickStart clientId:",
                    clientId, " userId:", userId, " roomId:", roomId,
                    " tableId:", tableId, " gameId:", gameId, " playMode:",
                    playMode)

        gTimeStamp = pluginCross.mj2dao.getQuickStartCoinTimeStamp(userId)
        cTimeStamp = time.time()
        ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart gTimeStamp:',
                    gTimeStamp, 'cTimeStamp:', cTimeStamp)
        # 判断两次quick_start间隔是否超过5秒,没有超过5秒,则不匹配
        if cTimeStamp - gTimeStamp < 3:
            ftlog.debug(
                'MajiangQuickStartCoin.onCmdQuickStart cTimeStamp - gTimeStamp < 5 !!!'
            )
            return

        # 单开, 无论何时quick_start进入都检查loc
        if not pokerconf.isOpenMoreTable(clientId):
            truelocs, _onTableIds = pluginCross.onlinedata.checkUserLoc(
                userId, clientId, gameId)
            ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart checkUserLoc:',
                        truelocs,
                        caller=cls)
            for loc in truelocs:
                lgameId, lroomId, ltableId, lseatId = loc.split('.')
                lgameId, lroomId, ltableId, lseatId = ftstr.parseInts(
                    lgameId, lroomId, ltableId, lseatId)
                if lgameId == gameId and lroomId > 0:
                    roomId = lroomId
                    tableId = ltableId
                    ftlog.debug(
                        'MajiangQuickStartCoin.onCmdQuickStart old client roomId:',
                        roomId,
                        ' tableId:',
                        tableId,
                        caller=cls)

        if roomId == 0:  # 玩家点击快速开始
            chosenRoomId, checkResult = cls._chooseRoom(
                userId, gameId, playMode)
            ftlog.info(
                "MajiangQuickStartCoin.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
                cls.saveQuickStartTime(userId, gameId, cTimeStamp)
            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 = tyconfig.getBigRoomId(roomId)
            ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart bigRoomId:',
                        bigRoomId)
            if bigRoomId == 0:
                cls._onEnterRoomFailed(msg,
                                       TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR,
                                       userId, gameId, clientId, roomId)
                return

            ctrRoomIds = tyconfig.getControlRoomIds(bigRoomId)
            ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)]
            qsParams = msg.getParam('where', 'roomlist')
            reason = cls._canQuickEnterRoom(userId, gameId, ctrlRoomId, True,
                                            qsParams)
            ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart reason:',
                        reason, 'ctrRoomIds:', ctrRoomIds, 'ctrlRoomId',
                        ctrlRoomId)
            if reason == TYRoom.ENTER_ROOM_REASON_OK:
                TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId,
                                                   0)  # 请求转给GR或GT
                cls.saveQuickStartTime(userId, gameId, cTimeStamp)
            else:
                cls._onEnterRoomFailed(msg, reason, userId, gameId, clientId,
                                       roomId, playMode)
            return

        if tableId == roomId * 10000:  # 玩家在队列里断线重连
            ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart tableId:',
                        tableId)
            TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId)  # 请求转给GR
            cls.saveQuickStartTime(userId, gameId, cTimeStamp)
            return

        onlineSeat = pluginCross.onlinedata.getOnLineLocSeatId(
            userId, roomId, tableId)

        if onlineSeat:
            ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart tableId:',
                        tableId)
            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
            cls.saveQuickStartTime(userId, gameId, cTimeStamp)
        else:  # 玩家选择了桌子,
            ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart tableId:',
                        tableId)
            shadowRoomId = tyconfig.getTableRoomId(tableId)
            ctrRoomId = tyconfig.getRoomDefine(shadowRoomId).parentId
            TYRoomMixin.queryRoomQuickStartReq(
                msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId)  # 请求转给GR
            cls.saveQuickStartTime(userId, gameId, cTimeStamp)