def sendLoginReward(gameId, userId, clientId, iscreate, isdayfirst): if iscreate: newUserReward = configure.getGameJson(gameId, 'login.reward', {}).get('newUserReward') if newUserReward: if not newUserReward.get('open', 0): return rewards = newUserReward.get('rewards') if rewards: mail = newUserReward.get('mail') contentItems = TYContentItem.decodeList(rewards) dizhu_util.sendRewardItems(userId, contentItems, mail, 'LOGIN_REWARD', 0) FTTasklet.getCurrentFTTasklet().sleepNb(1.5) msg = MsgPack() msg.setCmd('dizhu') msg.setResult('action', 'new_user_reward') msg.setResult('rewards', rewards) msg.setResult('cardNoteCount', newUserReward.get('cardNoteCount', 0)) router.sendToUser(msg, userId) ftlog.info( 'dizhu_login_reward.sendLoginReward newUserReward userId=', userId, 'gameId=', gameId, 'clientId=', clientId, 'iscreate=', iscreate, 'isdayfirst=', isdayfirst, 'rewards=', rewards)
def handleRequest(self, userId, clientId, action, msg): if action == self.ACTION_SHARE_CHARM_RANK_LIST: return self.getRankRewardList(userId) elif action == self.ACTION_SHARE_CHARM_REWARD: # 更改用户领奖状态 issue = calculateLastIssue(self.settleDayOrWeek) realRank = getUserRealRank(userId, self.actId, issue) rankRewardItem = self.getUserRankRewardItem(userId, realRank) userData = UserShareCharmData(userId).loadUserData(self.actId) issueData = userData.getIssueData(issue) if not issueData: raise ActivityWxException(-6, '您没有参与%s活动哦~' % issue) if issueData.state == SHARE_CHARM_REWARD_STATE_GOT: raise ActivityWxException(-4, '您已领取奖励哦~') # 发奖 if rankRewardItem: userData.updateState(self.actId, issue) rewards = rankRewardItem.rewards rewardsItems = TYContentItem.decodeList(rewards) dizhu_util.sendRewardItems(userId, rewardsItems, '', 'ACT_WX_SHARE_CHARM', self.intActId) for reward in rewards: if reward['itemId'] == 'user:coupon': from hall.game import TGHall TGHall.getEventBus().publishEvent( UserCouponReceiveEvent( HALL_GAMEID, userId, reward['count'], user_coupon_details.USER_COUPON_SHARE_CHARM)) return rewards raise ActivityWxException(-5, '您没有奖励可领取哦~') return None
def doGetInviteRewardAll(cls, userId): status = loadStatus(userId) inviteeRewardList = status.inviteeRewardList rewardsList = [] bigReward = None save = False for index, rewardState in enumerate(inviteeRewardList): if rewardState.rewardState == REWARD_STATE_IDEAL: rewardState.rewardState = REWARD_STATE_RECEIVED save = True r = getSimpleInviteRewardByIndex(index) if r: rewardsList.append(r) if rewardsList: contentItems = TYContentItem.decodeList(rewardsList) assetList = dizhu_util.sendRewardItems(userId, contentItems, '', 'DIZHU_QIANDAO_REWARD', 0) if len(inviteeRewardList) >= len(getSimpleInviteRewardsConf()): bigReward = getSimpleInviteBigReward(userId) if bigReward: contentItems = TYContentItem.decodeList([bigReward]) assetList = dizhu_util.sendRewardItems(userId, contentItems, '', 'DIZHU_QIANDAO_REWARD', 0) if bigReward.get('itemId') == 'user:coupon': TGHall.getEventBus().publishEvent(UserCouponReceiveEvent(9999, userId, bigReward['count'], user_coupon_details.USER_COUPON_INVITE)) status.bigRewardState = REWARD_STATE_RECEIVED save = True conf = getSimpleInviteConf() if conf.get('switch'): gamedata.setGameAttr(userId, DIZHU_GAMEID, 'firstBigRewards', 1) if save: saveStatus(status) return rewardsList, bigReward
def processEnterGame(cls, evt): # # 检查当前已结束赛季并发放赛季奖励, 只发放上一期的 if ftlog.is_debug(): ftlog.debug('============= processEnterGame userId=', evt.userId) _, intClientId = sessiondata.getClientIdNum(evt.userId) if intClientId == 24105: latestTwoIssues = SegmentMatchHelper.getIssueStateList()[-2:] for issuestate in reversed(latestTwoIssues): if issuestate['state'] == 0: continue # 判断用户有没有结算此赛季 userData = SegmentMatchHelper.getUserSegmentDataIssue( evt.userId, issuestate['issue']) or UserSegmentDataIssue() if userData and userData.segmentRewardsState == UserSegmentDataIssue.IDEAL: # 结算 发奖 settlementRanking(evt.userId, issuestate['issue']) segmentConf = getSegmentConf() if segmentConf.closed: return if evt.dayFirst: # 检查用户是否已经发送 if not gamedata.getGameAttrInt(evt.userId, DIZHU_GAMEID, 'wxNotice'): # 保存消息记录 gamedata.setGameAttr(evt.userId, DIZHU_GAMEID, 'wxNotice', 1) # 新用户发送一条额外消息 mailstr = '游戏公告#如有任何意见建议,欢迎加客服微信:Tuyoo_taozi,进入官方群反馈' message.send(DIZHU_GAMEID, message.MESSAGE_TYPE_SYSTEM, evt.userId, mailstr) # 同步钻石为用户道具 if not segmentdata.getSegmentAttr(evt.userId, DIZHU_GAMEID, 'diamondConvert'): segmentdata.setSegmentAttr(evt.userId, DIZHU_GAMEID, 'diamondConvert', 1) userDiamond = userdata.getAttr(evt.userId, 'diamond') if userDiamond: # count user_remote.consumeAssets(DIZHU_GAMEID, evt.userId, [{ 'itemId': 'user:diamond', 'count': userDiamond }], 'DIZHU_SEGMENT_DIAMOND_CONVERT', 0) contentItems = TYContentItem.decodeList([{ 'itemId': 'item:1311', 'count': userDiamond }]) from dizhu.entity import dizhu_util dizhu_util.sendRewardItems(evt.userId, contentItems, None, 'DIZHU_SEGMENT_DIAMOND_CONVERT', 0) ftlog.info('DizhuSegmentRewardsHelper diamondConvert userId=', evt.userId, 'userDiamond=', userDiamond)
def _sendActiveReward(self, userId, rewardKind, scheduleId): # 发奖接口 if ftlog.is_debug(): ftlog.debug('ActivityWxUserActive._sendActiveReward userId= ', userId, 'rewardKind= ', rewardKind, 'scheduleId= ', scheduleId) actInstance = _getActInstance(userId) if actInstance: userData, expireDay, expireWeek = UserActiveData(userId).loadData() if rewardKind == ActiveRewardItem.DAY: reward = actInstance.getDayRewardByScheduleId(scheduleId) if not reward: raise ActivityWxException(-6, '您没有获得奖励哦~') if expireDay: raise ActivityWxException(-7, '您来晚了哦,明天记得早点领取哦~') if scheduleId in userData.activeDataDay.scheduleIdList: raise ActivityWxException(-8, '您已领取奖励哦~') if userData.activeDataDay.active < reward.active: raise ActivityWxException(-9, '您的日活跃度不够哦~') dizhu_util.sendRewardItems(userId, reward.rewards, None, 'ACTIVE_REWARD', 0) bireport.reportGameEvent('ACTIVE_REWARDS', userId, DIZHU_GAMEID, 0, 0, 0, 0, 0, 0, [scheduleId], sessiondata.getClientId(userId)) userData.addDayScheduleId(scheduleId) return { 'rewards': TYContentItem.encodeList(reward.rewards), 'success': 1 } else: reward = actInstance.getWeekRewardByScheduleId(scheduleId) if not reward: raise ActivityWxException(-6, '您没有获得奖励哦~') if expireWeek: raise ActivityWxException(-7, '您来晚了哦,下周记得早点领取哦~') if scheduleId in userData.activeDataWeek.scheduleIdList: raise ActivityWxException(-8, '您已领取奖励哦~') if userData.activeDataWeek.active < reward.active: raise ActivityWxException(-9, '您的周活跃度不够哦~') dizhu_util.sendRewardItems(userId, reward.rewards, None, 'ACTIVE_REWARD', 0) userData.addWeekScheduleId(scheduleId) bireport.reportGameEvent('ACTIVE_REWARDS', userId, DIZHU_GAMEID, 0, 0, 0, 0, 0, 0, [scheduleId], sessiondata.getClientId(userId)) return { 'rewards': TYContentItem.encodeList(reward.rewards), 'success': 1 } raise ActivityWxException(-10, '活动不存在')
def sendUserReward(cls, userId): userData = UserWxFollowData(userId).loadData() if pktimestamp.getCurrentTimestamp() - userData.timestamp < _wxFollowConf.cycleSeconds: return None rewardObj = _wxFollowConf.getRewardByCount(userData.count) if rewardObj: dizhu_util.sendRewardItems(userId, rewardObj.rewards, '', 'DIZHU_WX_FOLLOW', userData.count) userData.increaseFollowCount() for reward in rewardObj.rewardsConf: if reward['itemId'] == 'user:coupon': TGHall.getEventBus().publishEvent( UserCouponReceiveEvent(HALL_GAMEID, userId, reward['count'], user_coupon_details.USER_COUPON_WX_FOLLOW)) return rewardObj.toDict() return None
def sendWatchAdRewards(cls, userId, adId): data = getUserWatchAdData(userId) if data.watchCount < cls.getDailyCountLimit(): # 保存用户观看数据 data.watchCount += 1 saveUserWatchAdData(userId, data) # 发奖 reward = cls.getAdRewardByWeight(adId, data.watchCount) if reward: contentItems = TYContentItem.decodeList([reward]) from dizhu.entity import dizhu_util dizhu_util.sendRewardItems(userId, contentItems, None, 'DIZHU_WATCH_AD_REWARD', 0) return reward, cls.getDailyCountLimit() - data.watchCount return None, 0
def processUserTableRewards(cls, userId, winlose): ''' 处理牌局结束用户的奖励 ''' gameWinRewardConf = getSegmentConf().gameWinReward # 判断condition condList = gameWinRewardConf.get('conditions') if condList and winlose.isWin: for condD in condList: cond = UserConditionRegister.decodeFromDict(condD) clientId = sessiondata.getClientId(userId) retCheck = cond.check(DIZHU_GAMEID, userId, clientId, pktimestamp.getCurrentTimestamp(), winlose=winlose) if retCheck: reward = gameWinRewardConf.get('reward') if reward: try: contentItems = TYContentItem.decodeList([reward]) from dizhu.entity import dizhu_util dizhu_util.sendRewardItems( userId, contentItems, None, 'DIZHU_SEGMENT_TABLE_WIN', 0) ret = SegmentMatchHelper.addUserSegmentTableWinRewardCount( userId, reward['count']) if ret: retMsg = '' if cond.TYPE_ID == UserConditionSegmentWinDoubles.TYPE_ID: retMsg = '满贯' elif cond.TYPE_ID == UserConditionSegmentChuntian.TYPE_ID: retMsg = '春天' retReward = { 'itemId': reward['itemId'], 'count': reward['count'], 'des': retMsg } ftlog.info( 'DizhuSegmentRewardsHelper.processUserTableRewards', 'userId=', userId, 'typeId=', cond.TYPE_ID, 'reward=', retReward) return retReward else: return None except Exception, e: ftlog.error( 'DizhuSegmentRewardsHelper.processUserTableRewards', 'userId=', userId, 'gameWinRewardConf=', gameWinRewardConf, 'errmsg=', e.message)
def chooseReward(self, userId, matchId, rank): if ftlog.is_debug(): ftlog.debug('MatchLottery userId=', userId, 'matchId=', matchId, 'rank=', rank) if not self.matchList: d = dizhuconf.getMatchLotteryConf() self.decodeFromDict(d) if not self.checkMatchRank(userId, matchId): ftlog.warn('MatchLottery.checkMatchRank failed. userId=', userId, 'matchId=', matchId, 'rank=', rank) return None, None items = self.getMatchLotteryConf(matchId, rank) if not items: ftlog.warn('MatchLottery.checkMatchRank failed. no items. userId=', userId, 'matchId=', matchId, 'rank=', rank) return None, None weights = 0 for item in items: weights += item.get('weight', 0) r = random.randint(0, weights) lotteryReward = [] weightTotal = 0 for item in items: weightTotal += item.get('weight', 0) if r <= weightTotal: lotteryReward.append({ 'itemId': str(item.get('itemId')), 'count': item.get('count') }) break lotteryReward = items[-1] if not lotteryReward else lotteryReward if ftlog.is_debug(): ftlog.debug('MatchLottery weights=', weights, 'r=', r, 'userId=', userId, 'lotteryReward=', lotteryReward) if lotteryReward: contentItems = TYContentItem.decodeList(lotteryReward) assetList = dizhu_util.sendRewardItems(userId, contentItems, '', 'DIZHU_MATCH_LOTTERY', 0) ftlog.info('MatchLottery.chooseReward userId=', userId, 'matchId=', matchId, 'lotteryReward=', lotteryReward, 'assetList=', assetList) for i in items: assetKind = hallitem.itemSystem.findAssetKind(i['itemId']) i['img'] = assetKind.pic i['des'] = assetKind.desc i['name'] = assetKind.displayName if ftlog.is_debug(): ftlog.debug('MatchLottery.chooseReward userId=', userId, 'matchId=', matchId, 'rank=', rank, 'lotteryReward=', lotteryReward) return lotteryReward, items
def _changeUserBehaviourInfo(userId, ret, behaviourConf): try: reward = behaviourConf.get('reward') if behaviourConf else None if not reward: return ret['type'] = BEHAVIOUR_TYPE_REWARDED daobase.executeUserCmd(userId, 'HSET', 'userBehaviour:6:' + str(userId), 'info', strutil.dumps(ret)) mailStr = behaviourConf.get('mail', '幸运女神的眷顾使你获得了奖励') contentItems = TYContentItem.decodeList(reward) assetList = dizhu_util.sendRewardItems(userId, contentItems, mailStr, 'USER_BEHAVIOUR_REWARD', userId) datachangenotify.sendDataChangeNotify(DIZHU_GAMEID, userId, mailStr) # 发奖弹窗 rewardsList = [] for assetItemTuple in assetList: assetItem = assetItemTuple[0] reward = {} reward['name'] = assetItem.displayName reward['pic'] = assetItem.pic reward['count'] = assetItemTuple[1] rewardsList.append(reward) reward_task = TodoTaskShowRewards(rewardsList) TodoTaskHelper.sendTodoTask(DIZHU_GAMEID, userId, reward_task) ftlog.info('userBehaviour.sendReward userId=', userId, 'reward=', [(atp[0].kindId, atp[1]) for atp in assetList]) except Exception, e: ftlog.warn('_changeUserBehaviourInfo userId=', userId, 'ret=', ret, 'err=', e)
def gainDibaoReward(userId, rankId, issueNum): # 发放低保奖励 rankingDefine = _scoreRankConf.findRankingDefine(rankId) if not rankingDefine: raise TYBizException(-1, '排行榜不存在') userData = loadUserData(userId, rankId, issueNum) if not userData or not rankingDefine.dibaoConf: raise TYBizException(-1, '没有奖励可以领取') if userData.dibaoRewardState == RewardState.ST_NO_REWARD: raise TYBizException(-1, '没有奖励可以领取') if userData.dibaoRewardState == RewardState.ST_GAIN_REWARD: raise TYBizException(-1, '已经领取了奖励') if (userData.score >= rankingDefine.dibaoConf.score and userData.playCount >= rankingDefine.dibaoConf.playCount and rankingDefine.dibaoConf.rewardItems): userData.dibaoRewardState = RewardState.ST_GAIN_REWARD saveUserData(userData) ftlog.info('gainDibaoReward dibaoReward Sended. userId=', userData.userId, 'rankId=', rankId, 'issueNum=', issueNum, 'rewardItems=', rankingDefine.dibaoConf.rewardItems) return dizhu_util.sendRewardItems(userId, rankingDefine.dibaoConf.rewardItems, rankingDefine.dibaoConf.rewardMail, 'DIZHU_SCORE_RANKLIST_DIBAO', int(rankId)) raise TYBizException(-1, '没有奖励可以领取')
def gainUserRanklistReward(userId, rankId, issueNum, clientId=None): # 发放周榜奖励 userData = loadUserData(userId, rankId, issueNum) if not userData: raise TYBizException(-1, '没有找到用户数据') if userData.rewardState == RewardState.ST_NO_REWARD: raise TYBizException(-1, '本期没有奖励可领取') if userData.rewardState == RewardState.ST_GAIN_REWARD: raise TYBizException(-1, '已经领取了奖励') clientId = clientId or sessiondata.getClientId(userId) rankRewards = findRankRewardsByRank(rankId, issueNum, clientId, userData.rank) if not rankRewards: if ftlog.is_debug(): ftlog.debug('gainUserRanklistReward rankReward is None. userId=', userId, 'rankId=', rankId, 'issueNum=', issueNum, 'clientId=', clientId) # TODO warn or error raise TYBizException(-1, '未取到对应奖励配置') userData.rewardState = RewardState.ST_GAIN_REWARD saveUserData(userData) contentItems = TYContentItem.decodeList(rankRewards.get('items')) assetList = dizhu_util.sendRewardItems(userId, contentItems, _scoreRankConf.rewardMail, 'DIZHU_SCORE_RANKLIST', int(rankId)) ftlog.info('gainUserRanklistReward', 'userId=', userId, 'rankId=', rankId, 'issueNum=', issueNum, 'rank=', userData.rank, 'rewards=', [(atp[0].kindId, atp[1]) for atp in assetList]) return assetList
def openTreasureChest(cls, userId, rewardId): ''' 开宝箱 ''' userTreasureChest = UserTreasureChest(userId).loadTreasureChest() if userTreasureChest.checkOpenState(rewardId): ret = userTreasureChest.getTreasureChestByRewardId(rewardId) rewards = ret.rewards rewardType = ret.type # 给用户发奖 if rewardType == TREASURE_CHEST_TYPE_AS_WINSTREAK: winSreak = ret.params.get('winStreak') winSreakConf = TreasureChestHelper.getWinStreakConf(winSreak) if winSreakConf: rewards = [ dizhu_util.getItemByWeight(winSreakConf['rewards']) ] contentItems = TYContentItem.decodeList(rewards) dizhu_util.sendRewardItems( userId, contentItems, None, 'DIZHU_SEGMENT_MATCH_WINSTREAK', winSreak) ftlog.info( 'TreasureChestHelper.openTreasureChest sendReward userId=', userId, 'rewardId=', rewardId, 'rewards=', rewards) # 如果是奖券则广播奖券事件 for reward in rewards: if reward['itemId'] == 'user:coupon': if rewardType == TREASURE_CHEST_TYPE_AS_WINSTREAK: from hall.game import TGHall TGHall.getEventBus().publishEvent( UserCouponReceiveEvent( HALL_GAMEID, userId, reward['count'], user_coupon_details. USER_COUPON_SOURCE_SEGMENT_WINSTREAK_TASK )) # 打开后删除宝箱 ret = userTreasureChest.delTreasureChestByRewardId(rewardId) if ret: userTreasureChest.saveTreasureChest() ftlog.info( 'TreasureChestHelper.openTreasureChest deleteTreasureChest userId=', userId, 'rewardId=', rewardId, 'rewards=', rewards) return True, rewards return False, None
def doShareCharmReward(self, userId, isTest): errCode = 0 errMsg = None rewards = [] try: act = ActivityWxHelper.findActivity('shareCharm') if act: # 更改用户领奖状态 issue = calculateLastIssue(isTest) realRank = getUserRealRank(userId, act.actId, issue) rankRewardItem = act.getUserRankRewardItem(userId, realRank) userData = UserShareCharmData(userId).loadUserData(act.actId) issueData = userData.getIssueData(issue) if not issueData: raise ActivityWxException(-6, '您没有参与%s活动哦~' % issue) if issueData.state == SHARE_CHARM_REWARD_STATE_GOT: raise ActivityWxException(-4, '您已领取奖励哦~') # 发奖 if rankRewardItem: userData.updateState(act.actId, issue) rewards = rankRewardItem.rewards dizhu_util.sendRewardItems(userId, rewards, '', 'ACT_WX_SHARE_CHARM', act.intActId) else: raise ActivityWxException(-5, '您没有奖励可领取哦~') except ActivityWxException as e: errCode, errMsg = e.errCode, e.errMsg mo = MsgPack() mo.setCmd('act_wx') mo.setResult('action', 'share_charm_rankList') mo.setResult('userId', userId) mo.setResult('actId', 'shareCharm') mo.setResult('gameId', 6) mo.setResult('errcode', errCode) mo.setResult('errmsg', errMsg) mo.setResult('result', [{ 'itemId': r.assetKindId, 'count': r.count } for r in rewards]) return mo
def _sendRewards(userId, day, typeId): signInData, hasReceive, expire = SignInDeskData(userId).loadData() if not expire and len(signInData.signInList) != day - 1: ftlog.warn('dizhu_signin._sendRewards error day userId=', userId, 'day=', day, 'typeId=', typeId) return 0, [] if hasReceive: ftlog.warn('dizhu_signin._sendRewards has received userId=', userId, 'day=', day, 'typeId=', typeId) return 0, [] conf = configure.getGameJson(DIZHU_GAMEID, 'signin', {}) rewardList = conf.get('rewardList', {}) rewards = [] if expire: rewards = rewardList[0]['rewards'] else: for reward in rewardList: if reward.get('day') == day: rewards = reward.get('rewards') if rewards: newRewards = rewards if typeId: newRewards = [] for reward in rewards: newReward = {} newReward['count'] = 2 * reward['count'] newReward['itemId'] = reward['itemId'] newReward['pic'] = reward['pic'] newRewards.append(newReward) contentItems = TYContentItem.decodeList(newRewards) dizhu_util.sendRewardItems(userId, contentItems, None, 'SIGN_IN_DESK_REWARD', 0) signInData.updateSignInList() if ftlog.is_debug(): ftlog.debug('dizhu_signin._sendRewards has rewards', 'userId=', userId, 'typeId=', typeId, 'expire=', expire, 'newRewards=', newRewards, 'conf=', conf) return 1, newRewards ftlog.error('dizhu_signin._sendRewards conf error userId=', userId, 'day=', day, 'typeId=', typeId, 'conf=', conf) return 0, []
def _onGameRoundFinish(self, event): bigRoomId = event.mixConfRoomId or gdata.getBigRoomId(event.roomId) dropRate = 0 itemId = '' for roomConf in self._roomList: if bigRoomId in roomConf.get('roomId', []): dropRate = roomConf.get('dropRate', 0) itemId = roomConf.get('itemId') break if random.randint(0, 100) <= (dropRate * 100) and itemId: contentItems = TYContentItem.decodeList([{ 'itemId': itemId, 'count': 1 }]) assetList = dizhu_util.sendRewardItems(event.userId, contentItems, self._mail, 'DIZHU_ACT_CHRISTMAS_ITEM', 0) # 发奖弹窗 from hall.entity.todotask import TodoTaskShowRewards, TodoTaskHelper rewardsList = [] for assetItemTuple in assetList: assetItem = assetItemTuple[0] reward = dict() reward['name'] = assetItem.displayName reward['pic'] = assetItem.pic reward['count'] = assetItemTuple[1] rewardsList.append(reward) reward_task = TodoTaskShowRewards(rewardsList) TodoTaskHelper.sendTodoTask(DIZHU_GAMEID, event.userId, reward_task) ftlog.info('gainChristmasFinalReward.todotask userId=', event.userId, 'items=', [(atp[0].kindId, atp[1]) for atp in assetList]) if ftlog.is_debug(): ftlog.debug('act.christmas._onGameRoundFinish.todotask userId=', event.userId, 'bigRoomId=', bigRoomId, 'winLose=', event.winlose.isWin, 'dropRate=', dropRate, 'itemId=', itemId)
def gainUserReward(self, userId, rankId): # 玩家领取奖励 rewardList = [] rankingInfo = loadActivityScoreRankingInfo(rankId) if rankingInfo.itemCount > 0: for info in rankingInfo.items: hisIssue = info.issueNum userData = loadOrCreateUserData(userId, rankId, hisIssue) reward = None if userData.rewardStu == RewardState.ST_HAS_REWARD: userData.rewardStu = RewardState.ST_GAIN_REWARD reward = self.getRewardByRank(userData.rank, hisIssue) elif userData.dibaoStu == RewardState.ST_HAS_REWARD: userData.dibaoStu = RewardState.ST_GAIN_REWARD reward = self._dibaoReward if not reward: ftlog.warn('activity_score_ranking gainUserReward', 'rankId=', rankId, 'userId=', userId, 'issueNum=', hisIssue, 'rank=', userData.rank, 'userData=', userData.toDict(), 'reward is Null') continue saveUserData(userData) contentItems = TYContentItem.decodeList(reward.get('items')) assetList = dizhu_util.sendRewardItems( userId, contentItems, self._mail, 'DIZHU_ACTIVITY_SCORE_RANKLIST_REWARD', self.intActId) ftlog.info('activity_score_ranking gainUserReward', 'userId=', userId, 'rankId=', rankId, 'rewards=', [(atp[0].kindId, atp[1]) for atp in assetList]) rewardList.append(reward) return rewardList
def buildGetRewardResponse(cls, userId, rewardId): ''' 返回客户端消息 mo ''' ret = cls.getRewardByRewardId(userId, rewardId) if ret: rewards = ret['rewards'] rewardType = ret['type'] # 给用户发奖 contentItems = TYContentItem.decodeList(rewards) if rewardType == REWARD_ASYNC_TYPE_AS_ARENA_MATCH: matchId = ret.get('params', {}).get('matchId', 0) mixId = ret.get('params', {}).get('mixId', 0) rank = ret.get('params', {}).get('rank', 0) sequence = ret.get('params', {}).get('sequence', 0) roomName = ret.get('params', {}).get('roomName', '红包赛') mail = '红包赛奖励#恭喜您在%s' % roomName + '中, 获得${rewardContent}。' dizhu_util.sendRewardItems( userId, contentItems, mail, 'MATCH_REWARD', ret.get('params', {}).get('matchId', 0)) for reward in rewards: chipType = matchutil.getBiChipType(reward['itemId']) kindId = 0 if chipType == daoconst.CHIP_TYPE_ITEM: kindId = reward['itemId'].strip('item:') matchutil.report_bi_game_event( 'MATCH_REWARD', userId, matchId, 0, sequence, 0, 0, 0, [ chipType, reward['count'], kindId, rank, mixId, len(rewards) ], 'match_reward') elif rewardType == REWARD_ASYNC_TYPE_AS_WINSTREAK: winStreak = ret.get('params', {}).get('winStreak', 0) dizhu_util.sendRewardItems(userId, contentItems, None, 'DIZHU_SEGMENT_MATCH_WINSTREAK', winStreak) # 如果是奖券则广播奖券事件 for reward in rewards: if reward['itemId'] == 'user:coupon': if rewardType == REWARD_ASYNC_TYPE_AS_ARENA_MATCH: from hall.game import TGHall TGHall.getEventBus().publishEvent( UserCouponReceiveEvent( HALL_GAMEID, userId, reward['count'], user_coupon_details. USER_COUPON_SOURCE_MATCH_ARENA)) elif rewardType == REWARD_ASYNC_TYPE_AS_WINSTREAK: from hall.game import TGHall TGHall.getEventBus().publishEvent( UserCouponReceiveEvent( HALL_GAMEID, userId, reward['count'], user_coupon_details. USER_COUPON_SOURCE_SEGMENT_WINSTREAK_TASK)) mo = MsgPack() mo.setCmd('dizhu') mo.setResult('action', 'get_reward_async') mo.setResult('gameId', DIZHU_GAMEID) mo.setResult('userId', userId) mo.setResult('rewardInfo', ret) return mo
def exchange(self, userId): if not self.checkActivityActive(): if ftlog.is_debug(): ftlog.debug('christmas.exchange.checkActive.failed. userId=', userId) return u"不在活动时间内" assetList = None collectList = self.getUserCollectList(userId) timestamp = pktimestamp.getCurrentTimestamp() userAssets = hallitem.itemSystem.loadUserAssets(userId) collectCountList = [] for items in collectList: if items[1] and items[2]: collectCountList.append(int(items[1] / items[2])) else: collectCountList.append(0) collectCount = min(collectCountList) if collectCount: for item in collectList: itemId = item[0] consumeSockCount = item[2] * collectCount _, consumeCount, final = userAssets.consumeAsset(DIZHU_GAMEID, itemId, consumeSockCount, timestamp, 'DIZHU_ACT_CHRISTMAS_EXCHANGE', 0) if ftlog.is_debug(): ftlog.debug('christmas.exchange.warning userId=', userId, 'consumeCount=', consumeCount, 'collectCount=', collectCount, 'finalCount=', final, 'collectList=', collectList) collectTimes = daobase.executeUserCmd(userId, 'HINCRBY', 'act:christmas:6:' + str(userId), 'reward', collectCount) # 根据VIP等级发奖励 userRewards = self.getUserRewardByVip(userId) if not userRewards: ftlog.warn('christmas.exchange.warning.rewardError', 'userId=', userId, 'reward=', userRewards) return u"" if ftlog.is_debug(): ftlog.debug('christmas.exchange', 'userId=', userId, 'userRewards=', userRewards, 'userRewardsId=', id(userRewards)) contentItems = [] for rewardItem in userRewards: contentItems.append(TYContentItem(rewardItem['itemId'], int(rewardItem['count'] * collectCount))) assetList = dizhu_util.sendRewardItems(userId, contentItems, self._mail, 'DIZHU_ACT_CHRISTMAS_REWARD', 0) ftlog.info('gainChristmasFinalReward userId=', userId, 'collectTimes=', collectTimes, 'rewards=', [(atp[0].kindId, atp[1]) for atp in assetList]) if ftlog.is_debug(): ftlog.debug('christmas.exchange.info userId=', userId, 'collectCount=', collectCount, 'collectList=', collectList, 'assetList=', [(atp[0].kindId, atp[1]) for atp in assetList] if assetList else None) return u""
def doWinLose(cls, room, table, seatId, isTimeOutKill=False): # TODO: if not table._match_table_info: ftlog.warn('GroupMatch.doWinLoseTable roomId=', room.roomId, 'tableId=', table.tableId, 'seatId=', seatId, 'isTimeOutKill=', isTimeOutKill, 'err=', 'not matchTableInfo') return if ftlog.is_debug(): ftlog.debug('GroupMatch.doWinLose roomId=', room.roomId, 'tableId=', table.tableId, 'seatId=', seatId, 'isTimeOutKill=', isTimeOutKill, 'stageReward=', table.group.stageConf.conf.get('stageReward')) # 计算春天 dizhuseatId = table.status.diZhu if seatId != dizhuseatId: if table.seats[dizhuseatId - 1].outCardCount == 1: table.status.chuntian = 2 else: s1 = table.seats[(dizhuseatId - 1 + 1) % table.maxSeatN] s2 = table.seats[(dizhuseatId - 1 + 2) % table.maxSeatN] if s1.outCardCount == 0 and s2.outCardCount == 0: table.status.chuntian = 2 # 翻倍计算 叫地主的倍数 windoubles = table.status.callGrade # 炸弹倍数 windoubles *= pow(2, table.status.bomb) # 春天倍数 windoubles *= table.status.chuntian # 底牌倍数 windoubles *= table.status.baseCardMulti # 明牌倍数 windoubles *= table.status.show dizhuwin = 0 if seatId == dizhuseatId: dizhuwin = 1 if seatId == 0 : # 流局 dizhuwin = 0 windoubles = 1 else: windoubles = abs(windoubles) userids = [] detalChips = [] seat_coin = [] baseBetChip = table._match_table_info['mInfos']['basescore'] robot_card_count = [0] * len(table.seats) # 每个座位 for x in xrange(len(table.seats)): uid = table.seats[x].userId userids.append(uid) if seatId == 0 : # 流局 detalChip = -baseBetChip else: if dizhuwin : if x + 1 == dizhuseatId : detalChip = baseBetChip + baseBetChip else: detalChip = -baseBetChip else: if x + 1 == dizhuseatId : detalChip = -baseBetChip - baseBetChip else: detalChip = baseBetChip detalChip *= windoubles detalChips.append(detalChip) seat_coin.append(table._match_table_info['mInfos']['scores'][x] + detalChip) robot_card_count[x] = table.seats[x].robotCardCount ftlog.info('dizhu.game_win userId=', uid, 'roomId=', room.roomId, 'tableId=', table.tableId, 'delta=', detalChip) punish.Punish.doWinLosePunish(table.runConfig.punishCardCount, table.runConfig.isMatch, seat_coin, detalChips, robot_card_count) for x in xrange(len(table.seats)): uid = table.seats[x].userId table._match_table_info['mInfos']['scores'][x] = seat_coin[x] # 返回当前Table的game_win moWin = MsgPack() moWin.setCmd('table_call') moWin.setResult('action', 'game_win') moWin.setResult('isMatch', 1) moWin.setResult('gameId', table.gameId) moWin.setResult('roomId', table.roomId) moWin.setResult('tableId', table.tableId) # moWin.setResult('stat', dict(zip(tdz_stat_title, table.status))) moWin.setResult('stat', table.status.toInfoDictExt()) moWin.setResult('dizhuwin', dizhuwin) if seatId == 0: moWin.setResult('nowin', 1) moWin.setResult('slam', 0) moWin.setResult('cards', [seat.cards for seat in table.seats]) roundId = table.gameRound.number table.clear(userids) for x in xrange(len(userids)): uid = userids[x] mrank = 3 mtableRanking = 3 moWin.setResult('seat' + str(x + 1), [detalChips[x], seat_coin[x], 0, 0, 0, 0, mrank, mtableRanking]) if detalChips[x] > 0: stageRewards = table.group.stageConf.conf.get('stageReward', None) if table.group.stageConf else None if stageRewards: contentItems = TYContentItem.decodeList(stageRewards) assetList = dizhu_util.sendRewardItems(uid, contentItems, '', 'DIZHU_STAGE_REWARD', 0) moWin.setResult('stageReward', stageRewards) ftlog.info('stageRewards send. userId=', uid, 'stageRewards=', stageRewards, 'assetList=', assetList) #增加经验 exp = userdata.incrExp(uid, 20) explevel = dizhuaccount.getExpLevel(exp) gamedata.setGameAttr(uid, table.gameId, 'level', explevel) if ftlog.is_debug(): ftlog.debug('BigMatch.doWinLoseTable', 'addExp=', 20, 'curExp=', exp, 'curLevel=', explevel) table.gamePlay.sender.sendToAllTableUser(moWin) # 发送给match manager users = [] for x in xrange(len(userids)): user = {} user['userId'] = userids[x] user['deltaScore'] = int(detalChips[x]) user['seatId'] = x + 1 users.append(user) mnr_msg = MsgPack() mnr_msg.setCmd('room') mnr_msg.setParam('action', 'm_winlose') mnr_msg.setParam('gameId', table.gameId) mnr_msg.setParam('matchId', table.room.bigmatchId) mnr_msg.setParam('roomId', table.room.ctrlRoomId) mnr_msg.setParam('tableId', table.tableId) mnr_msg.setParam('users', users) mnr_msg.setParam('ccrc', table._match_table_info['ccrc']) if cls.WINLOSE_SLEEP > 0: FTTasklet.getCurrentFTTasklet().sleepNb(cls.WINLOSE_SLEEP) # 记录游戏winlose try: for u in users: table.room.reportBiGameEvent('TABLE_WIN', u['userId'], table.roomId, table.tableId, roundId, u['deltaScore'], 0, 0, [], 'table_win') except: if ftlog.is_debug(): ftlog.exception() router.sendRoomServer(mnr_msg, table.room.ctrlRoomId)
def doTreasureBox(userId, bigRoomId): ftlog.debug('doTreasureBox userId=', userId, 'bigRoomId=', bigRoomId) # 判定房间配置 tbconfiger = dizhuconf.getTreasureBoxInfo(bigRoomId) if not tbconfiger or not tbconfiger.get('reward', None): ftlog.debug('doTreasureBox->userIds=', userId, 'bigRoomId=', bigRoomId, 'not tbox room !') return {'ok': 0, 'info': '本房间不支持宝箱,请进入高倍房再使用'} # 判定是否可以领取 tbplaytimes, tblasttime, datas = getUserTbInfo(userId, bigRoomId) tbplaycount = tbconfiger['playCount'] if tblasttime <= 0 or tbplaytimes < tbplaycount: ftlog.debug('doTreasureBox->userIds=', userId, 'bigRoomId=', bigRoomId, 'can not tbox !') return { 'ok': 0, 'tbt': min(tbplaytimes, tbplaycount), 'tbc': tbplaycount, 'info': tbconfiger['desc'] } # 更新宝箱状态 datas['tblasttime'] = int(time.time()) datas['tbplaytimes'] = 0 _setTbData(userId, datas) rewards = tbconfiger['reward'] content = TYContentRegister.decodeFromDict(rewards) sitems = content.getItems() # 活动加成 ditems = _getDoubleInfos(bigRoomId) if ditems: for si in sitems: kindId = si.assetKindId mutil = ditems.get(kindId, 0) if mutil and mutil > 0: si.count = int(si.count * mutil) # 发送道具 # ua = hallitem.itemSystem.loadUserAssets(userId) # aslist = ua.sendContentItemList(DIZHU_GAMEID, sitems, 1, True, # timestamp.getCurrentTimestamp(), 'TASK_OPEN_TBOX_REWARD', bigRoomId) aslist = dizhu_util.sendRewardItems(userId, sitems, '', 'TASK_OPEN_TBOX_REWARD', bigRoomId) addmsg = TYAssetUtils.buildContentsString(aslist) items = [] for x in aslist: kindId = hallconf.translateAssetKindIdToOld(x[0].kindId) items.append({'item': kindId, 'count': x[1], 'total': x[2]}) if kindId in ['user:coupon', 'COUPON']: # 广播事件 from hall.game import TGHall TGHall.getEventBus().publishEvent( UserCouponReceiveEvent( HALL_GAMEID, userId, x[1], user_coupon_details.USER_COUPON_TABLE_TBBOX)) from dizhu.game import TGDizhu TGDizhu.getEventBus().publishEvent( UserTBoxLotteryEvent(DIZHU_GAMEID, userId)) datas = { 'ok': 1, 'tbt': 0, 'tbc': tbplaycount, 'info': '开启宝箱,获得' + addmsg, 'items': items } ftlog.debug('doTreasureBox->userIds=', userId, 'bigRoomId=', bigRoomId, datas) return datas
def _sendStageReward(self, result): # 各个阶段发阶段奖励 rewardList = [] stageRewards = self.room.roomConf['matchConf'].get('stageRewards', {}) for sst in result.seatStatements: userId = sst.seat.userId stageindex = self.table.matchTableInfo.get('step', {}).get( 'stageIndex', 0) + 1 stageReward = stageRewards.get(str(self.table.room.bigmatchId), {}).get(str(stageindex), []) currStageReward = [] try: sstIsDizhu = 'dizhu' if sst.isDizhu else 'nongmin' for rewardIndex in range(len(stageReward)): currStageReward.append({ "count": stageReward[rewardIndex].get('count', {}).get(sstIsDizhu, 0), "itemId": stageReward[rewardIndex]['itemId'] }) except Exception, e: ftlog.warn('group.stageRewards.info userId=', userId, 'err=', e) deltaScore = sst.delta if not sst.seat.isGiveup else -9999999 clientVer = SessionDizhuVersion.getVersionNumber(userId) if ftlog.is_debug(): ftlog.debug('group.stageRewards.info userId=', userId, 'index=', stageindex, 'score=', deltaScore, 'ver=', clientVer, 'reward=', currStageReward, 'stageRewardTotal=', sst.seat.player.stageRewardTotal) if not currStageReward or deltaScore < 0 or clientVer < 3.90: rewardList.append(None) continue contentItems = TYContentItem.decodeList(currStageReward) assetList = dizhu_util.sendRewardItems(userId, contentItems, '', 'DIZHU_STAGE_REWARD', 0) clientAssetList = [] for atp in assetList: clientAsset = { "name": atp[0].displayName, "itemId": atp[0].kindId, "count": atp[1] } clientAssetList.append(clientAsset) sst.seat.player.stageRewardTotal += atp[1] rewardList.append(clientAssetList) ftlog.info('group.stageRewards.info userId=', userId, 'deltaScore=', deltaScore, 'stageRewardTotal=', sst.seat.player.stageRewardTotal, 'index=', stageindex, 'assetList=', [(atp[0].kindId, atp[1]) for atp in assetList], 'seatId=', sst.seat.seatId)