예제 #1
0
파일: match.py 프로젝트: luningcowboy/tuyoo
    def getMatchInfo(cls, room, uid, mo):
        match = cls.getMatch(room.roomId)
        if not match:
            mo.setError(1, 'not a match room')
            return

        inst = match.currentInstance
        if not inst:
            return

        conf = inst.matchConf if inst else match.matchConf

        info = {}
        info['roomId'] = room.roomId
        info['type'] = MatchType.USER_COUNT
        info['name'] = room.roomConf["name"]
        info['minPlayer'] = info['maxPlayer'] = conf.stages[0].totalUserCount
        info['state'] = cls.translateState(inst.state)
        info['curTimeLeft'] = 0
        mo.setResult('info', info)
        mo.setResult('startTime', '')

        matchDuration = int(cls.calcMatchDuration(conf) / 60)
        mo.setResult('rankRewards', cls.buildRankRewards(conf.rankRewardsList))
        mo.setResult('duration', '约%d分钟' % (min(30, matchDuration)))

        mo.setResult('tips', {
            'infos': conf.tips.infos,
            'interval': conf.tips.interval
        })

        record = MatchRecord.loadRecord(room.gameId, uid, match.matchId)
        if record:
            mo.setResult(
                'mrecord', {
                    'bestRank': record.bestRank,
                    'bestRankDate': record.bestRankDate,
                    'isGroup': record.isGroup,
                    'crownCount': record.crownCount,
                    'playCount': record.playCount
                })
        mo.setResult('fees', [])
        # 报名费列表
        mo.setResult('feesList', cls.buildFeesList(uid, conf.fees))
        # 分组赛奖励列表 arena_match没有分组奖励
        mo.setResult('groupRewardList', [])
        # 比赛进程 海选赛-》分组赛-》8强赛-》总决赛
        stagesList = cls.buildStages(conf.stages) if conf.stages else []
        mo.setResult('stages', stagesList)
        # 比赛报名的前提条件
        conditionDesc = cls.getMatchConditionDesc(room.roomId, uid)
        if conditionDesc:
            mo.setResult('conditionDesc', conditionDesc)
        # 比赛奖励分割线文字
        mo.setResult('splitWord', cls.getMatchRewardSplitWord(room.roomId))
        # 获得比赛历史数据
        mo.setResult(
            'hisitory',
            MatchHistoryHandler.getMatchHistory(uid, match.matchConf.recordId))
예제 #2
0
    def getMatchUserInfo(self, userId, tableInfo, oseat):
        oseat['mscore'] = 0
        oseat['mrank'] = 0
        try:
            for userInfo in tableInfo['userInfos']:
                if userInfo['userId'] == userId:
                    oseat['mscore'] = userInfo['score']
                    oseat['mrank'] = userInfo['rank']

                    record = MatchRecord.loadRecord(self.table.gameId, userId,
                                                    tableInfo['matchId'])
                    if record:
                        oseat['mrecord'] = {
                            'bestRank': record.bestRank,
                            'crownCount': record.crownCount,
                            'playCount': record.playCount
                        }
        except:
            ftlog.exception()
예제 #3
0
    def buildSeatInfo(self, forSeat, seat):
        seatInfo = super(DizhuTableProtoErdayiMatch,
                         self).buildSeatInfo(forSeat, seat)
        seatInfo['mscore'], seatInfo['mrank'] = (
            seat.player.score, seat.player.rank) if seat.player else (0, 0)
        if seat.player and not seat.player.isAI and self.table.matchTableInfo:
            record = MatchRecord.loadRecord(
                self.gameId, seat.userId, self.table.matchTableInfo['matchId'])
            if record:
                seatInfo['mrecord'] = {
                    'bestRank': record.bestRank,
                    'crownCount': record.crownCount,
                    'playCount': record.playCount
                }
            if ftlog.is_debug():
                ftlog.debug('DizhuTableProtoGroupMatch.buildSeatInfo',
                            'userId=', seat.player.userId, 'score=',
                            seat.player.score, 'rank=', seat.player.rank)

        return seatInfo
예제 #4
0
 def getMatchUserInfo(self, userId, tableInfo, oseat):
     oseat['mscore'] = 0
     oseat['mrank'] = 0
     try:
         for userInfo in tableInfo['seats']:
             if userInfo['userId'] == userId:
                 oseat['mscore'] = userInfo['score']
                 oseat['mrank'] = userInfo['rank']
                 
                 record = MatchRecord.loadRecord(self.table.gameId, userId, tableInfo.get('recordId', tableInfo['matchId']))
                 if record:
                     oseat['mrecord'] = {
                                 'bestRank':record.bestRank,
                                 'crownCount':record.crownCount,
                                 'playCount':record.playCount
                             }
     except:
         self._logger.error('DizhuGroupMatchSender.getMatchUserInfo',
                            'userId=', userId,
                            'tableInfo=', tableInfo,
                            'oseat=', oseat)
예제 #5
0
파일: match.py 프로젝트: luningcowboy/tuyoo
 def getMatchUserInfo(cls, room, table, uid, oseat):
     if table._match_table_info:
         try:
             uidIndex = cls.__getUserIndex(table._match_table_info, uid)
             if uidIndex != -1:
                 oseat['mscore'] = table._match_table_info['mInfos'][
                     'scores'][uidIndex]
                 oseat['mrank'] = table._match_table_info['mInfos']['rank'][
                     uidIndex]
                 record = MatchRecord.loadRecord(
                     room.gameId, uid, table._match_table_info['matchId'])
                 if record:
                     oseat['mrecord'] = {
                         'bestRank': record.bestRank,
                         'crownCount': record.crownCount,
                         'playCount': record.playCount
                     }
                 return
         except:
             ftlog.exception()
     oseat['mscore'] = 0
     oseat['mrank'] = 0
예제 #6
0
파일: match.py 프로젝트: luningcowboy/tuyoo
    def getMatchInfo(cls, room, uid, mo):
        match = cls.getMatch(room.roomId)
        if not match:
            mo.setError(1, 'not a match room')
            return

        inst = match.curInst
        conf = inst.matchConf if inst else match.matchConf
        state = cls.convertState(inst.state) if inst else 0
        
        # 为了兼容老客户端m_enter的问题加的
        clientVer = sessiondata.getClientIdVer(uid)
        try:
            match.enter(uid)
        except:
            pass
        info = {}
        info['roomId'] = room.roomId
        info['type'] = conf.start.type
        info['name'] = room.roomConf['name']
        if conf.start.isUserCountType():
            info['minPlayer'] = conf.start.userCount
            info['maxPlayer'] = conf.start.userCount
        else:
            info['minPlayer'] = conf.start.userMinCount
            info['maxPlayer'] = conf.start.userMaxCount
            
        info['state'] = cls.convertState(state)
        info['curTimeLeft'] = cls.getMatchCurTimeLeft(inst) if inst else 0
        mo.setResult('info', info)
        mo.setResult('startTime', inst.startTimeStr if inst else '')

        mo.setResult('desc', conf.rankRewardsDesc)
        matchDuration = int(cls.calcMatchDuration(conf) / 60)
        mo.setResult('rankRewards', cls.buildRankRewards(conf.rankRewardsList))
        mo.setResult('duration', '约%d分钟' % (min(30, matchDuration)))
            
        if clientVer >= 3.37:
            mo.setResult('tips', {'infos':conf.tips.infos,
                                  'interval':conf.tips.interval})
            record = MatchRecord.loadRecord(room.gameId, uid, match.matchConf.recordId)
            if record:
                mo.setResult('mrecord', {'bestRank':record.bestRank,
                                         'bestRankDate':record.bestRankDate,
                                         'isGroup':record.isGroup,
                                         'crownCount':record.crownCount,
                                         'playCount':record.playCount})
        mo.setResult('fees', cls.buildFees(conf.fees))
        # 报名费列表
        mo.setResult('feesList', cls.buildFeesList(uid, conf.fees) if conf.fees else [])
        # 分组赛奖励列表
        groupList = []
        if len(conf.stages) > 0 and conf.stages[0].rankRewardsList and conf.stages[0].groupingUserCount:
            groupList = cls.buildRankRewards(conf.stages[0].rankRewardsList, defaultEnd = conf.stages[0].groupingUserCount)
        mo.setResult('groupRewardList', groupList)
        # 比赛进程 海选赛-》分组赛-》8强赛-》总决赛
        stagesList = cls.buildStages(conf.stages) if conf.stages else []
        mo.setResult('stages', stagesList)
        # 比赛报名的前提条件
        conditionDesc = cls.getMatchConditionDesc(room.roomId, uid)
        if conditionDesc:
            mo.setResult('conditionDesc', conditionDesc)
        # 比赛奖励分割线文字
        mo.setResult('splitWord', cls.getMatchRewardSplitWord(room.roomId))
        # 获得比赛历史数据
        mo.setResult('hisitory', MatchHistoryHandler.getMatchHistory(uid, match.matchConf.recordId))
예제 #7
0
 def getMatchInfo(self, userId, mp):
     inst = self.match.curInst
     conf = inst.matchConf if inst else self.match.matchConf
     state = self.convertState(inst.state) if inst else 0
     
     # 为了兼容老客户端m_enter的问题加的
     clientVer = sessiondata.getClientIdVer(userId)
     try:
         self.match.enter(userId)
     except:
         pass
     info = {}
     info['roomId'] = self.roomId
     info['type'] = conf.start.type
     try:
         clientId = sessiondata.getClientId(userId)
         info['name'] = dizhuhallinfo.getMatchSessionName(DIZHU_GAMEID, clientId, self.bigRoomId)
     except:
         info['name'] = self.roomConf['name']
     if conf.start.isUserCountType():
         info['minPlayer'] = conf.start.userCount
         info['maxPlayer'] = conf.start.userCount
     else:
         info['minPlayer'] = conf.start.userMinCount
         info['maxPlayer'] = conf.start.userMaxCount
         
     info['state'] = self.convertState(state)
     info['curTimeLeft'] = self.getMatchCurTimeLeft(inst) if inst else 0
     mp.setResult('info', info)
     mp.setResult('startTime', inst.startTimeStr if inst else '')
     matchDuration = int(self.calcMatchDuration(conf) / 60)
     mp.setResult('rankRewards', self.buildRankRewards(self.match.matchRankRewardsSelector.getRewardsList(userId, conf.rankRewardsList)))
     mp.setResult('duration', '约%d分钟' % (min(30, matchDuration)))
         
     if clientVer >= 3.37:
         mp.setResult('tips', {
                               'infos':conf.tips.infos,
                               'interval':conf.tips.interval
                               })
         record = MatchRecord.loadRecord(self.gameId, userId, self.match.matchConf.recordId)
         if record:
             mp.setResult('mrecord', {'bestRank':record.bestRank,
                                      'bestRankDate':record.bestRankDate,
                                      'isGroup':record.isGroup,
                                     'crownCount':record.crownCount,
                                     'playCount':record.playCount})
     mp.setResult('fees', matchutil.buildFees(conf.fees))
     # 报名费列表
     mp.setResult('feesList', matchutil.buildFeesList(userId, conf.fees) if conf.fees else [])
     # 分组赛奖励列表
     groupList = []
     if len(conf.stages) > 0 and conf.stages[0].rankRewardsList and conf.stages[0].groupingUserCount:
         groupList = self.buildRankRewards(conf.stages[0].rankRewardsList, defaultEnd = conf.stages[0].groupingUserCount)
     mp.setResult('groupRewardList', groupList)
     # 比赛进程 海选赛-》分组赛-》8强赛-》总决赛
     stagesList = self.buildStages(conf.stages) if conf.stages else []
     mp.setResult('stages', stagesList)
     # 比赛报名的前提条件
     conditionDesc = self.getMatchConditionDesc(self.roomId, userId)
     if conditionDesc:
         mp.setResult('conditionDesc', conditionDesc)
     # 比赛奖励分割线文字
     mp.setResult('splitWord', self.getMatchRewardSplitWord())
     # 获得比赛历史数据
     mp.setResult('hisitory', MatchHistoryHandler.getMatchHistory(userId, self.match.matchConf.recordId))
예제 #8
0
    def getMatchInfo(self, userId, signinParams, mo):
        inst = self.match.currentInstance
        if not inst:
            return
        
        mixId = signinParams.get('mixId', None)
        conf = inst.matchConf if inst else self.match.matchConf

        if mixId is None:
            player = self.match.findPlayer(userId)
            if player:
                mixId = player.mixId

        info = {}
        info['roomId'] = self.roomId
        info['mixId'] = mixId
        info['type'] = MatchType.USER_COUNT
        arenaContent = dizhuhallinfo.getArenaMatchProvinceContent(userId, int(mixId) if mixId else self.bigRoomId, None)
        showName = conf.getRoomName(mixId)
        if arenaContent:
            showName = arenaContent.get('showName') or showName
        info['name'] = showName
        info['minPlayer'] = info['maxPlayer'] = conf.stages[0].totalUserCount
        info['state'] = self.translateState(inst.state)
        info['curTimeLeft'] = 0
        mo.setResult('info', info)
        mo.setResult('startTime', '')

        if ftlog.is_debug():
            ftlog.debug('DizhuCtrlRoomArenaMatch.getMatchInfo',
                        'userId=', userId,
                        'signinParams=', signinParams,
                        'mixId=', mixId,
                        'info=', info,
                        'arenaContent=', arenaContent)

        matchDuration = int(self.calcMatchDuration(conf) / 60)
        mo.setResult('rankRewards', self.buildRankRewards(self.match.matchRankRewardsSelector.getRewardsList(userId, conf.getRankRewardsList(mixId), mixId)))
        mo.setResult('duration', '约%d分钟' % (min(30, matchDuration)))
            
        mo.setResult('tips', {'infos':conf.tips.infos,
                              'interval':conf.tips.interval
                              })
        
        record = MatchRecord.loadRecord(self.gameId, userId, self.match.matchId, mixId)
        if record:
            mo.setResult('mrecord', {'bestRank':record.bestRank,
                                     'bestRankDate':record.bestRankDate,
                                     'isGroup':record.isGroup,
                                     'crownCount':record.crownCount,
                                     'playCount':record.playCount})
        mo.setResult('fees', [])
        # 报名费列表
        mo.setResult('feesList', matchutil.buildFeesList(userId, conf.getFees(mixId)))
        # 分组赛奖励列表 arena_match没有分组奖励
        mo.setResult('groupRewardList', [])
        # 比赛进程 海选赛-》分组赛-》8强赛-》总决赛
        stagesList = self.buildStages(conf.stages) if conf.stages else []
        mo.setResult('stages', stagesList)
        # 比赛报名的前提条件
        conditionDesc = self.getMatchConditionDesc(self.roomId, userId)
        if conditionDesc:
            mo.setResult('conditionDesc', conditionDesc)
        # 比赛奖励分割线文字
        mo.setResult('splitWord', self.getMatchRewardSplitWord(self.roomId))
        # 获得比赛历史数据
        mo.setResult('hisitory', MatchHistoryHandler.getMatchHistory(userId, self.match.matchConf.recordId, mixId=mixId))
예제 #9
0
    def notifyMatchOver(self, player, reason, rankRewards):
        '''
        通知用户比赛结束了
        '''
        try:
            if (reason == MatchFinishReason.USER_WIN
                    or reason == MatchFinishReason.USER_LOSER):
                try:
                    event_remote.publishMatchWinloseEvent(
                        self._room.gameId, player.userId,
                        self._room.match.matchId,
                        reason == MatchFinishReason.USER_WIN, player.rank,
                        player.group.startPlayerCount,
                        rankRewards.conf if rankRewards else None)
                    from dizhu.entity.matchhistory import MatchHistoryHandler
                    MatchHistoryHandler.onMatchOver(
                        player.userId, player.group.matchConf.recordId,
                        player.rank, reason == MatchFinishReason.USER_WIN,
                        rankRewards.conf if rankRewards else None,
                        player.group.isGrouping)
                except:
                    self._logger.error('PlayerNotifierDizhu.notifyMatchOver',
                                       'userId=', player.userId, 'groupId=',
                                       player.group.groupId, 'reason=', reason,
                                       'rankRewards=', rankRewards.rewards)

                # 比赛记录保存
                try:
                    event = {
                        'gameId': self._room.gameId,
                        'userId': player.userId,
                        'matchId': self._room.match.matchId,
                        'rank': player.rank,
                        'isGroup': 1 if player.group.isGrouping else 0
                    }
                    MatchRecord.updateAndSaveRecord(event)
                except:
                    self._logger.error('PlayerNotifierDizhu.notifyMatchOver',
                                       'gameId=', self._room.gameId, 'userId=',
                                       player.userId, 'reason=', reason,
                                       'matchId=', self._room.match.matchId,
                                       'rank=', player.rank)

            msg = MsgPack()
            msg.setCmd('m_over')
            msg.setResult('gameId', self._room.gameId)
            msg.setResult('roomId', self._room.bigRoomId)
            msg.setResult('userId', player.userId)
            msg.setResult('reason', reason)
            msg.setResult('rank', player.rank)
            try:
                msg.setResult('beatDownUser', player.beatDownUserName)
            except:
                ftlog.debug('NobeatDownUser group match')
                ftlog.exception()

            if rankRewards or reason == MatchFinishReason.USER_WIN:
                msg.setResult('info',
                              buildWinInfo(self._room, player, rankRewards))
                if rankRewards.todotask:
                    msg.setResult('todotask', rankRewards.todotask)
            else:
                msg.setResult('info', buildLoserInfo(self._room, player))

            msg.setResult(
                'mucount', player.group.startPlayerCount
                if player.group.isGrouping else player.group.totalPlayerCount)
            msg.setResult('date', str(datetime.now().date().today()))
            msg.setResult('time',
                          time.strftime('%H:%M', time.localtime(time.time())))
            msg.setResult('addInfo', '')
            rewardDesc = ''
            if rankRewards:
                from dizhu.bigmatch.match import BigMatch
                msg.setResult('reward', BigMatch.buildRewards(rankRewards))
                rewardDesc = BigMatch.buildRewardsDesc(rankRewards)
                if rewardDesc:
                    msg.setResult('rewardDesc', rewardDesc)
            msg.setResult('mname', getMatchName(self._room, player))

            record = MatchRecord.loadRecord(self._room.gameId, player.userId,
                                            self._room.match.matchId)
            if record:
                msg.setResult(
                    'mrecord', {
                        'bestRank': record.bestRank,
                        'bestRankDate': record.bestRankDate,
                        'isGroup': record.isGroup,
                        'crownCount': record.crownCount,
                        'playCount': record.playCount
                    })
            else:
                from dizhu.activities.toolbox import Tool
                msg.setResult(
                    'mrecord', {
                        'bestRank': player.rank,
                        'bestRankDate': Tool.datetimeToTimestamp(
                            datetime.now()),
                        'isGroup': 1 if player.group.isGrouping else 0,
                        'crownCount': 1 if player.rank == 1 else 0,
                        'playCount': 1
                    })

            try:
                # 设置奖状分享的todotask diplomaShare
                shareTodoTask = dizhudiplomashare.buildDiplomaShare(
                    player.userName, getMatchName(self._room, player),
                    player.rank, rewardDesc, player.userId)
                if shareTodoTask:
                    msg.setResult('shareTodoTask', shareTodoTask)
            except:
                ftlog.debug('NobeatDownUser group match')
                ftlog.exception()

            router.sendToUser(msg, player.userId)

            if reason in (MatchFinishReason.USER_NOT_ENOUGH,
                          MatchFinishReason.RESOURCE_NOT_ENOUGH):
                mo = MsgPack()
                mo.setCmd('m_signs')
                mo.setResult('gameId', self._room.gameId)
                mo.setResult('roomId', self._room.bigRoomId)
                mo.setResult('userId', player.userId)
                mo.setResult('signs', {self._room.bigRoomId: 0})
                router.sendToUser(mo, player.userId)

            if player.rank == 1 and self._room.roomConf.get('championLed'):
                ledtext = '玩家%s在斗地主"%s"中过五关斩六将夺得冠军,获得%s!' % (
                    player.userName, self._room.roomConf['name'], rewardDesc)
                user_remote.sendHallLed(DIZHU_GAMEID, ledtext, 1, 'global', [])

            sequence = int(player.group.instId.split('.')[1])
            self.report_bi_game_event("MATCH_FINISH", player.userId,
                                      player.group.matchId, 0, sequence, 0, 0,
                                      0, [], 'match_end')  #_stage.matchingId
        except:
            self._logger.error('PlayerNotifierDizhu.notifyMatchOver',
                               'userId=', player.userId, 'groupId=',
                               player.group.groupId, 'reason=', reason,
                               'rankRewards=',
                               rankRewards.rewards if rankRewards else None)
예제 #10
0
    def notifyMatchOver(self, player, reason, rankRewards):
        '''
        通知用户比赛结束了
        '''
        try:
            ftlog.info('MatchPlayerNotifierDizhu.notifyMatchOver matchId=',
                       player.matchInst.matchId, 'instId=',
                       player.matchInst.instId, 'userId=', player.userId,
                       'stageIndex=', player.stage.index, 'rank=', player.rank,
                       'reason=', reason, 'rankRewards=', rankRewards)

            if (reason == MatchFinishReason.USER_WIN
                    or reason == MatchFinishReason.USER_LOSER):
                try:
                    event_remote.publishMatchWinloseEvent(
                        self._room.gameId, player.userId,
                        self._room.match.matchId,
                        reason == MatchFinishReason.USER_WIN, player.rank,
                        player.matchInst.matchConf.stages[0].totalUserCount,
                        rankRewards.conf if rankRewards else None)
                    from dizhu.entity.matchhistory import MatchHistoryHandler
                    MatchHistoryHandler.onMatchOver(
                        player.userId, player.matchInst.matchConf.recordId,
                        player.rank, reason == MatchFinishReason.USER_WIN,
                        rankRewards.conf if rankRewards else None, False)
                except:
                    ftlog.error()

                # 比赛记录保存
                try:
                    event = {
                        'gameId': self._room.gameId,
                        'userId': player.userId,
                        'matchId': self._room.match.matchId,
                        'rank': player.rank,
                        'isGroup': 0
                    }
                    MatchRecord.updateAndSaveRecord(event)
                except:
                    ftlog.error()

            msg = MsgPack()
            msg.setCmd('m_over')
            msg.setResult('gameId', self._room.gameId)
            msg.setResult('roomId', self._room.bigRoomId)
            msg.setResult('userId', player.userId)
            msg.setResult('reason', reason)
            msg.setResult('rank', player.rank)

            if rankRewards:
                msg.setResult('info', self.buildWinInfo(player, rankRewards))
            else:
                msg.setResult('info', self.buildLoserInfo(player))
            msg.setResult('mucount',
                          player.matchInst.matchConf.stages[0].totalUserCount)
            msg.setResult('date', str(datetime.now().date().today()))
            msg.setResult('time',
                          time.strftime('%H:%M', time.localtime(time.time())))
            msg.setResult('addInfo', '')
            rewardDesc = ''
            if rankRewards:
                from dizhu.bigmatch.match import BigMatch
                msg.setResult('reward', BigMatch.buildRewards(rankRewards))
                rewardDesc = BigMatch.buildRewardsDesc(rankRewards)
                if rewardDesc:
                    msg.setResult('rewardDesc', rewardDesc)
            msg.setResult('mname', self._room.roomConf["name"])

            try:
                msg.setResult('beatDownUser', player.beatDownUserName)
                if rankRewards and rankRewards.todotask:
                    msg.setResult('todotask', rankRewards.todotask)
                # 设置奖状分享的todotask diplomaShare
                shareTodoTask = dizhudiplomashare.buildDiplomaShare(
                    player.userName, self._room.roomConf["name"], player.rank,
                    rewardDesc, player.userId)
                if shareTodoTask:
                    msg.setResult('shareTodoTask', shareTodoTask)
            except:
                ftlog.debug('NobeatDownUser arena match')
                ftlog.exception()

            record = MatchRecord.loadRecord(self._room.gameId, player.userId,
                                            self._room.match.matchId)
            if record:
                msg.setResult(
                    'mrecord', {
                        'bestRank': record.bestRank,
                        'bestRankDate': record.bestRankDate,
                        'isGroup': record.isGroup,
                        'crownCount': record.crownCount,
                        'playCount': record.playCount
                    })
            else:
                from dizhu.activities.toolbox import Tool
                msg.setResult(
                    'mrecord', {
                        'bestRank': player.rank,
                        'bestRankDate': Tool.datetimeToTimestamp(
                            datetime.now()),
                        'isGroup': 0,
                        'crownCount': 1 if player.rank == 1 else 0,
                        'playCount': 1
                    })

            router.sendToUser(msg, player.userId)

            if player.rank == 1 and self._room.roomConf.get('championLed'):
                # 冠军发送Led通知所有其他玩家
                ledtext = dizhuled._mk_match_champion_rich_text(
                    player.userName, self._room.roomConf['name'],
                    self._room.roomConf.get('rewardShow', rewardDesc))
                LedUtil.sendLed(ledtext, 'global')

            sequence = int(player.matchInst.instId.split('.')[1])
            self.report_bi_game_event('MATCH_FINISH', player.userId,
                                      player.matchInst.matchId, 0, sequence, 0,
                                      0, 0, [], 'match_end')
        except:
            ftlog.error()
def notifyMatchOver(self, player, reason, rankRewards):
    '''
    通知用户比赛结束了
    '''
    try:
        ftlog.info('MatchPlayerNotifierDizhu.notifyMatchOver matchId=',
                   player.matchInst.matchId, 'instId=',
                   player.matchInst.instId, 'userId=', player.userId,
                   'signinParams=', player.signinParams, 'stageIndex=',
                   player.stage.index, 'rank=', player.rank, 'reason=', reason,
                   'rankRewards=', rankRewards)

        if (reason == MatchFinishReason.USER_WIN
                or reason == MatchFinishReason.USER_LOSER):
            try:
                if player.isQuit:
                    rankRewards = None
                event_remote.publishMatchWinloseEvent(
                    self._room.gameId, player.userId, self._room.match.matchId,
                    reason == MatchFinishReason.USER_WIN, player.rank,
                    player.matchInst.matchConf.stages[0].totalUserCount,
                    rankRewards.conf if rankRewards else None)

                tempGameResult = 1 if reason == MatchFinishReason.USER_WIN else -1
                hall51event.sendToHall51MatchOverEvent(player.userId,
                                                       self._room.gameId,
                                                       self._room.bigRoomId,
                                                       tempGameResult, -1, -1)

                from dizhu.entity.matchhistory import MatchHistoryHandler
                MatchHistoryHandler.onMatchOver(
                    player.userId, player.matchInst.matchConf.recordId,
                    player.rank, reason == MatchFinishReason.USER_WIN,
                    rankRewards.conf if rankRewards else None, False,
                    player.mixId)

                if not rankRewards:
                    matchutil.report_bi_game_event(
                        'MATCH_REWARD', player.userId,
                        player.matchInst.matchId, 0,
                        int(player.matchInst.instId.split('.')[1]), 0, 0, 0, [
                            0, 0, 0, player.rank,
                            int(player.mixId) if player.mixId else 0, 0
                        ], 'match_reward')

            except:
                ftlog.error()

            # 比赛记录保存
            try:
                event = {
                    'gameId': self._room.gameId,
                    'userId': player.userId,
                    'matchId': self._room.match.matchId,
                    'rank': player.rank,
                    'isGroup': 0,
                    'mixId': player.mixId
                }
                MatchRecord.updateAndSaveRecord(event)
            except:
                ftlog.error()

        msg = MsgPack()
        msg.setCmd('m_over')
        msg.setResult('mixId', player.mixId)
        msg.setResult('gameId', self._room.gameId)
        msg.setResult('roomId', self._room.bigRoomId)
        msg.setResult('userId', player.userId)
        msg.setResult('reason', reason)
        msg.setResult('rank', player.rank)

        if rankRewards:
            msg.setResult('info', self.buildWinInfo(player, rankRewards))
        else:
            msg.setResult('info', self.buildLoserInfo(player))
        msg.setResult('mucount',
                      player.matchInst.matchConf.stages[0].totalUserCount)
        msg.setResult('date', str(datetime.now().date().today()))
        msg.setResult('time',
                      time.strftime('%H:%M', time.localtime(time.time())))
        msg.setResult('addInfo', '')
        rewardDesc = ''
        if rankRewards:
            msg.setResult('reward', matchutil.buildRewards(rankRewards))
            rewardDesc = matchutil.buildRewardsDesc(rankRewards)
            if rewardDesc:
                msg.setResult('rewardDesc', rewardDesc)

        roomName = player.matchInst.matchConf.getRoomName(player.mixId)
        arenaContent = dizhuhallinfo.getArenaMatchProvinceContent(
            player.userId,
            int(player.mixId) if player.mixId else self._room.bigRoomId, None)
        if arenaContent:
            roomName = arenaContent.get('showName') or roomName
        msg.setResult('mname', roomName)

        shareInfo = matchutil.buildShareInfo(
            self._room.gameId, sessiondata.getClientId(player.userId))
        msg.setResult('shareInfo',
                      {'erweima': shareInfo['erweima'] if shareInfo else {}})

        try:
            msg.setResult('beatDownUser', player.beatDownUserName)
            if rankRewards and rankRewards.todotask:
                msg.setResult('todotask', rankRewards.todotask)
            # 设置奖状分享的todotask diplomaShare
            shareTodoTask = dizhudiplomashare.buildDiplomaShare(
                player.userName, roomName, player.rank, rewardDesc,
                player.userId)
            if shareTodoTask:
                msg.setResult('shareTodoTask', shareTodoTask)

            if rankRewards:
                bigImg = rankRewards.conf.get('bigImg', '')
                if bigImg:
                    msg.setResult('bidImg', bigImg)

                if ftlog.is_debug():
                    ftlog.debug(
                        'MatchPlayerNotifierDizhu.notifyMatchOver userId=',
                        player.userId, 'roomId=', self._room.roomId, 'bigImg=',
                        bigImg, 'rank=', player.rank, 'rankRewards.conf=',
                        rankRewards.conf)
        except:
            ftlog.debug('NobeatDownUser arena match')
            ftlog.exception()

        # 冠军触发抽奖逻辑
        try:
            from dizhu.games.matchutil import MatchLottery
            match_lottery = MatchLottery()
            ret = match_lottery.checkMatchRank(player.userId,
                                               self._room.match.matchId,
                                               player.rank)
            if ret:
                msg.setResult('match_lottery', 1)
        except:
            ftlog.debug('MatchLottery arena match')
            ftlog.exception()
        ###########################

        # 玩家红包记录
        try:
            from dizhu.entity import dizhushare
            shareInfoConf = rankRewards.conf.get('shareInfo',
                                                 {}) if rankRewards else {}
            rewardType = shareInfoConf.get('type', '') if shareInfoConf else ''

            shareNum, shareTotalNum = dizhushare.arenaMatchRewardRecord(
                player.userId, shareInfoConf)

            # 常规配置
            championRewards = player.matchInst.matchConf.feeRewardList
            championShareInfo = championRewards[0].rankRewardsList[0].conf.get(
                'shareInfo', {})
            if arenaContent:
                # 分ip奖励配置
                championRewards = arenaContent.get('rank.rewards', [])
                if championRewards and championRewards[0].get(
                        'ranking', {}).get('start', 0) == 1:
                    championShareInfo = championRewards[0].get('shareInfo', {})

            rmb = 0
            matchShareType = 0
            if championShareInfo and championShareInfo.get(
                    'type', '') == MATCH_REWARD_REDENVELOPE:
                # 冠军奖励金额
                rmb = championShareInfo.get('rmb', 0)
                matchShareType = 1

            if shareInfoConf and str(rewardType) == MATCH_REWARD_REDENVELOPE:
                rmb = shareInfoConf.get('rmb', 0)

            shareInfoNew = {
                "matchShareType": matchShareType,
                "shareNum": shareNum if shareNum else 0,
                "shareTotalNum": shareTotalNum if shareTotalNum else 0,
                "get": 1 if str(rewardType) == MATCH_REWARD_REDENVELOPE else 0,
                "rmb": '{0:.2f}'.format(rmb)
            }
            msg.setResult('shareInfoNew', shareInfoNew)
        except Exception, e:
            ftlog.error('MatchPlayerNotifierDizhu.notifyMatchOver', 'gameId=',
                        self._room.gameId, 'userId=', player.userId, 'roomId=',
                        self._room.roomId, 'matchId=',
                        self._room.match.matchId, 'err=', e.message)
        ###########################

        record = MatchRecord.loadRecord(self._room.gameId, player.userId,
                                        self._room.match.matchId)
        if record:
            msg.setResult(
                'mrecord', {
                    'bestRank': record.bestRank,
                    'bestRankDate': record.bestRankDate,
                    'isGroup': record.isGroup,
                    'crownCount': record.crownCount,
                    'playCount': record.playCount
                })
        else:
            from dizhu.activities.toolbox import Tool
            msg.setResult(
                'mrecord', {
                    'bestRank': player.rank,
                    'bestRankDate': Tool.datetimeToTimestamp(datetime.now()),
                    'isGroup': 0,
                    'crownCount': 1 if player.rank == 1 else 0,
                    'playCount': 1
                })

        if not player.isQuit:
            router.sendToUser(msg, player.userId)

        # 混房冠军LED
        mixId = player.mixId
        if mixId:
            mixConf = MatchPlayerNotifierDizhu.getArenaMixConf(
                self._room.roomConf, mixId)
            if player.rank == 1 and mixConf.get('championLed'):
                clientId = sessiondata.getClientId(player.userId)
                arenaContent = dizhuhallinfo.getArenaMatchProvinceContent(
                    player.userId,
                    int(mixId) if mixId else self._room.roomId, clientId)
                if ftlog.is_debug():
                    ftlog.debug('MatchPlayerNotifierDizhu.notifyMatchOver',
                                'userId=', player.userId, 'roomId=',
                                self._room.roomId, 'mixId=', mixId, 'roomName',
                                mixConf.get('roomName'), 'rewardShow=',
                                mixConf.get('rewardShow',
                                            rewardDesc), 'mixConf=', mixConf)
                # 冠军发送Led通知所有其他玩家
                ledtext = dizhuled._mk_match_champion_rich_text(
                    player.userName,
                    arenaContent.get('name')
                    if arenaContent else mixConf.get('roomName'),
                    arenaContent.get('rewardShow')
                    if arenaContent else mixConf.get('rewardShow', rewardDesc))
                LedUtil.sendLed(ledtext, 'global')
        else:
            if player.rank == 1 and self._room.roomConf.get(
                    'championLed') and not player.isQuit:
                clientId = sessiondata.getClientId(player.userId)
                arenaContent = dizhuhallinfo.getArenaMatchProvinceContent(
                    player.userId,
                    int(mixId) if mixId else self._room.roomId, clientId)
                # 冠军发送Led通知所有其他玩家
                ledtext = dizhuled._mk_match_champion_rich_text(
                    player.userName,
                    arenaContent.get('name') if arenaContent else roomName,
                    arenaContent.get('rewardShow') if arenaContent else
                    self._room.roomConf.get('rewardShow', rewardDesc))
                LedUtil.sendLed(ledtext, 'global')

        sequence = int(player.matchInst.instId.split('.')[1])
        matchutil.report_bi_game_event(
            'MATCH_FINISH', player.userId, player.matchInst.matchId, 0,
            sequence, 0, 0, 0, [int(player.mixId) if player.mixId else 255],
            'match_end')
예제 #12
0
    def notifyMatchOver(self, player, reason, rankRewards):
        '''
        通知用户比赛结束了
        '''
        try:
            exchangeMoney = rankRewards.conf.get('exchangeMoney',
                                                 None) if rankRewards else None
            exchangeCode = None
            if exchangeMoney:
                exchangeCode = RedEnvelopeHelper.getRedEnvelopeCode(
                    player.userId, self._room.gameId, exchangeMoney,
                    self._room.roomId, self._room.match.matchId, player.rank)

            ftlog.info('MatchPlayerNotifierDizhu.notifyMatchOver matchId=',
                       player.matchInst.matchId, 'instId=',
                       player.matchInst.instId, 'userId=', player.userId,
                       'signinParams=', player.signinParams, 'stageIndex=',
                       player.stage.index, 'rank=', player.rank, 'reason=',
                       reason, 'rankRewards=', rankRewards, 'exchangeCode=',
                       exchangeCode)

            lastBestRank = None
            record = MatchRecord.loadRecord(self._room.gameId, player.userId,
                                            self._room.match.matchId)
            if record:
                lastBestRank = record.bestRank

            # 获取房间名
            roomName = player.matchInst.matchConf.getRoomName(player.mixId)
            arenaContent = dizhuhallinfo.getArenaMatchProvinceContent(
                player.userId,
                int(player.mixId) if player.mixId else self._room.bigRoomId,
                None)
            if arenaContent:
                roomName = arenaContent.get('showName') or roomName

            rewardId = None
            if (reason == MatchFinishReason.USER_WIN
                    or reason == MatchFinishReason.USER_LOSER):
                try:
                    if player.isQuit:
                        rankRewards = None
                    event_remote.publishMatchWinloseEvent(
                        self._room.gameId, player.userId,
                        self._room.match.matchId,
                        reason == MatchFinishReason.USER_WIN, player.rank,
                        player.matchInst.matchConf.stages[0].totalUserCount,
                        rankRewards.conf if rankRewards else None)

                    tempGameResult = 1 if reason == MatchFinishReason.USER_WIN else -1
                    hall51event.sendToHall51MatchOverEvent(
                        player.userId, self._room.gameId, self._room.bigRoomId,
                        tempGameResult, -1, -1)

                    if rankRewards:
                        from dizhu.entity.matchhistory import MatchHistoryHandler
                        MatchHistoryHandler.onMatchOver(
                            player.userId,
                            player.matchInst.matchConf.recordId,
                            player.rank,
                            reason == MatchFinishReason.USER_WIN,
                            rankRewards.conf if rankRewards else None,
                            False,
                            player.mixId,
                            exchangeCode=exchangeCode)

                        matchRewardSwitch = WxShareControlHelper.getMatchRewardSwitch(
                        )
                        if matchRewardSwitch:
                            from dizhu.game import TGDizhu
                            rewardId = RewardAsyncHelper.genRewardId()
                            rewards = []
                            for rewardInfo in rankRewards.rewards:
                                rewards.append({
                                    'itemId': rewardInfo['itemId'],
                                    'count': rewardInfo['count']
                                })
                            playerMixId = int(
                                player.mixId) if player.mixId else None
                            TGDizhu.getEventBus().publishEvent(
                                UserRewardAsyncEvent(
                                    DIZHU_GAMEID,
                                    player.userId,
                                    REWARD_ASYNC_TYPE_AS_ARENA_MATCH,
                                    rewardId,
                                    rewards,
                                    matchId=playerMixId
                                    or player.matchInst.matchId,
                                    mixId=playerMixId or 0,
                                    rank=player.rank,
                                    sequence=int(
                                        player.matchInst.instId.split('.')[1]),
                                    roomName=roomName))

                    if not rankRewards:
                        matchutil.report_bi_game_event(
                            'MATCH_REWARD', player.userId,
                            player.matchInst.matchId, 0,
                            int(player.matchInst.instId.split('.')[1]), 0, 0,
                            0, [
                                0, 0, 0, player.rank,
                                int(player.mixId) if player.mixId else 0, 0
                            ], 'match_reward')

                except:
                    ftlog.error()

                # 比赛记录保存
                try:
                    event = {
                        'gameId': self._room.gameId,
                        'userId': player.userId,
                        'matchId': self._room.match.matchId,
                        'rank': player.rank,
                        'isGroup': 0,
                        'mixId': player.mixId
                    }
                    MatchRecord.updateAndSaveRecord(event)
                except:
                    ftlog.error()

            msg = MsgPack()
            msg.setCmd('m_over')
            msg.setResult('rewardId', rewardId)
            msg.setResult('mixId', player.mixId)
            msg.setResult('gameId', self._room.gameId)
            msg.setResult('roomId', self._room.bigRoomId)
            msg.setResult('userId', player.userId)
            msg.setResult('reason', reason)
            msg.setResult('rank', player.rank)
            msg.setResult('exchangeCode', exchangeCode)

            if rankRewards:
                msg.setResult('info', self.buildWinInfo(player, rankRewards))
            else:
                msg.setResult('info', self.buildLoserInfo(player))
            msg.setResult('mucount',
                          player.matchInst.matchConf.stages[0].totalUserCount)
            msg.setResult('date', str(datetime.now().date().today()))
            msg.setResult('time',
                          time.strftime('%H:%M', time.localtime(time.time())))
            msg.setResult('addInfo', '')
            rewardDesc = ''
            if rankRewards:
                msg.setResult('reward', matchutil.buildRewards(rankRewards))
                rewardDesc = matchutil.buildRewardsDesc(rankRewards)
                if rewardDesc:
                    msg.setResult('rewardDesc', rewardDesc)

            msg.setResult('mname', roomName)

            clientId = sessiondata.getClientId(player.userId)

            # 微信分享
            money = 0
            if rankRewards:
                for r in rankRewards.rewards:
                    if r['itemId'] == 'user:coupon':
                        assetKind = hallitem.itemSystem.findAssetKind(
                            'user:coupon')
                        displayRate = assetKind.displayRate
                        money = round(r['count'] * 1.0 / displayRate, 2)
            kwargs = {'matchRank': {'money': money % 100, 'stop': player.rank}}

            shareInfo = commconf.getNewShareInfoByCondiction(
                self._room.gameId, clientId)
            msg.setResult(
                'shareInfo',
                {'erweima': shareInfo['erweima'] if shareInfo else {}})

            try:
                # 玩家红包记录
                dizhushare.addMatchHistoryCount(self._room.bigRoomId,
                                                player.rank)
                userShareInfo = rankRewards.conf.get(
                    'shareInfo', {}) if rankRewards else {}
                rewardType, shareInfoNew = dizhushare.getArenaShareInfoNew(
                    player.userId, player.matchInst.matchConf.feeRewardList,
                    arenaContent, userShareInfo)
                if shareInfoNew:
                    msg.setResult('shareInfoNew', shareInfoNew)

                # 设置奖状分享的todotask diplomaShare
                matchShareType = 'arena' if rewardType == 'redEnvelope' else 'group'
                shareTodoTask = commconf.getMatchShareInfo(
                    player.userName, roomName, player.rank, rewardDesc,
                    player.userId, matchShareType, clientId)
                if shareTodoTask:
                    msg.setResult('shareTodoTask', shareTodoTask)

                if rankRewards:
                    bigImg = rankRewards.conf.get('bigImg', '')
                    if bigImg:
                        msg.setResult('bidImg', bigImg)

                msg.setResult('beatDownUser', player.beatDownUserName)
                if rankRewards and rankRewards.todotask:
                    msg.setResult('todotask', rankRewards.todotask)

                # 微信公众号消息
                if player.rank == 1:
                    from hall.game import TGHall
                    msgParams = {'reward': rewardDesc, 'roomName': roomName}
                    TGHall.getEventBus().publishEvent(
                        OfficialMessageEvent(DIZHU_GAMEID,
                                             player.userId,
                                             RED_ENVELOPE,
                                             msgParams,
                                             mixId=player.mixId))
                    if ftlog.is_debug():
                        ftlog.debug(
                            'MatchPlayerNotifierDizhu.notifyMatchOver.redEnvelopeEvent userId=',
                            player.userId, 'reward=', rewardDesc, 'rank=',
                            player.rank, 'roomName=', roomName)

                # 冠军触发抽奖逻辑
                match_lottery = MatchLottery()
                ret = match_lottery.checkMatchRank(player.userId,
                                                   self._room.match.matchId,
                                                   player.rank)
                if ret:
                    msg.setResult('match_lottery', 1)

                # 局间奖励总数
                if player.stageRewardTotal:
                    msg.setResult('stageReward',
                                  {'count': player.stageRewardTotal})

                if ftlog.is_debug():
                    ftlog.debug(
                        'MatchPlayerNotifierDizhu.notifyMatchOver userId=',
                        player.userId, 'roomId=', self._room.roomId, 'rank=',
                        player.rank, 'player=', player, 'stageRewardTotal=',
                        player.stageRewardTotal)

            except Exception, e:
                ftlog.error('notifyMatchOver.getArenaShareInfoNew', 'userId=',
                            player.userId, 'matchId=',
                            self._room.match.matchId, 'err=', e.message)

            record = MatchRecord.loadRecord(self._room.gameId, player.userId,
                                            self._room.match.matchId)
            if record:
                msg.setResult(
                    'mrecord', {
                        'bestRank': record.bestRank,
                        'lastBestRank': lastBestRank,
                        'bestRankDate': record.bestRankDate,
                        'isGroup': record.isGroup,
                        'crownCount': record.crownCount,
                        'playCount': record.playCount
                    })
            else:
                from dizhu.activities.toolbox import Tool
                msg.setResult(
                    'mrecord', {
                        'bestRank': player.rank,
                        'lastBestRank': lastBestRank,
                        'bestRankDate': Tool.datetimeToTimestamp(
                            datetime.now()),
                        'isGroup': 0,
                        'crownCount': 1 if player.rank == 1 else 0,
                        'playCount': 1
                    })

            if not player.isQuit:
                router.sendToUser(msg, player.userId)

            # 混房冠军LED
            mixId = player.mixId
            if mixId:
                mixConf = MatchPlayerNotifierDizhu.getArenaMixConf(
                    self._room.roomConf, mixId)
                if player.rank == 1 and mixConf.get('championLed'):
                    arenaContent = dizhuhallinfo.getArenaMatchProvinceContent(
                        player.userId,
                        int(mixId) if mixId else self._room.roomId, clientId)
                    if ftlog.is_debug():
                        ftlog.debug('MatchPlayerNotifierDizhu.notifyMatchOver',
                                    'userId=', player.userId, 'roomId=',
                                    self._room.roomId,
                                    'mixId=', mixId, 'roomName',
                                    mixConf.get('roomName'), 'rewardShow=',
                                    mixConf.get('rewardShow', rewardDesc),
                                    'mixConf=', mixConf)
                    # 冠军发送Led通知所有其他玩家
                    ledtext = dizhuled._mk_match_champion_rich_text(
                        player.userName,
                        arenaContent.get('name')
                        if arenaContent else mixConf.get('roomName'),
                        arenaContent.get('rewardShow') if arenaContent else
                        mixConf.get('rewardShow', rewardDesc))
                    LedUtil.sendLed(ledtext, 'global')
            else:
                if player.rank == 1 and self._room.roomConf.get(
                        'championLed') and not player.isQuit:
                    arenaContent = dizhuhallinfo.getArenaMatchProvinceContent(
                        player.userId,
                        int(mixId) if mixId else self._room.roomId, clientId)
                    # 冠军发送Led通知所有其他玩家
                    ledtext = dizhuled._mk_match_champion_rich_text(
                        player.userName,
                        arenaContent.get('name') if arenaContent else roomName,
                        arenaContent.get('rewardShow') if arenaContent else
                        self._room.roomConf.get('rewardShow', rewardDesc))
                    LedUtil.sendLed(ledtext, 'global')

            sequence = int(player.matchInst.instId.split('.')[1])
            matchutil.report_bi_game_event(
                'MATCH_FINISH', player.userId, player.matchInst.matchId, 0,
                sequence, 0, 0, 0,
                [int(player.mixId) if player.mixId else 255], 'match_end')