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))
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()
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
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)
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
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))
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))
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))
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)
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')
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')