Beispiel #1
0
 def _fetchAllRoomInfos(self, uid, gid, playMode):
     ftlog.debug("|gameId, roomIds:", gid, [room.roomId for room in gdata.roomIdDefineMap().values() if room.gameId == gid])
     ftlog.debug("|gameId, bigRoomIds:", gid, list(gdata.gameIdBigRoomidsMap()[gid]))
     ctlRoomIds = [bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap()[gid]]
     ctlRoomIds.sort()
     ftlog.debug("|gameId, ctrRoomIds:", gid, ctlRoomIds)
     roomInfos = []
     ucount_infos = bireport.getRoomOnLineUserCount(gid, True)
     ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos)
     if playMode :
         for ctlRoomId in ctlRoomIds :
             roomDef = gdata.roomIdDefineMap()[ctlRoomId]
             ftlog.debug('_generateRoomList ', 'roomDef=', roomDef)
             roomConfig = roomDef.configure
             if roomConfig.get('playMode', None) == playMode \
                 and (not roomConfig.get('ismatch', 0)) \
                 and (not roomConfig.get(MFTDefine.IS_CREATE, 0)):
                 # 有playMode 非比赛 非自建桌
                 roomDesc = {}
                 roomDesc["play_mode"] = roomConfig["playMode"]
                 roomDesc["min_coin"] = roomConfig["minCoin"]
                 roomDesc["max_coin"] = roomConfig["maxCoin"]
                 roomDesc["base_chip"] = roomConfig["tableConf"]["base_chip"]
                 roomDesc["service_fee"] = roomConfig["tableConf"]["service_fee"]
                 playerCount = ucount_infos[1].get(str(roomDef.bigRoomId), 0)
                 ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos[1], roomDef.bigRoomId, ctlRoomId, playerCount)
                 roomInfos.append([
                                     ctlRoomId,
                                     playerCount,
                                     "",
                                     "",
                                     "",
                                     roomDesc                                      
                                   ])
     return roomInfos
Beispiel #2
0
    def _canQuickEnterMatchRoomParent(cls, userId, gameId, roomId, isOnly):

        try:
            chip = userchip.getChip(userId)
            ftlog.debug(gdata.roomIdDefineMap()[roomId].configure)
            roomConfig = gdata.roomIdDefineMap()[roomId].configure
            if isOnly:
                minCoinQs = roomConfig['minCoin']
                maxCoinQs = roomConfig['maxCoin']
            else:
                minCoinQs = roomConfig['minCoinQS']
                maxCoinQs = roomConfig['maxCoinQS']

            ftlog.debug('roomId =',
                        roomId,
                        'minCoinQs =',
                        minCoinQs,
                        'maxCoinQs =',
                        maxCoinQs,
                        'chip =',
                        chip,
                        caller=cls)

            if chip < minCoinQs:
                return TYRoom.ENTER_ROOM_REASON_LESS_MIN
            if maxCoinQs > 0 and chip >= maxCoinQs:
                return TYRoom.ENTER_ROOM_REASON_GREATER_MAX

            return TYRoom.ENTER_ROOM_REASON_OK

        except Exception as e:
            ftlog.error(e)
            return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
Beispiel #3
0
    def _remoteTableLeave(self,
                          userId,
                          reason=LEAVE_ROOM_REASON_ACTIVE,
                          locList=None):
        if not locList:
            locList = onlinedata.getOnlineLocList(userId)
        if ftlog.is_debug():
            ftlog.debug("<< |roomId, userId: ",
                        self.roomId,
                        userId,
                        "|locList:",
                        locList,
                        caller=self)
        for loc in locList:
            onlineRoomId, onlineTableId = loc[0], loc[1]
            if not onlineRoomId in gdata.roomIdDefineMap():
                onlinedata.removeOnlineLoc(userId, onlineRoomId, onlineTableId)
                continue
            ctrlRoomId = gdata.roomIdDefineMap()[onlineRoomId].parentId
            if ctrlRoomId == self.roomId:
                ftlog.hinfo(
                    "table leave |userId, onlineRoomId, onlineTableId:",
                    userId,
                    onlineRoomId,
                    onlineTableId,
                    caller=self)
                clientId = sessiondata.getClientId(userId)
                tableLeaveResultStr = self.queryTableManageTableLeaveReq(
                    userId, onlineRoomId, onlineTableId, clientId,
                    {"reason": reason})
                if not tableLeaveResultStr:
                    ftlog.warn(
                        "table leave timeout, |userId, onlineRoomId, onlineTableId, reason:",
                        userId,
                        onlineRoomId,
                        onlineTableId,
                        reason,
                        caller=self)

                    # 玩家离开牌桌只返回成功
                #                 tableLeaveResult = json.loads(tableLeaveResultStr)
                #                 ftlog.debug("|tableLeaveResult:", tableLeaveResult)
                #                 if tableLeaveResult.get("error"):
                #                     return False
                #                 if not tableLeaveResult["result"]["isOK"]:
                #                     return False

                if ftlog.is_debug():
                    locList = onlinedata.getOnlineLocList(userId)
                    ftlog.debug(">> |roomId, userId: ",
                                self.roomId,
                                userId,
                                "|locList:",
                                locList,
                                caller=self)
                    #                 return True

        return True
Beispiel #4
0
    def onMsgTableBegin(self):
        roomTypeName = self.getRoomConfKey('typeName')
        ftlog.debug('RobotUser.onMsgTableBegin roomId=', self.roomId,
                    'roomTypeName=', roomTypeName)
        if roomTypeName in (rooms.tyRoomConst.ROOM_TYPE_NAME_BIG_MATCH,
                            rooms.tyRoomConst.ROOM_TYPE_NAME_ARENA_MATCH,
                            rooms.tyRoomConst.ROOM_TYPE_NAME_GROUP_MATCH,
                            rooms.tyRoomConst.ROOM_TYPE_NAME_ERDAYI_MATCH,
                            'dizhu_group_match', 'dizhu_arena_match',
                            'dizhu_erdayi_match'):
            ftlog.debug('send enter and sign in match !!!')
            moEnterMatch = MsgPack()
            moEnterMatch.setCmdAction('room', 'enter')
            moEnterMatch.setParam('userId', self.userId)
            moEnterMatch.setParam('gameId', self.gameId)
            moEnterMatch.setParam('clientId', self.clientId)
            moEnterMatch.setParam('roomId', self.roomId)
            self.writeMsg(moEnterMatch)

            moSigninMatch = MsgPack()
            moSigninMatch.setCmdAction('room', 'signin')
            moSigninMatch.setParam('userId', self.userId)
            moSigninMatch.setParam('gameId', self.gameId)
            moSigninMatch.setParam('clientId', self.clientId)
            moSigninMatch.setParam('roomId', self.roomId)
            self.writeMsg(moSigninMatch)
        elif roomTypeName in ('dizhu_custom_match', ):
            moSigninMatch = MsgPack()
            moSigninMatch.setCmdAction('custom_match', 'signin')
            moSigninMatch.setParam('userId', self.userId)
            moSigninMatch.setParam('gameId', self.gameId)
            moSigninMatch.setParam('clientId', self.clientId)
            moSigninMatch.setParam('matchId', self.matchId)
            self.writeMsg(moSigninMatch)
        else:
            self.adjustChip()
            mo = MsgPack()
            mo.setCmdAction('game', 'quick_start')
            mo.setParam('userId', self.userId)
            mo.setParam('gameId', self.gameId)
            mo.setParam('clientId', self.clientId)
            mo.setParam('roomId', self.roomId)
            mo.setParam('tableId', self.tableId)
            ctrlRoomId = gdata.roomIdDefineMap()[
                self.roomId].parentId or self.roomId
            if gdata.roomIdDefineMap()[ctrlRoomId].configure.get('isMix'):
                mixId = gdata.roomIdDefineMap()[ctrlRoomId].configure.get(
                    'mixConf')[0].get('mixId')
                mo.setParam('mixId', mixId)
            ftlog.debug('send quick Start !!!', 'userId=', self.userId,
                        'gameId=', self.gameId, 'clientId=', self.clientId,
                        'roomId=', self.roomId, 'tableId=', self.tableId,
                        'mixId=', mo.getParam('mixId', ''))
            self.writeMsg(mo)
        return
Beispiel #5
0
 def _canQuickEnterCreateRoom(cls, userId, gameId, roomId):
     try:
         ftlog.debug(gdata.roomIdDefineMap()[roomId].configure)
         roomConfig = gdata.roomIdDefineMap()[roomId].configure
         ismatch = roomConfig.get('ismatch')
         isBigMatch = False
         if roomConfig.get('typeName', '') == 'majiang_bigmatch':
             isBigMatch = True
         if ismatch and not isBigMatch:
             return TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR
         return TYRoom.ENTER_ROOM_REASON_OK
     except Exception as e:
         ftlog.error(e)
         return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
Beispiel #6
0
 def getFailedInfo(cls, reason, userId, roomId):
     """
     获取失败提示信息
     """
     lang = util.getLanguage(userId)
     roomConf = {}
     if gdata.roomIdDefineMap().get(roomId):
         roomConf = gdata.roomIdDefineMap()[roomId].configure
     info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON", lang=lang)
     if reason == cls.ENTER_ROOM_REASON_LESS_LEVEL:
         info = config.getMultiLangTextConf(
             "ID_ENTER_ROOM_REASON_LESS_LEVEL",
             lang=lang) % roomConf["minLevel"]
     elif reason == cls.ENTER_ROOM_REASON_MAINTENANCE:
         info = config.getMultiLangTextConf(
             "ID_ENTER_ROOM_REASON_MAINTENANCE", lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_VERSION_DISABLE:
         info = config.getMultiLangTextConf(
             "ID_ENTER_ROOM_REASON_VERSION_DISABLE", lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_LESS_FEES:
         info = config.getMultiLangTextConf(
             "ID_ENTER_ROOM_REASON_LESS_FEES", lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_LESS_BULLET:
         info = config.getMultiLangTextConf(
             "ID_ENTER_ROOM_REASON_LESS_BULLET", lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_LESS_COIN:
         info = config.getMultiLangTextConf(
             "ID_ENTER_ROOM_REASON_LESS_COIN",
             lang=lang) % util.formatScore(roomConf["minCoin"], lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_TIME_LIMIT:
         info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON_NOT_OPEN",
                                            lang=lang)
         if roomConf.get("typeName") == config.FISH_ROBBERY:
             info = config.getMultiLangTextConf(
                 "ID_ENTER_ROOM_REASON_TIME_LIMIT", lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_EXCESSIVE_LOSS:
         info = config.getMultiLangTextConf(
             "ID_ENTER_ROOM_REASON_EXCESSIVE_LOSS",
             lang=lang) % config.getMultiLangTextConf(roomConf["name"],
                                                      lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_NOT_OPEN:
         info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON_NOT_OPEN",
                                            lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_GRAND_PRIX_LESS_FEES:  # 大奖赛门票不足
         info = config.getMultiLangTextConf(
             "ENTER_ROOM_REASON_GRAND_PRIX_LESS_FEES", lang=lang)
     elif reason == cls.ENTER_ROOM_REASON_GRAND_PRIX_NOE_OPEN:
         info = config.getMultiLangTextConf(
             "ENTER_ROOM_REASON_GRAND_PRIX_NOE_OPEN", lang=lang)
     return info
Beispiel #7
0
 def _canQuickEnterCreateRoom(cls, userId, gameId, roomId):
     try:
         ftlog.debug(gdata.roomIdDefineMap()[roomId].configure)
         roomConfig = gdata.roomIdDefineMap()[roomId].configure
         ismatch = roomConfig.get('ismatch')
         isBigMatch = False
         if roomConfig.get('typeName', '') == 'majiang_bigmatch':
             isBigMatch = True
         if ismatch and not isBigMatch:
             return TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR
         return TYRoom.ENTER_ROOM_REASON_OK
     except Exception as e:
         ftlog.error(e)
         return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
Beispiel #8
0
def _initializeTables(gdatas):
    '''
    初始化所有的桌子对象
    '''
    if _DEBUG:
        debug('initializeTables begin')
    srvid = gdata.serverId()
    roomids = gdata.srvIdRoomIdListMap().get(srvid, None)  # 获取所有房间ids
    if roomids:
        allrooms = gdata.roomIdDefineMap()  # 房间定义映射
        tyrooms = gdata.rooms()  # 所有房间实例字典
        for roomid in roomids:
            room = tyrooms[roomid]
            roomdefine = allrooms[roomid]
            gameins = gdata.games()[roomdefine.gameId]  # 房间游戏实例TYGame
            if _DEBUG:
                debug('initializeTables roomid=', roomid, 'tableCount=',
                      roomdefine.tableCount)
            if roomdefine.tableCount > 0:  # 桌子数
                baseid = roomid * 10000 + 1  # 桌子开始的id
                for x in xrange(roomdefine.tableCount):
                    tableid = baseid + x
                    tableins = gameins.newTable(room, tableid)  # 创建桌子
                    room.maptable[tableid] = tableins  # 桌子映射实例
    if _DEBUG:
        debug('initializeTables end')
Beispiel #9
0
    def onTableWinlose(cls, event):
        '''
        监听非比赛场的结局胜负
        '''
        ok = cls.checkActivityDate()
        if not ok:
            if ftlog.is_debug():
                ftlog.debug('ActivityDdzFund.onTableWinlose OutDate userId=', event.userId,
                            'roomId=', event.roomId)
            return

        userId = event.userId
        
        status = cls.loadFundStatus(userId, event.timestamp)
        
        if not status.isActivated:
            ftlog.debug('ActivityDdzFund.onTableWinlose userId=', userId,
                        'roomId=', event.roomId,
                        'status=', status.__dict__)
            return

        roomLevel = gdata.roomIdDefineMap()[event.roomId].configure.get('roomLevel', 1)

        data_wrapper = UserPlayDataDatabase(userId)

        bigRoomId = event.mixConfRoomId or gdata.getBigRoomId(event.roomId)
        data_wrapper.increase(event.winlose.isWin, False, roomLevel, bigRoomId)
        
        ftlog.info('ActivityDdzFund.onTableWinlose userId=', userId,
                   'isWin=', event.winlose.isWin,
                   'isMatch=', True,
                   'roomLevel=', 0,
                   'roomId=', event.roomId,
                   'bigRoomId=', bigRoomId)
Beispiel #10
0
def _publishWinLoseEvent(roomId, tableId, seatUid, roundId, winUserIds,
                         isDizhu, winuserid, seat_delta, detalChipAll,
                         findChips, windoubles, bomb, chuntian, winslam,
                         clientId, topValidCard, skillLevelUp):
    from dizhu.game import TGDizhu
    ebus = TGDizhu.getEventBus()
    hallebus = TGHall.getEventBus()
    isWin = True if seatUid in winUserIds else False
    winlose = Winlose(winuserid, topValidCard, isWin, isDizhu, seat_delta,
                      findChips, windoubles, bomb, chuntian > 1, winslam)
    ebus.publishEvent(
        UserTableWinloseEvent(DIZHU_GAMEID, seatUid, roomId, tableId, winlose,
                              skillLevelUp))

    isWinNum = 0
    if isWin:
        isWinNum = 1
    roomLevel = gdata.roomIdDefineMap()[roomId].configure.get('roomLevel', 1)
    ftlog.debug('hallebus push gameoverevent userId=', seatUid)
    hallebus.publishEvent(
        GameOverEvent(seatUid, DIZHU_GAMEID, clientId, roomId, tableId,
                      isWinNum, roomLevel))

    finalUserChip = userchip.getChip(seatUid)
    finalTableChip = userchip.getTableChip(seatUid, DIZHU_GAMEID, tableId)
    bireport.reportGameEvent('TABLE_WIN', seatUid, DIZHU_GAMEID, roomId,
                             tableId, roundId, detalChipAll, 0, 0, [],
                             clientId, finalTableChip, finalUserChip)
    return finalUserChip
Beispiel #11
0
    def adjustChip(self, minCoin=None, maxCoin=None):
        if not isinstance(minCoin, int) or not isinstance(maxCoin, int) \
                or minCoin < 0 or maxCoin < 0 or minCoin >= maxCoin:
            roomDef = gdata.roomIdDefineMap()[self.roomId]
            roomConf = roomDef.configure
            if roomConf.get('isMix'):
                maxCoin = roomConf.get('mixConf')[0].get('maxCoin', 0)
                minCoin = roomConf.get('mixConf')[0].get('minCoin', 0)
                maxCoin = maxCoin if maxCoin > 0 else minCoin + 100000
            else:
                maxCoin = roomConf['maxCoin']
                minCoin = roomConf['minCoin']
                maxCoin = maxCoin if maxCoin > 0 else minCoin + 100000

        uchip = userchip.getChip(self.userId)
        ftlog.debug('adjustChip->userId, uchip, minCoin, maxCoin =',
                    self.snsId, self.userId, uchip, minCoin, maxCoin)
        if uchip < minCoin or uchip > maxCoin:
            nchip = random.randint(minCoin + 1, minCoin + 1000)
            dchip = nchip - uchip
            trueDelta, finalCount = userchip.incrChip(
                self.userId, self.gameId, dchip,
                daoconst.CHIP_NOT_ENOUGH_OP_MODE_NONE,
                'SYSTEM_ADJUST_ROBOT_CHIP', self.roomId, self.clientId)
            ftlog.debug('adjustChip->userId, trueDelta, finalCount=',
                        self.snsId, self.userId, trueDelta, finalCount)
Beispiel #12
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 gdata.roomIdDefineMap()[shadowRoomId].tableCount == 1:
            return tableId

        for _ in xrange(5):  # 这张桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试
            result = daobase.executeTableCmd(
                shadowRoomId, 0, "ZREM", self.getTableScoresKey(shadowRoomId),
                tableId)  # ZREM key member删除元素
            if ftlog.is_debug():
                ftlog.debug("after ZREM tableId",
                            "|userId, shadowRoomId, tableId, result:",
                            userId,
                            shadowRoomId,
                            tableId,
                            result,
                            caller=self)
            if result == 1:
                return tableId

            FTTasklet.getCurrentFTTasklet().sleepNb(1)

        return 0
Beispiel #13
0
 def _trySitDown(self, shadowRoomId, tableId, userId, clientId, extParams):
     """尝试坐下"""
     with self._keyLock.lock(userId):
         table = None
         for _ in xrange(3):
             try:
                 if userId in self._allPlayerDict:
                     tableId = self._allPlayerDict[userId]
                 if tableId == 0:
                     self._updateUsableTableList()
                     if not self._usableTableList:
                         continue
                     table = choice(self._usableTableList)
                 else:
                     assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap()[shadowRoomId].bigRoomId == self.bigRoomId
                     table = self._allTableDict[tableId]
                 if table.processing or table.getTableScore() == 0:
                     continue
                 table.processing = True
                 msg = self.makeSitMsg(userId, shadowRoomId, tableId, clientId, extParams)
                 isOK = table.doSit(msg, userId, msg.getParam("seatId", 0), clientId)
                 if not isOK:
                     continue
                 return isOK
             except Exception, e:
                 ftlog.error("_trySitDown error", userId, shadowRoomId, tableId, clientId, extParams, traceback.format_exc())
             finally:
Beispiel #14
0
 def onMsgTableBegin(self):
     roomTypeName = gdata.roomIdDefineMap()[
         self.roomId].configure['typeName']
     if roomTypeName == "majiang_bigmatch":
         moSigninMatch = MsgPack()
         moSigninMatch.setCmdAction('room', 'signin')
         moSigninMatch.setParam('userId', self.userId)
         moSigninMatch.setParam('gameId', self.gameId)
         moSigninMatch.setParam('clientId', self.clientId)
         moSigninMatch.setParam('roomId', self.roomId)
         self.writeMsg(moSigninMatch)
         self.isMatch = True
     else:
         ftlog.debug('send quick Start !!!')
         self.adjustChip()
         mo = MsgPack()
         mo.setCmdAction('game', 'quick_start')
         mo.setParam('userId', self.userId)
         mo.setParam('gameId', self.gameId)
         mo.setParam('clientId', self.clientId)
         mo.setParam('roomId', self.roomId)
         mo.setParam('tableId', self.tableId)
         self.writeMsg(mo)
         self.isMatch = False
     return
Beispiel #15
0
    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
Beispiel #16
0
 def _chooseCreateRoom(cls, userId, gameId, playMode, playerCount = 4, hasRobot = 0, itemId = None):
     '''服务端为玩家选择要创建的房间'''
     candidateRoomIds = MajiangQuickStartV4_0._getCandidateRoomIds(gameId, playMode)
     ftlog.debug("MajiangCreateTable._chooseCreateRoom:", candidateRoomIds
                 , ' playMode=', playMode
                 , ' playerCount=', playerCount
                 , ' hasRobot=', hasRobot)
     
     for roomId in candidateRoomIds :
         roomConfig = gdata.roomIdDefineMap()[roomId].configure
         tableConf = roomConfig.get('tableConf', {})
         ftlog.debug('_chooseCreateRoom tableConf:', tableConf)
         if roomConfig.get(MFTDefine.IS_CREATE,0) \
             and (tableConf.get(MTDefine.MAXSEATN, 4) == playerCount) \
             and (roomConfig.get(MTDefine.HAS_ROBOT, 0) == hasRobot):
             roomItemId = roomConfig.get(MFTDefine.CREATE_ITEM, 0)
             if not hasRobot and itemId and (itemId != roomItemId):
                 ftlog.debug('MajiangCreateTable.check playMode ok, hasRobot ok, but fangKa item no ok, curRoomConsume:', roomItemId
                             , ' findRoomConsume:', itemId)
                 continue
             
             ret = cls._canQuickEnterCreateRoom(userId, gameId, roomId)
             ftlog.debug("MajiangCreateTable.check roomId, ret:", roomId, ret, caller=cls)
             if ret == TYRoom.ENTER_ROOM_REASON_OK:
                 return roomId, TYRoom.ENTER_ROOM_REASON_OK
     return 0, TYRoom.ENTER_ROOM_REASON_LESS_MIN
Beispiel #17
0
    def doQuickStart(self, msg):
        ''' 
        Note:
            1> 由于不同游戏评分机制不同,例如德州会根据游戏阶段评分,所以把桌子评分存到redis里,方便各游戏服务器自由刷新。
            2> 为了防止同一张桌子同时被选出来分配座位,选桌时会把tableScore里选出的桌子删除,玩家坐下成功后再添加回去,添回去之前无需刷新该桌子的评分。 
            3> 玩家自选桌时,可能选中一张正在分配座位的桌子,此时需要休眠后重试,只到该桌子完成分配或者等待超时。
        '''
        assert self.roomId == msg.getParam("roomId")

        userId = msg.getParam("userId")
        shadowRoomId = msg.getParam("shadowRoomId")
        tableId = msg.getParam("tableId")
        exceptTableId = msg.getParam('exceptTableId')
        clientId = msg.getParam("clientId")
        ftlog.hinfo(getMethodName(), "<<", "|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId,
                    self.roomId, shadowRoomId, tableId)

        if tableId == 0:  # 服务器为玩家选择桌子并坐下
            shadowRoomId = choice(self.roomDefine.shadowRoomIds)
            tableId = self.getBestTableId(userId, shadowRoomId, exceptTableId)
        else:  # 玩家自选桌子坐下
            assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap()[
                                                         shadowRoomId].bigRoomId == self.roomDefine.bigRoomId
            tableId = self.enterOneTable(userId, shadowRoomId, tableId)

        if not tableId:
            ftlog.error(getMethodName(), "getFreeTableId timeout", "|userId, roomId, tableId:", userId, self.roomId,
                        tableId)
            return

        if ftlog.is_debug():
            ftlog.info(getMethodName(), "after choose table", "|userId, shadowRoomId, tableId:", userId, shadowRoomId,
                       tableId)
        extParams = msg.getKey('params')
        self.querySitReq(userId, shadowRoomId, tableId, clientId, extParams)
Beispiel #18
0
    def _initCandidateRoomIdsByGameId(cls, gameId):

        roomids = {'': []}
        ctlRoomIds = [bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap().get(gameId, [])]
        for ctlRoomId in ctlRoomIds:
            roomDef = gdata.roomIdDefineMap()[ctlRoomId]
            playMode = roomDef.configure.get('playMode', '')
            ismatch = roomDef.configure.get('ismatch', 0)
            if ismatch == 0:
                sortVal = roomDef.configure.get('quickIndex', 0)
                if not playMode in roomids:
                    roomids[playMode] = []
                roomids[playMode].append([ctlRoomId, sortVal])

        croomids = {}
        allids = []
        for k, v in roomids.items():
            v.sort(key=lambda x: x[1])
            rids = [x[0] for x in v]
            croomids[k] = rids
            allids.extend(rids)
            ftlog.debug('_initCandidateRoomIds->', gameId, k, '=', croomids[k])

        allids.sort()
        croomids['_all_'] = allids
        ftlog.debug('_initCandidateRoomIds->', gameId, '_all_', '=', croomids['_all_'])

        return croomids
Beispiel #19
0
    def _initCandidateRoomIdsByGameId(cls, gameId):
        """通过游戏gameId初始化推荐房间Ids"""
        roomids = {'': []}
        ctlRoomIds = [
            bigRoomId * 10000 + 1000
            for bigRoomId in gdata.gameIdBigRoomidsMap().get(gameId, [])
        ]
        for ctlRoomId in ctlRoomIds:
            roomDef = gdata.roomIdDefineMap()[ctlRoomId]
            playMode = roomDef.configure.get('playMode', '')
            ismatch = roomDef.configure.get('ismatch', 0)
            if ismatch == 0:
                sortVal = roomDef.configure.get('quickIndex', 0)
                if not playMode in roomids:
                    roomids[playMode] = []
                roomids[playMode].append([ctlRoomId, sortVal])

        croomids = {}
        allids = []
        for k, v in roomids.items():
            v.sort(key=lambda x: x[1])
            rids = [x[0] for x in v]
            croomids[k] = rids
            allids.extend(rids)
            ftlog.debug('_initCandidateRoomIds->', gameId, k, '=', croomids[k])

        allids.sort()
        croomids['_all_'] = allids
        ftlog.debug('_initCandidateRoomIds->', gameId, '_all_', '=',
                    croomids['_all_'])
        return croomids
Beispiel #20
0
def __initializeTables(gdatas):
    '''
    初始化所有的桌子对象
    '''
    if _DEBUG:
        debug('initializeTables begin')
    srvid = gdata.serverId()
    roomids = gdata.srvIdRoomIdListMap().get(srvid, None)
    if roomids:
        allrooms = gdata.roomIdDefineMap()
        tyrooms = gdata.rooms()
        for roomid in roomids:
            room = tyrooms[roomid]
            roomdefine = allrooms[roomid]
            gameins = gdata.games()[roomdefine.gameId]
            if _DEBUG:
                debug('initializeTables roomid=', roomid, 'tableCount=',
                      roomdefine.tableCount)
            if roomdefine.tableCount > 0:
                baseid = roomid * 10000 + 1
                for x in xrange(roomdefine.tableCount):
                    tableid = baseid + x
                    tableins = gameins.newTable(room, tableid)
                    assert (isinstance(tableins, TYTable))
                    room.maptable[tableid] = tableins
    if _DEBUG:
        debug('initializeTables end')
Beispiel #21
0
    def _getDizhuMatchCandidateRoomIds(cls):
        '''
        初始化地主比赛的待选房间列表
        '''
        # 若存在初始化好的地主比赛房间列表,则直接返回
        global _DIZHU_QMATCH_CANDIDATE_ROOM_IDS
        if _DIZHU_QMATCH_CANDIDATE_ROOM_IDS:
            return _DIZHU_QMATCH_CANDIDATE_ROOM_IDS

        gameId = 6
        # ctrlroomid_list = [
        #    [ ctrlroomid, quickindex],
        #    ...
        # ]
        ctrlroomid_quickindex_list = []
        # 生成的控制房间的房间id列表,ctrlroomid = bigRoomId * 10000 + 1000
        ctrlroomid_list = [
            bigRoomId * 10000 + 1000
            for bigRoomId in gdata.gameIdBigRoomidsMap().get(gameId, [])
        ]
        for ctrlroomid in ctrlroomid_list:
            roomdef = gdata.roomIdDefineMap()[ctrlroomid]
            ismatch = roomdef.configure.get('ismatch', 0)
            # 只选择比赛场,ismatch!=0为比赛场
            if ismatch != 0:
                quickindex = roomdef.configure.get('quickIndex', 0)
                ctrlroomid_quickindex_list.append([ctrlroomid, quickindex])

        # 默认是升序
        ctrlroomid_quickindex_list.sort(key=lambda x: x[1])

        _DIZHU_QMATCH_CANDIDATE_ROOM_IDS = [
            x[0] for x in ctrlroomid_quickindex_list
        ]
        return _DIZHU_QMATCH_CANDIDATE_ROOM_IDS
Beispiel #22
0
def __initializeTables(gdatas):
    '''
    初始化所有的桌子对象
    '''
    if _DEBUG:
        debug('initializeTables begin')
    srvid = gdata.serverId()
    roomids = gdata.srvIdRoomIdListMap().get(srvid, None)
    if roomids:
        allrooms = gdata.roomIdDefineMap()
        tyrooms = gdata.rooms()
        for roomid in roomids:
            room = tyrooms[roomid]
            roomdefine = allrooms[roomid]
            gameins = gdata.games()[roomdefine.gameId]
            if _DEBUG:
                debug('initializeTables roomid=', roomid, 'tableCount=', roomdefine.tableCount)
            if roomdefine.tableCount > 0:
                baseid = roomid * 10000 + 1
                for x in xrange(roomdefine.tableCount):
                    tableid = baseid + x
                    tableins = gameins.newTable(room, tableid)
                    assert (isinstance(tableins, TYTable))
                    room.maptable[tableid] = tableins
    if _DEBUG:
        debug('initializeTables end')
Beispiel #23
0
    def _chooseRoom(cls, userId, startRooms, **kwargs):
        inRoom = False
        reasonType = None
        reason = None
        mixId = ''
        lastCtrRoomId = 0
        mixRoomReversed = kwargs.get('mixRoomReversed', 1)
        userChip = userchip.getChip(userId)
        for ctrRoomId in startRooms:
            lastCtrRoomId = ctrRoomId
            roomConfig = gdata.roomIdDefineMap()[ctrRoomId].configure

            if roomConfig.get('segment') == 1:
                continue

            if not mixRoomReversed:
                maxCoin = roomConfig.get('maxCoin', -1)
                if maxCoin > 0 and userChip >= maxCoin:
                    continue

            if roomConfig.get('isMix', 0):
                mixrooms = reversed(roomConfig.get('mixConf', [])) if mixRoomReversed else roomConfig.get('mixConf', [])
                for mixConf in mixrooms:
                    mixId = mixConf.get('mixId')
                    # 兼容积分榜
                    if kwargs.get('rankId', '-1') == '0':
                        minQuickStartChip = mixConf.get('minCoin', -1)
                    else:
                        minQuickStartChip = mixConf.get('minQuickStartChip', -1)
                    if userChip < minQuickStartChip:
                        continue
                    reasonType, reason = cls._canQuickEnterRoom(userId, ctrRoomId, mixId=mixConf.get('mixId'))
                    if reason == ENTER_ROOM_REASON_OK:
                        return ctrRoomId, ENTER_ROOM_REASON_OK, mixId
            elif roomConfig.get('typeName') == 'dizhu_arena_match' and roomConfig.get('matchConf', {}).get('feeRewardList', []):
                for i in reversed(roomConfig.get('matchConf', {}).get('feeRewardList', [])):
                    reasonType, reason = cls._canQuickEnterRoom(userId, ctrRoomId, mixId=i.get('mixId'))
                    if reason == ENTER_ROOM_REASON_OK:
                        mixId = i.get('mixId')
                        return ctrRoomId, ENTER_ROOM_REASON_OK, mixId
                    else:
                        mixId = ''
            else:
                if kwargs.get('rankId', '-1') == '1':
                    maxCoin = roomConfig.get('maxCoin', -1)
                    if maxCoin > 0 and userChip >= maxCoin:
                        return 0, ENTER_ROOM_REASON_GREATER_MAX, mixId
                reasonType, reason = cls._canQuickEnterRoom(userId, ctrRoomId)
            if ftlog.is_debug():
                ftlog.debug("|roomId, ret:", ctrRoomId, (reasonType, reason), caller=cls)
            if reason == ENTER_ROOM_REASON_OK:
                return ctrRoomId, ENTER_ROOM_REASON_OK, mixId
            # 中途退出在房间内
            if reason == ENTER_ROOM_REASON_QUIT_ROOM_ERROR:
                inRoom = True
        # 大积分排行榜
        if kwargs.get('rankId', '-1') in ['0', '1']:
            return lastCtrRoomId, ENTER_ROOM_REASON_LESS_MIN, mixId
        return lastCtrRoomId, ENTER_ROOM_REASON_QUIT_ROOM_ERROR if inRoom else ENTER_ROOM_REASON_LESS_MIN_QUICKSTART, mixId
Beispiel #24
0
def __get_room_ratio(roomId):
    bigRoomId = gdata.roomIdDefineMap()[roomId].bigRoomId
    if not bigRoomId: return 1
    confs = dizhuconf.getSkillSCoreRatioRoom()
    for conf_ in confs:
        if bigRoomId in conf_['roomlist']:
            return conf_['ratio']
    return 1
Beispiel #25
0
    def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly):
        """是否能快速进入房间"""
        try:
            chip = userchip.getChip(userId)
            if ftlog.is_debug():
                ftlog.debug(gdata.roomIdDefineMap()[roomId].configure)
            roomConfig = gdata.roomIdDefineMap()[roomId].configure
            if ftlog.is_debug():
                ftlog.debug('userId =', userId, 'minCoin =',
                            roomConfig.get('minCoin'), 'maxCoin =',
                            roomConfig.get('maxCoin'), 'minCoinQS =',
                            roomConfig.get('minCoinQS'), 'maxCoinQS =',
                            roomConfig.get('maxCoinQS'), 'chip =', chip,
                            'isOnly =', isOnly)
            if isOnly:
                minCoinQs = roomConfig['minCoin']
                maxCoinQs = roomConfig['maxCoin']
            else:
                minCoinQs = roomConfig['minCoinQS']
                maxCoinQs = roomConfig['maxCoinQS']
            ismatch = roomConfig.get('ismatch')

            if ismatch or minCoinQs <= 0:
                return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED

            if ftlog.is_debug():
                ftlog.debug('roomId =',
                            roomId,
                            'minCoinQs =',
                            minCoinQs,
                            'maxCoinQs =',
                            maxCoinQs,
                            'chip =',
                            chip,
                            caller=cls)

            if chip < minCoinQs:
                return TYRoom.ENTER_ROOM_REASON_LESS_MIN
            if maxCoinQs > 0 and chip >= maxCoinQs:
                return TYRoom.ENTER_ROOM_REASON_GREATER_MAX

            return TYRoom.ENTER_ROOM_REASON_OK

        except Exception as e:
            ftlog.error(e)
            return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
Beispiel #26
0
    def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly):
        ret = cls._canQuickEnterRoomBase(userId, gameId, roomId, isOnly)
        if ret != TYRoom.ENTER_ROOM_REASON_OK:
            return ret

        roomConfig = gdata.roomIdDefineMap()[roomId].configure

        # 检测准入情况,配置中若没有准入时间(openTimeList),则默认准许全天进入
        if not cls._checkOpenTime(roomConfig, datetime.now().time()):
            return TYRoom.ENTER_ROOM_REASON_NOT_OPEN

        if roomConfig.get('typeName') in ('dizhuFT', 'dizhu_friend'):
            return TYRoom.ENTER_ROOM_REASON_NOT_OPEN

        clientId = sessiondata.getClientId(userId)
        if not dizhuhallinfo.canDisplayRoom(gameId, userId, clientId, roomId,
                                            roomConfig):
            if ftlog.is_debug():
                ftlog.debug(
                    'DizhuQuickStartV4_0._canQuickEnterMatchRoom NotCanDisplayRoom',
                    'gameId=', gameId, 'userId=', userId, 'clientId=',
                    clientId, 'roomId=', roomId)
            return TYRoom.ENTER_ROOM_REASON_NOT_OPEN

        # 大师分和vip准入筛选
        # 两个条件是`或者`的关系
        dashifenLevel = roomConfig.get('dashifenLevel', 0)
        vipLevel = roomConfig.get('vipLevel', 0)
        ftlog.debug('_canQuickEnterRoom->', userId, gameId, roomId,
                    'dashifenLevel=', dashifenLevel, 'vipLevel=', vipLevel)
        if dashifenLevel <= 0 and vipLevel <= 0:
            return TYRoom.ENTER_ROOM_REASON_OK

        # 若大师分不满足情况,则再检测VIP,不能直接返回大师分不满足的错误
        if dashifenLevel > 0:
            dashifen = 0
            from dizhu.game import TGDizhu
            info = TGDizhu.getDaShiFen(userId, None)
            ftlog.debug('_canQuickEnterRoom->', userId, gameId, roomId,
                        'dashifenInfo=', info)
            if info:
                dashifen = info.get('level', 0)
            if dashifen >= dashifenLevel:
                return TYRoom.ENTER_ROOM_REASON_OK

        if vipLevel > 0:
            vip = 0
            vipInfo = hallvip.userVipSystem.getUserVip(userId)
            ftlog.debug('_canQuickEnterRoom->', userId, gameId, roomId,
                        'vipInfo=', vipInfo)
            if vipInfo:
                vip = vipInfo.vipLevel.level
            if vip >= vipLevel:
                return TYRoom.ENTER_ROOM_REASON_OK

        return TYRoom.ENTER_ROOM_REASON_DASHIFEI_LEVEL
Beispiel #27
0
 def getResponseDelaySecond(self):
     roomConf = gdata.roomIdDefineMap()[self.roomId].configure
     robotUserOpTime = roomConf.get('robotUserOpTime', None)
     if robotUserOpTime:
         return random.randint(int(min(robotUserOpTime)), int(max(robotUserOpTime)))
     if self.responseDelaySecond < 0:
         delay = 0
     else:
         delay = random.randint(0, self.responseDelaySecond)  # 随机延迟进入
     return delay
Beispiel #28
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))
Beispiel #29
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)
Beispiel #30
0
    def _doJoinCreateTable(self, room, msg):
        assert room.roomId == msg.getParam("roomId")
        userId = msg.getParam("userId")
        shadowRoomId = msg.getParam("shadowRoomId")
        tableId = msg.getParam("tableId")
        clientId = msg.getParam("clientId")
        ftlog.info("<<|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId, room.roomId, shadowRoomId, tableId)

        assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap()[shadowRoomId].bigRoomId == room.roomDefine.bigRoomId
        extParams = msg.getKey('params')
        room.querySitReq(userId, shadowRoomId, tableId, clientId, extParams)
Beispiel #31
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)
Beispiel #32
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)
Beispiel #33
0
 def getResponseDelaySecond(self):
     roomConf = gdata.roomIdDefineMap()[self.roomId].configure
     robotUserOpTime = roomConf.get('robotUserOpTime', None)
     if robotUserOpTime:
         return random.randint(int(min(robotUserOpTime)),
                               int(max(robotUserOpTime)))
     if self.responseDelaySecond < 0:
         delay = 0
     else:
         delay = random.randint(0, self.responseDelaySecond)  # 随机延迟进入
     return delay
Beispiel #34
0
 def _sendChargeLeadTodoTask(cls, userId, roomId, clientId, mixId):
     bigRoomId = gdata.getBigRoomId(roomId)
     ctrRoomId = bigRoomId * 10000 + 1000
     roomConfig = gdata.roomIdDefineMap()[ctrRoomId].configure
     mixConfRoomId = cls.getMixConf(roomConfig, mixId).get('roomId', 0)
     if roomConfig.get('isMix', 0) and mixConfRoomId:
         roomId = mixConfRoomId
     product, _ = hallproductselector.selectLessbuyProduct(DIZHU_GAMEID, userId, clientId, roomId)
     t = TodoTaskPayOrder(product)
     msg = TodoTaskHelper.makeTodoTaskMsg(DIZHU_GAMEID, userId, t)
     router.sendToUser(msg, userId)
Beispiel #35
0
    def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly):

        try:
            chip = userchip.getChip(userId)
            if ftlog.is_debug():
                ftlog.debug(gdata.roomIdDefineMap()[roomId].configure)
            roomConfig = gdata.roomIdDefineMap()[roomId].configure
            if ftlog.is_debug():
                ftlog.debug('userId =', userId,
                            'minCoin =', roomConfig.get('minCoin'),
                            'maxCoin =', roomConfig.get('maxCoin'),
                            'minCoinQS =', roomConfig.get('minCoinQS'),
                            'maxCoinQS =', roomConfig.get('maxCoinQS'),
                            'chip =', chip,
                            'isOnly =', isOnly)
            if isOnly:
                minCoinQs = roomConfig['minCoin']
                maxCoinQs = roomConfig['maxCoin']
            else:
                minCoinQs = roomConfig['minCoinQS']
                maxCoinQs = roomConfig['maxCoinQS']
            ismatch = roomConfig.get('ismatch')

            if ismatch or minCoinQs <= 0:
                return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED

            if ftlog.is_debug():
                ftlog.debug('roomId =', roomId, 'minCoinQs =', minCoinQs,
                            'maxCoinQs =', maxCoinQs, 'chip =', chip,
                            caller=cls)

            if chip < minCoinQs:
                return TYRoom.ENTER_ROOM_REASON_LESS_MIN
            if maxCoinQs > 0 and chip >= maxCoinQs:
                return TYRoom.ENTER_ROOM_REASON_GREATER_MAX

            return TYRoom.ENTER_ROOM_REASON_OK

        except Exception as e:
            ftlog.error(e)
            return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
Beispiel #36
0
    def doQuickStart(self, msg):
        assert self.roomId == msg.getParam("roomId")

        userId = msg.getParam("userId")
        shadowRoomId = msg.getParam("shadowRoomId")
        tableId = msg.getParam("tableId")
        clientId = msg.getParam("clientId")
        ftlog.hinfo("doQuickStart <<", "|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId,
                    self.roomId, shadowRoomId, tableId)

        # msg = TYPluginCenter.event(TYPluginUtils.updateMsg(cmd='EV_QUICK_START', params=TYPluginUtils.mkdict(
        #     userId=userId, roomId=self.roomId), result={}), self.gameId)
        #
        # if msg.getResult("reason") != None:
        #     info = u'玩家需要验证'
        #     self.sendQuickStartRes(self.gameId, userId, msg.getResult("reason"), self.bigRoomId, 0, info)
        #     return

        if tableId == 0:
            isOk, reason = self.doEnter(userId)
        elif tableId == self.roomId * 10000:
            if userId in self._roomUsers:
                isOk = True  # 玩家在队列里时断线重连
                reason = TYRoom.ENTER_ROOM_REASON_OK
            else:  # 服务器重启造成玩家已经不在房间对象里了
                onlinedata.removeOnlineLoc(userId, self.roomId, tableId)
                isOk = False
                reason = TYRoom.ENTER_ROOM_REASON_CONFLICT
        else:  # 防御性代码,处理快速开始online错乱
            onlineSeat = onlinedata.getOnlineLocSeatId(userId, shadowRoomId, tableId)
            if onlineSeat == 0:  # 断线重连过程中玩家因为超时、金币不足或比赛淘汰等原因已被踢出房间
                isOk = False
                reason = TYRoom.ENTER_ROOM_REASON_CONFLICT
                ftlog.warn("doQuickStart conflict!", "|userId, onlineLocList:", userId,
                           onlinedata.getOnlineLocList(userId),
                           "|shadowRoomId, tableId:", shadowRoomId, tableId)
            else:
                ftlog.error("doQuickStart conflict!", "|onlineSeat:", onlineSeat)
                if onlineSeat == gdata.roomIdDefineMap()[shadowRoomId].configure['tableConf']['maxSeatN'] + 1:
                    # 牌桌里旁观的玩家断线重连,请求转给GT
                    self.sendTableCallObserveReq(userId, shadowRoomId, tableId, clientId)
                elif onlineSeat > 0:
                    # 牌桌里坐着的玩家断线重连,请求转给GT
                    self.querySitReq(userId, shadowRoomId, tableId, clientId)
                return

        if isOk:
            self._onQuickStartOk(userId)
        elif reason == TYRoom.ENTER_ROOM_REASON_CONFLICT:
            info = u'玩家已经在游戏中,状态冲突'
            self.sendQuickStartRes(self.gameId, userId, reason, self.bigRoomId, 0, info)
        else:
            self.sendQuickStartRes(self.gameId, userId, reason, self.bigRoomId, 0, '')
Beispiel #37
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)
Beispiel #38
0
 def _fetchAllRoomInfos(self, uid, gid, playMode):
     ftlog.debug("|gameId, roomIds:", gid, [
         room.roomId
         for room in gdata.roomIdDefineMap().values() if room.gameId == gid
     ])
     ftlog.debug("|gameId, bigRoomIds:", gid,
                 list(gdata.gameIdBigRoomidsMap()[gid]))
     ctlRoomIds = [
         bigRoomId * 10000 + 1000
         for bigRoomId in gdata.gameIdBigRoomidsMap()[gid]
     ]
     ctlRoomIds.sort()
     ftlog.debug("|gameId, ctrRoomIds:", gid, ctlRoomIds)
     roomInfos = []
     ucount_infos = bireport.getRoomOnLineUserCount(gid, True)
     ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos)
     if playMode:
         for ctlRoomId in ctlRoomIds:
             roomDef = gdata.roomIdDefineMap()[ctlRoomId]
             ftlog.debug('_generateRoomList ', 'roomDef=', roomDef)
             roomConfig = roomDef.configure
             if roomConfig.get('playMode', None) == playMode \
                     and (not roomConfig.get('ismatch', 0)) \
                     and (not roomConfig.get(MFTDefine.IS_CREATE, 0)):
                 # 有playMode 非比赛 非自建桌
                 roomDesc = {}
                 roomDesc["play_mode"] = roomConfig["playMode"]
                 roomDesc["min_coin"] = roomConfig["minCoin"]
                 roomDesc["max_coin"] = roomConfig["maxCoin"]
                 roomDesc["base_chip"] = roomConfig["tableConf"][
                     "base_chip"]
                 roomDesc["service_fee"] = roomConfig["tableConf"][
                     "service_fee"]
                 playerCount = ucount_infos[1].get(str(roomDef.bigRoomId),
                                                   0)
                 ftlog.debug("_fetchAllRoomInfosxxxxxxxx", ucount_infos[1],
                             roomDef.bigRoomId, ctlRoomId, playerCount)
                 roomInfos.append(
                     [ctlRoomId, playerCount, "", "", "", roomDesc])
     return roomInfos
Beispiel #39
0
    def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly):
        try:
            chip = userchip.getChip(userId)
            ftlog.debug(gdata.roomIdDefineMap()[roomId].configure, caller=cls)
            roomConfig = gdata.roomIdDefineMap()[roomId].configure
            ismatch = roomConfig.get('ismatch')
            isBigMatch = False
            if roomConfig.get('typeName', '') == 'majiang_bigmatch':
                isBigMatch = True
            if ismatch and not isBigMatch:
                return cls._canQuickEnterMatch(userId, gameId, roomId, chip)

            if isOnly:
                minCoinQs = roomConfig['minCoin']
                maxCoinQs = roomConfig['maxCoin']
            else:
                minCoinQs = roomConfig['minCoinQS']
                maxCoinQs = roomConfig['maxCoinQS']

            ftlog.debug('MajiangQuickStartV4_0 roomId:',
                        roomId,
                        'minCoinQs:',
                        minCoinQs,
                        'maxCoinQs:',
                        maxCoinQs,
                        'chip:',
                        chip,
                        caller=cls)

            if chip < minCoinQs and (minCoinQs != -1):
                return TYRoom.ENTER_ROOM_REASON_LESS_MIN

            if maxCoinQs > 0 and chip >= maxCoinQs:
                return TYRoom.ENTER_ROOM_REASON_GREATER_MAX

            return TYRoom.ENTER_ROOM_REASON_OK

        except Exception as e:
            ftlog.error(e)
            return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
Beispiel #40
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
Beispiel #41
0
    def getBestTableId(self, userId, shadowRoomId, exceptTableId=None):
        '''原子化从redis里获取和删除评分最高的桌子Id
        Return:
            None: tableScores 队列为空, 所有桌子都在分配座位中
        '''

        def getBestTableIdFromRedis(shadowRoomId):
            '''从redis里取出并删除一个评分最高的牌桌
            '''
            tableId, tableScore = 0, 0
            datas = daobase.executeTableLua(shadowRoomId, 0, room_scripts.ALIAS_GET_BEST_TABLE_ID_LUA, 1,
                                            self.getTableScoresKey(shadowRoomId), 0)
            if datas and len(datas) == 2:
                tableId, tableScore = datas[0], datas[1]
            return tableId, tableScore

        if ftlog.is_debug():
            ftlog.debug("<<", "|shadowRoomId, exceptTableId:", shadowRoomId, exceptTableId, caller=self)
        pigTables = []
        tableId = 0
        for _ in xrange(5):  # 所有桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试
            if gdata.roomIdDefineMap()[shadowRoomId].tableCount == 1:
                tableId = shadowRoomId * 10000 + 1
                tableScore = 100
            else:
                tableId, tableScore = getBestTableIdFromRedis(shadowRoomId)  # 从redis取一个牌桌

                # 该牌桌被客户端指定排除了,另外再取一个牌桌
                if exceptTableId and tableId and exceptTableId == tableId:
                    tableId1, tableScore1 = getBestTableIdFromRedis(shadowRoomId)

                    # 把之前从redis取出的牌桌加回redis
                    self._updateTableScore(shadowRoomId, tableScore, tableId, force=True)
                    tableId, tableScore = tableId1, tableScore1

            if ftlog.is_debug():
                ftlog.debug('getBestTableId shadowRoomId, tableId, tableScore=', shadowRoomId, tableId, tableScore)
            if tableId:
                if TYGame(self.gameId).isWaitPigTable(userId, self, tableId):
                    pigTables.append([shadowRoomId, tableScore, tableId])
                    tableId = 0
                    continue
                else:
                    break
            else:
                FTTasklet.getCurrentFTTasklet().sleepNb(0.2)
        if ftlog.is_debug():
            ftlog.debug('getBestTableId pigTables=', pigTables)
        if pigTables:
            for pig in pigTables:
                self._updateTableScore(pig[0], pig[1], pig[2], False)
        return tableId
Beispiel #42
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)
Beispiel #43
0
    def _doJoinCreateTable(self, room, msg):
        assert room.roomId == msg.getParam("roomId")
        userId = msg.getParam("userId")
        shadowRoomId = msg.getParam("shadowRoomId")
        tableId = msg.getParam("tableId")
        clientId = msg.getParam("clientId")
        ftlog.info("<<|userId, clientId, roomId, shadowRoomId, tableId:",
                   userId, clientId, room.roomId, shadowRoomId, tableId)

        assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap(
        )[shadowRoomId].bigRoomId == room.roomDefine.bigRoomId
        extParams = msg.getKey('params')
        room.querySitReq(userId, shadowRoomId, tableId, clientId, extParams)
Beispiel #44
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
Beispiel #45
0
 def onMsgTableBegin(self):
     ftlog.debug('|self.roomId:', self.roomId, caller=self)
     roomTypeName = gdata.roomIdDefineMap()[self.roomId].configure['typeName']
     # if roomTypeName in (rooms.tyRoomConst.ROOM_TYPE_NAME_NORMAL,
     #                     rooms.tyRoomConst.ROOM_TYPE_NAME_QUEUE,
     #                     rooms.tyRoomConst.ROOM_TYPE_NAME_SNG,
     #                     rooms.tyRoomConst.ROOM_TYPE_NAME_HUNDREDS,
     #                     rooms.tyRoomConst.ROOM_TYPE_NAME_DTG):
     #     self._enterRoom()
     if roomTypeName in (rooms.tyRoomConst.ROOM_TYPE_NAME_CUSTOM):
         self._enterTable()
     # if roomTypeName == rooms.tyRoomConst.ROOM_TYPE_NAME_MTT:
     #     self._signinMtt()
     return
Beispiel #46
0
    def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly):

        try:
            chip = userchip.getChip(userId)
            ftlog.debug(gdata.roomIdDefineMap()[roomId].configure, caller=cls)
            roomConfig = gdata.roomIdDefineMap()[roomId].configure
            ismatch = roomConfig.get('ismatch')
            isBigMatch = False
            if roomConfig.get('typeName', '') == 'majiang_bigmatch':
                isBigMatch = True
            if ismatch and not isBigMatch:
                return cls._canQuickEnterMatch(userId, gameId, roomId, chip)

            if isOnly:
                minCoinQs = roomConfig['minCoin']
                maxCoinQs = roomConfig['maxCoin']
            else:
                minCoinQs = roomConfig['minCoinQS']
                maxCoinQs = roomConfig['maxCoinQS']

            if minCoinQs <= 0:
                return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED

            ftlog.debug('roomId =', roomId, 'minCoinQs =', minCoinQs,
                        'maxCoinQs =', maxCoinQs, 'chip =', chip,
                        caller=cls)

            if chip < minCoinQs:
                return TYRoom.ENTER_ROOM_REASON_LESS_MIN
            if maxCoinQs > 0 and chip >= maxCoinQs:
                return TYRoom.ENTER_ROOM_REASON_GREATER_MAX

            return TYRoom.ENTER_ROOM_REASON_OK

        except Exception as e:
            ftlog.error(e)
            return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
Beispiel #47
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
Beispiel #48
0
 def _sendMatchSignsToUser(self, userId, gameId, clientId):
     signs = {}
     for roomdef in gdata.roomIdDefineMap().values():
         if roomdef.shadowId == 0 and roomdef.configure.get('ismatch'):
             roomId = roomdef.roomId
             issignin = daobase.executeTableCmd(roomId, 0, 'SISMEMBER', 'signs:' + str(roomId), userId)
             if issignin:
                 signs[roomdef.bigRoomId] = 1
     if signs:
         mo = MsgPack()
         mo.setCmd('m_signs')
         mo.setResult('gameId', gameId)
         mo.setResult('userId', userId)
         mo.setResult('signs', signs)
         router.sendToUser(mo, userId)
Beispiel #49
0
def _getRoomOnLineUserCount(gameId, withShadowRoomInfo):
    '''
    重BI数据库中取得当前的游戏的所有的在线人数信息
    return allcount, counts, details, allobcount, obcounts, obdetails
    allcount int,游戏内所有房间的人数的总和
    counts 字典dict,key为大房间ID(bigRoomId),value为该大房间内的人数总和
    details 字典dict,key为房间实例ID(roomId),value为该房间内的人数
    allobcount, obcounts, obdetails 观察者数量,需要table类实现observersNum属性
    此数据由每个GR,GT进程每10秒钟向BI数据库进行汇报一次
    '''
    rkey = daoconst.BI_KEY_ROOM_ONLINES % (gameId)
    datas = daobase._executeBiCmd('HGETALL', rkey)
    counts = {}
    details = {}
    allcount = 0
    allobcount = 0
    obdetails = {}
    obcounts = {}
    if datas:
        allrooms = gdata.roomIdDefineMap()
        for x in xrange(len(datas) / 2):
            i = x * 2
            roomId = int(datas[i])
            roomConf = allrooms.get(roomId, None)
            if roomConf:
                bigRoomId = str(roomConf.bigRoomId)
                tks = datas[i + 1].split('|')
                ucount, ocount = strutil.parseInts(tks[0], tks[-1])
                ucount += roomConf.configure.get('dummyUserCount', 0)
                if withShadowRoomInfo:
                    details[str(roomId)] = ucount
                if bigRoomId in counts:
                    counts[bigRoomId] += ucount
                else:
                    counts[bigRoomId] = ucount
                allcount += ucount

                if withShadowRoomInfo:
                    obdetails[str(roomId)] = ocount
                if bigRoomId in obcounts:
                    obcounts[bigRoomId] += ocount
                else:
                    obcounts[bigRoomId] = ocount
                allobcount += ocount

            else:
                daobase._sendBiCmd('HDEL', rkey, roomId)
    return allcount, counts, details, allobcount, obcounts, obdetails
Beispiel #50
0
 def callUpRobot(self, msg, roomId, tableId, userCount, seatCount, users):
     '''
     唤醒机器人 (由TABLE进程SEND命令触发, 无需响应)
     检查该桌子是否需要进入机器人
     具体的机器人进入策略由各个游戏自己负责
     '''
     ftlog.debug("<<|roomId, tableId, userCount, seatCount, users:", roomId, tableId, userCount, seatCount, users)
     roomConf = gdata.roomIdDefineMap()[roomId].configure
     delay = roomConf.get('robotUserCallUpTime', -1)
     if delay < 0:
         if self.callUpDelaySecond < 0:
             delay = 0
         else:
             delay = random.randint(0, self.callUpDelaySecond)  # 随机延迟进入
     evt = RobotEvent(delay, 'callup', msg, roomId, tableId, userCount, seatCount, users)
     self.eventQueue.append(evt)
     return
Beispiel #51
0
    def _chooseCreateRoom(cls, userId, gameId, playMode, playerCount=4):
        """
        服务端为玩家选择要创建的房间
        """
        candidateRoomIds = MajiangQuickStartV4_0._getCandidateRoomIds(gameId, playMode)
        ftlog.debug("<<|candidateRoomIds:", candidateRoomIds, 'playMode=', playMode, caller=cls)

        for roomId in candidateRoomIds:
            roomConfig = gdata.roomIdDefineMap()[roomId].configure
            tableConf = roomConfig.get('tableConf', {})
            ftlog.debug('_chooseCreateRoom tableConf:', tableConf)

            if roomConfig.get(MFTDefine.IS_CREATE, 0) and (tableConf.get(MTDefine.MAXSEATN, 4) == playerCount):
                ret = cls._canQuickEnterCreateRoom(userId, gameId, roomId)
                ftlog.debug("|roomId, ret:", roomId, ret, caller=cls)
                if ret == TYRoom.ENTER_ROOM_REASON_OK:
                    return roomId, TYRoom.ENTER_ROOM_REASON_OK
        return 0, TYRoom.ENTER_ROOM_REASON_LESS_MIN
Beispiel #52
0
    def adjustChip(self, minCoin=None, maxCoin=None):
        if not isinstance(minCoin, int) or not isinstance(maxCoin, int) \
                or minCoin < 0 or maxCoin < 0 or minCoin >= maxCoin:
            roomDef = gdata.roomIdDefineMap()[self.roomId]
            roomConf = roomDef.configure
            maxCoin = roomConf['maxCoin']
            minCoin = roomConf['minCoin']
            maxCoin = maxCoin if maxCoin > 0 else minCoin + 100000

        uchip = userchip.getChip(self.userId)
        ftlog.debug('adjustChip->userId, uchip, minCoin, maxCoin =', self.snsId, self.userId, uchip, minCoin, maxCoin)
        if uchip < minCoin or uchip > maxCoin:
            nchip = random.randint(minCoin + 1, minCoin + 1000)
            dchip = nchip - uchip
            trueDelta, finalCount = userchip.incrChip(self.userId, self.gameId, dchip,
                                                      daoconst.CHIP_NOT_ENOUGH_OP_MODE_NONE,
                                                      'SYSTEM_ADJUST_ROBOT_CHIP',
                                                      self.roomId, self.clientId)
            ftlog.debug('adjustChip->userId, trueDelta, finalCount=', self.snsId, self.userId, trueDelta, finalCount)
Beispiel #53
0
    def doHallSigns(self):
        msg = runcmd.getMsgPack()
        ftlog.debug('msg=', msg)
        gameId = msg.getParam("gameId")
        userId = msg.getParam("userId")

        msgRes = MsgPack()
        msgRes.setCmd('m_signs')
        msgRes.setResult('gameId', gameId)
        msgRes.setResult('userId', userId)
        signs = {}
        for roomdef in gdata.roomIdDefineMap().values():
            if roomdef.shadowId == 0 and roomdef.configure.get('ismatch'):
                roomId = roomdef.roomId
                issignin = daobase.executeTableCmd(roomId, 0, 'SISMEMBER', 'signs:' + str(roomId), userId)
                if issignin:
                    signs[roomdef.bigRoomId] = 1

        msgRes.setResult('signs', signs)
        router.sendToUser(msgRes, userId)
Beispiel #54
0
    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
Beispiel #55
0
def __initializeRooms(gdatas):
    '''
    初始化所有的房间对象
    '''
    if _DEBUG:
        debug('initializeRooms begin')
    from poker.entity.game.rooms import getInstance
    srvid = gdata.serverId()
    roomids = gdata.srvIdRoomIdListMap().get(srvid, None)
    if roomids:
        tyrooms = {}
        gdatas['tyrooms.instance.dict'] = tyrooms
        allrooms = gdata.roomIdDefineMap()
        for roomid in roomids:
            roomdefine = allrooms[roomid]
            roomins = getInstance(roomdefine)
            assert (isinstance(roomins, TYRoom))
            tyrooms[roomid] = roomins
        gdatas['tyrooms.instance.dict'] = makeReadonly(tyrooms)
    if _DEBUG:
        debug('initializeRooms end')
Beispiel #56
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))
Beispiel #57
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 gdata.roomIdDefineMap()[shadowRoomId].tableCount == 1:
            return tableId

        for _ in xrange(5):  # 这张桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试
            result = daobase.executeTableCmd(shadowRoomId, 0, "ZREM", self.getTableScoresKey(shadowRoomId), tableId)
            if ftlog.is_debug():
                ftlog.debug("after ZREM tableId", "|userId, shadowRoomId, tableId, result:",
                            userId, shadowRoomId, tableId, result, caller=self)
            if result == 1:
                return tableId

            FTTasklet.getCurrentFTTasklet().sleepNb(1)

        return 0
Beispiel #58
0
    def doAwardCertificate(self, userId, gameId, match_id, clientId):
        '''
        TCP 发送的至UTIL服务的quick_start暂时不能用lock userid的方式, 
        因为,消息流 CO->UT->GR->GT->UT会死锁
        '''
        msg = runcmd.getMsgPack()
        roomId = msg.getParam("roomId")
        ftlog.debug('doAwardCertificate', userId, gameId, roomId, match_id, caller=self)
        if len(str(roomId)) != 4 and len(str(roomId)) != 8 and len(str(roomId)) != 0:
            roomIdx = roomId
            roomId = roomId * 100
            ftlog.info("doAwardCertificate roomID error, from %d change to %d" % (roomIdx, roomId))

        allrooms = gdata.roomIdDefineMap()
        ctrlRoomId = roomId
        if roomId in allrooms:
            roomDef = allrooms[roomId]
            if roomDef.parentId > 0:  # this roomId is shadowRoomId
                ctrlRoomId = roomDef.parentId
        else:
            ftlog.warn("doAwardCertificate, error roomId", roomId)
            return

        ftlog.debug("ctrlRoomId:", ctrlRoomId)

        msg1 = MsgPack()
        msg1.setCmd('room')
        msg1.setParam('gameId', gameId)
        msg1.setParam('userId', userId)
        msg1.setParam('roomId', ctrlRoomId)
        msg1.setParam('action', "match_award_certificate")
        msg1.setParam('match_id', match_id)
        msg1.setParam('clientId', clientId)
        router.sendRoomServer(msg1, roomId)
        if router.isQuery():
            mo = runcmd.newOkMsgPack(1)
            router.responseQurery(mo, '', str(userId))
Beispiel #59
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))