Ejemplo n.º 1
0
        def make_led_mo(newleds, clientVer, clientId):
            mo = MsgPack()
            mo.setCmd('led')

            if clientVer >= 3.6:
                if ledWithTodoTask:
                    mo.setKey('result', ledWithTodoTask)
                    return mo.pack()
                return None

            if newleds['origLeds']:
                mo.setKey('result', newleds['origLeds'])
            if newleds['richLeds']:
                mo.setKey('result', newleds['richLeds'])
                mo.setKey('richText', newleds['richLeds'])
                mo.setResult('gameId', gameId)

                if gameId == 8:
                    if clientVer < 3.0:
                        # 德州老单包有问题,所有格式都转为没有按钮的LED (也就是type='led')
                        newleds['richLeds']['type'] = 'led'
                    elif newleds['richLeds'][
                            'type'] == 'vip' and clientVer == 3.37 and 'hall8' in clientId:
                        # 德州大厅3.37版本BUG: 如果消息中有 richText,则收不到消息
                        mo.rmKey('richText')
            if popWinInfo and clientId.startswith('Winpc'):
                mo.setResult('popWin', popWinInfo)
            return mo.pack()
Ejemplo n.º 2
0
    def doActivityBetguessSetResult(self):
        '''
        @param activityGameId: 6(配置里配置的哪个GameId就填哪个GameId)
        @param activityId: 活动ID
        @param issueNumber: '2016-10-31 18:20:00'
        @param resultState: 0,1,2
        '''
        try:
            activityGameId = runhttp.getParamInt('activityGameId')
            activityId = runhttp.getParamStr('activityId')
            issueNumber = runhttp.getParamStr('issueNumber')
            resultState = runhttp.getParamInt('resultState')
            if activityGameId == None or \
                activityId == None or \
                issueNumber == None or \
                resultState == None:
                return self.makeErrorResponse('params error').pack()
            
            ftlog.debug('BetguessHttpHandler.doActivityBetguessSetResult',
                        'activityGameId=', activityGameId,
                        'activityId=', activityId,
                        'issueNumber=', issueNumber,
                        'resultState=', resultState)
            
            err, issueMap = self.getActivityIssueMapConf(activityId)
            if err:
                return err
                        
            # 验证issueNumber是否存在
            if issueNumber not in issueMap:
                return self.makeErrorResponse('issueNumber not found! issueNumber maybe error').pack()
            
            # 给活动设置竞猜结果
            if not ActivityModel.updateResult(activityGameId, activityId, issueNumber, resultState):
                return self.makeErrorResponse('result set failed! resultState maybe error').pack()

            # 获得最新的活动数据
            activityModel = ActivityModel.loadModel(activityGameId, activityId, issueNumber)
            if activityModel.resultState == activityModel.RESULT_STATE_NONE:
                return self.makeErrorResponse('activityModel.resultState not set!').pack()
            
            # 遍历参与玩家
            chipCounter = 0
            userIdList = UserRecorder.getUsers(activityGameId, activityId, issueNumber)
            for userId in userIdList:
                response = act_betguess_remote.sendRewards(userId, 
                                                        activityModel.countChipLeft, activityModel.countChipRight, activityModel.resultState, 
                                                        activityGameId, activityId, issueNumber)
                if response.get('err'):
                    return self.makeErrorResponse(response.get('err')).pack()
                chipCounter += response.get('chip', 0)
            
            activityModel = ActivityModel.loadModel(activityGameId, activityId, issueNumber)
            response = MsgPack()
            response.setResult("activityModel", activityModel.__dict__)
            response.setResult('allchip', chipCounter)
            return response.pack()
        except:
            ftlog.error()
            return self.makeErrorResponse().pack()
Ejemplo n.º 3
0
 def doTreasureChestUnlock(self, userId, rewardId):
     mo = MsgPack()
     mo.setCmd('dizhu')
     mo.setResult('action', 'treasure_chest_unlock')
     mo.setResult('gameId', DIZHU_GAMEID)
     mo.setResult('userId', userId)
     mo.setResult('success',
                  TreasureChestHelper.unlockTreasureChest(userId, rewardId))
     return mo.pack()
Ejemplo n.º 4
0
 def doGetTreasureChestList(self, userId):
     mo = MsgPack()
     mo.setCmd('dizhu')
     mo.setResult('action', 'treasure_chest_list')
     mo.setResult('gameId', DIZHU_GAMEID)
     mo.setResult('userId', userId)
     mo.setResult('treasureChestList',
                  TreasureChestHelper.getTreasureChestList(userId))
     return mo.pack()
Ejemplo n.º 5
0
    def doActivityBetguessQuery(self):
        '''
        @param activityGameId: 6(配置里配置的哪个GameId就填哪个GameId)
        @param activityId: 活动ID
        @param issueNumber: '2016-10-31 18:20:00'
        '''
        try:
            activityGameId = runhttp.getParamInt('activityGameId')
            activityId = runhttp.getParamStr('activityId')
            issueNumber = runhttp.getParamStr('issueNumber')
            if activityGameId == None or \
                activityId == None or \
                issueNumber == None:
                return self.makeErrorResponse('params error').pack()

            ftlog.debug('BetguessHttpHandler.doActivityBetguessQuery',
                        'activityGameId=', activityGameId,
                        'activityId=', activityId,
                        'issueNumber=', issueNumber)

            activityModel = ActivityModel.loadModel(activityGameId, activityId, issueNumber)

            err, issueMap = self.getActivityIssueMapConf(activityId)
            if err:
                return err
            
            issueCalculator = IssueCalculator(issueMap)
            issueConf = issueCalculator.getCurrentIssueConf(issueNumber)
            if (issueNumber not in issueMap) or (not issueConf):
                return self.makeErrorResponse('issueNumber not found! issueNumber maybe error').pack()

            bankerPumping = issueConf.get('bankerPumping', 0)
            # 奖池为抽水金额
            totalChip = activityModel.countChipLeft+activityModel.countChipRight
            # 奖池金额
            betPoolChip = int((activityModel.countChipLeft+activityModel.countChipRight)*(1-bankerPumping))
            # 左赔率
            leftBetOdds = betPoolChip/activityModel.countChipLeft if activityModel.countChipLeft>0 else 0
            # 右赔率
            rightBetOdds = betPoolChip/activityModel.countChipRight if activityModel.countChipRight>0 else 0
            
            response = MsgPack()
            response.setResult('totalChip', totalChip)
            response.setResult('betPoolChip', betPoolChip)
            response.setResult('leftBetOdds', leftBetOdds)
            response.setResult('rightBetOdds', rightBetOdds)
            response.setResult('bankerPumping', bankerPumping)
            response.setResult('countChipLeft', activityModel.countChipLeft)
            response.setResult('countChipRight', activityModel.countChipRight)
            response.setResult('resultState', activityModel.resultState)
            
            response.setResult("activityModel", activityModel.__dict__)
            response.setResult('pastIssueNumberList', issueCalculator.getAlreadyPastIssueNumberList())
            return response.pack()
        except:
            ftlog.error()
            return self.makeErrorResponse().pack()
Ejemplo n.º 6
0
 def doTreasureChestOpen(self, userId, rewardId):
     mo = MsgPack()
     mo.setCmd('dizhu')
     mo.setResult('action', 'treasure_chest_open')
     mo.setResult('gameId', DIZHU_GAMEID)
     mo.setResult('userId', userId)
     ret, _ = TreasureChestHelper.openTreasureChest(userId, rewardId)
     mo.setResult('success', ret)
     return mo.pack()
Ejemplo n.º 7
0
 def doTreasureChestHelp(self, userId, rewardId, helpUserId):
     mo = MsgPack()
     mo.setCmd('dizhu')
     mo.setResult('action', 'treasure_chest_help')
     mo.setResult('gameId', DIZHU_GAMEID)
     mo.setResult('userId', userId)
     ret, state, leftSeconds = TreasureChestHelper.helpShortenTreasureChest(
         userId, rewardId, helpUserId)
     mo.setResult('success', ret)
     mo.setResult('state', state)
     mo.setResult('leftSeconds', leftSeconds)
     return mo.pack()
Ejemplo n.º 8
0
def convertOldRoomId(roomId, msgstr):
    if roomId in OLDROOMDI_MAP:
        rid = OLDROOMDI_MAP[roomId]
        ftlog.info('convertOldRoomId', roomId, '->', rid)
        msg = MsgPack()
        try:
            msg.unpack(msgstr)
        except:
            raise Exception('the json data error 7 !! [' + repr(msgstr) + ']')
        msg.setParam('roomId', rid)
        msgstr = msg.pack()
        return rid, msgstr
    return roomId, msgstr
Ejemplo n.º 9
0
    def notifyMatchUserRevive(self, player, reviveContent):
        # 如果是机器人立即直接复活
        if self.isRobot(player):
            self._room.match.currentInstance.doUserRevive(player, True)
            return

        afterScore = player.stage.stageConf.rankLine.getMinScoreByRank(
            reviveContent.get('rank'))
        afterRank = reviveContent.get('rank')
        # 判断用户是否需要高倍衰减
        if player.championLimitFlag:
            rate = player.stage.nextStage.stageConf.scoreIntoRateHigh if player.stage.nextStage.stageConf.scoreIntoRateHigh else player.nextStage.stage.stageConf.scoreIntoRate
            afterScore = afterScore * rate
        else:
            afterScore = afterScore * player.stage.nextStage.stageConf.scoreIntoRate

        msg = MsgPack()
        msg.setCmd('m_revival')
        msg.setResult('mixId', player.mixId)
        msg.setResult('gameId', self._room.gameId)
        msg.setResult('roomId', self._room.bigRoomId)
        msg.setResult('userId', player.userId)
        msg.setResult('rank', player.rank)
        msg.setResult('afterRank', afterRank)
        msg.setResult('score', player.score)
        msg.setResult('afterScore', int(afterScore))
        msg.setResult('riseUserCount', player.stage.stageConf.riseUserCount)
        msg.setResult(
            'timeLeft',
            int(player.reviveExpirationTime -
                pktimestamp.getCurrentTimestamp()))
        fee = reviveContent['fee']
        itemId = fee['itemId']
        userAssets = hallitem.itemSystem.loadUserAssets(player.userId)
        timestamp = pktimestamp.getCurrentTimestamp()
        balance = userAssets.balance(HALL_GAMEID, itemId, timestamp)
        assetKind = hallitem.itemSystem.findAssetKind(itemId)
        msg.setResult(
            'fee', {
                'feeCount': fee['count'],
                'leftFeeCount': balance,
                'pic': fee.get('img') if fee.get('img') else assetKind.pic
            })

        if ftlog.is_debug():
            ftlog.debug('MatchPlayerNotifierDizhu.notifyMatchUserRevive',
                        'instId=', player.matchInst.instId, 'userId=',
                        player.userId, 'signinParams=', player.signinParams,
                        'stageIndex=', player.stage.index, 'msg=', msg.pack(),
                        'rank=', player.rank)
        router.sendToUser(msg, player.userId)
Ejemplo n.º 10
0
 def doTreasureChestAdd(self, userId, rewardType, rewardList, params):
     success = False
     if rewardType in [TREASURE_CHEST_TYPE_AS_WINSTREAK]:
         success = True
         dizhu_event_remote.publishTreasureChestEvent(
             DIZHU_GAMEID, userId, rewardType, rewardList, **params)
     mo = MsgPack()
     mo.setCmd('dizhu')
     mo.setResult('action', 'treasure_chest_add')
     mo.setResult('gameId', DIZHU_GAMEID)
     mo.setResult('userId', userId)
     mo.setResult('rewardList', rewardList)
     mo.setResult('success', success)
     return mo.pack()
Ejemplo n.º 11
0
def _sendLogOutMsg(protocol, errorCode, isabort):
    '''
    发送一个强制logout的消息后, 关闭用户的TCP的链接
    '''
    if errorCode != ERROR_SYS_LOGOUT_TIME_OUT:
        ml = MsgPack()
        ml.setCmd('logout')
        ml.setError(
            errorCode,
            pokerconf.getConnLogoutMsg(errorCode, 'Please try to login again'))
        protocol.writeEncodeMsg(ml.pack())
    protocol.closeConnection(0)
    ftlog.info('_sendLogOutMsg address=', protocol.clientAddress, 'errorCode=',
               errorCode)
Ejemplo n.º 12
0
 def sendRewardToUsers(self, userIds, rewardList):
     for userId, _ in userIds:
         mo = MsgPack()
         mo.setCmd('dizhu')
         mo.setResult('action', 'red_envelope_bomb')
         mo.setResult('rewardList', rewardList)
         try:
             clientId = sessiondata.getClientId(userId)
         except Exception, e:
             ftlog.error(
                 'dizhu_red_envelope_bomb.sendRewardToUsers bad clientId err=',
                 e.message)
             clientId = None
         mo.setResult('tipTop', self._getTipTop(userId, clientId)),
         router.sendToUser(mo, userId)
         if ftlog.is_debug():
             ftlog.debug('dizhu_red_envelope_bomb.sendRewardToUser',
                         'userId=', userId, 'mo=', mo.pack())
Ejemplo n.º 13
0
def _remoteCall(markParams, argl, argd):
    srvtype = markParams['remoteServerType']
    syncCall = markParams['remoteSyncCall']
    remoteGroupByIndex = markParams['remoteGroupByIndex']
    remoteGroupBy = markParams['remoteGroupBy']
    cmd = markParams['remoteCmd']
    action = markParams['remoteAction']
    groupVal = argl[remoteGroupByIndex]
    msgpack = MsgPack()
    msgpack.setCmdAction(cmd, action)
    msgpack.setParam(remoteGroupBy, groupVal)
    msgpack.setParam('argl', argl[1:])  # 去掉self, cls
    msgpack.setParam('argd', argd)
    msgpack.setParam('clientId', configure.CLIENTID_RPC)
    msgpack = msgpack.pack()
    jstr = None
    if srvtype == gdata.SRV_TYPE_UTIL:
        jstr = _communicateServer(_utilServer, groupVal, groupVal, msgpack,
                                  'RQ', syncCall)
    elif srvtype == gdata.SRV_TYPE_ROOM:
        assert (groupVal in gdata.roomIdDefineMap())
        jstr = _communicateRoomServer(0, groupVal, msgpack, 'RQ', syncCall)
    elif srvtype == gdata.SRV_TYPE_TABLE:
        assert (groupVal in gdata.roomIdDefineMap())
        jstr = _communicateTableServer(0, groupVal, msgpack, 'RQ', syncCall)
    elif srvtype == gdata.SRV_TYPE_CENTER:
        jstr = _communicateServer(_centerServer, groupVal, groupVal, msgpack,
                                  'RQ', syncCall)
    else:
        raise Exception('ERROR RPC cmd route false !!' + cmd + '.' + action)
    ret = None
    if syncCall and jstr:
        mo = MsgPack()
        try:
            mo.unpack(jstr)
        except:
            raise Exception('the json data error 5 !! [' + repr(jstr) + ']')
        ret = mo.getKey('result')
    return ret
Ejemplo n.º 14
0
def forceUserLogOut(userId, logoutmsg):
    '''
    管理员发送强制关闭TCP链接的消息, 
    发送logout消息后,关闭用户的TCP的链接
    '''
    ftlog.info('forceUserLogOut userId=', userId)
    if not logoutmsg:
        logoutmsg = pokerconf.getConnLogoutMsg(ERROR_SYS_LOGOUT_FORCE_LOGOUT,
                                               'Please try to login again')
    ml = MsgPack()
    ml.setCmd('logout')
    ml.setError(ERROR_SYS_LOGOUT_FORCE_LOGOUT, logoutmsg)
    ml = ml.pack()
    if userId in _ONLINE_USERS:
        user = _ONLINE_USERS[userId]
        ftlog.debug('forceUserLogOut user='******'forceUserLogOut user not in map !!')
    return 0
Ejemplo n.º 15
0
def _remoteCall(markParams, argl, argd):
    srvtype = markParams['remoteServerType']
    syncCall = markParams['remoteSyncCall']
    remoteGroupByIndex = markParams['remoteGroupByIndex']
    remoteGroupBy = markParams['remoteGroupBy']
    cmd = markParams['remoteCmd']
    action = markParams['remoteAction']
    groupVal = argl[remoteGroupByIndex]
    msgpack = MsgPack()
    msgpack.setCmdAction(cmd, action)
    msgpack.setParam(remoteGroupBy, groupVal)
    msgpack.setParam('argl', argl[1:])  # 去掉self, cls
    msgpack.setParam('argd', argd)
    msgpack.setParam('clientId', configure.CLIENTID_RPC)
    msgpack = msgpack.pack()
    jstr = None
    if srvtype == gdata.SRV_TYPE_UTIL:
        jstr = _communicateServer(_utilServer, groupVal, groupVal, msgpack, 'RQ', syncCall)
    elif srvtype == gdata.SRV_TYPE_ROOM:
        assert (groupVal in gdata.roomIdDefineMap())
        jstr = _communicateRoomServer(0, groupVal, msgpack, 'RQ', syncCall)
    elif srvtype == gdata.SRV_TYPE_TABLE:
        assert (groupVal in gdata.roomIdDefineMap())
        jstr = _communicateTableServer(0, groupVal, msgpack, 'RQ', syncCall)
    elif srvtype == gdata.SRV_TYPE_CENTER:
        jstr = _communicateServer(_centerServer, groupVal, groupVal, msgpack, 'RQ', syncCall)
    else:
        raise Exception('ERROR RPC cmd route false !!' + cmd + '.' + action)
    ret = None
    if syncCall and jstr:
        mo = MsgPack()
        try:
            mo.unpack(jstr)
        except:
            raise Exception('the json data error 5 !! [' + repr(jstr) + ']')
        ret = mo.getKey('result')
    return ret
Ejemplo n.º 16
0
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
Ejemplo n.º 17
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
Ejemplo n.º 18
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