Esempio n. 1
0
def sendReward(gameId, userId, sharePoint):
    from hall.entity import hallitem
    if not sharePoint.reward or not sharePoint.reward.content:
        return None

    userAssets = hallitem.itemSystem.loadUserAssets(userId)
    assetList = userAssets.sendContent(gameId, sharePoint.reward.content, 1, True,
                                       pktimestamp.getCurrentTimestamp(),
                                       'SHARE3_REWARD', sharePoint.pointId)
    ftlog.info('hall_share3.sendReward',
               'gameId=', gameId,
               'userId=', userId,
               'pointId=', sharePoint.pointId,
               'groupId=', sharePoint.groupId,
               'rewards=', [(atup[0].kindId, atup[1]) for atup in assetList])
    changedDataNames = TYAssetUtils.getChangeDataNames(assetList)
    datachangenotify.sendDataChangeNotify(gameId, userId, changedDataNames)
    for atup in assetList:
        if atup[0].kindId == 'user:coupon':
            # 广播事件
            from hall.game import TGHall
            TGHall.getEventBus().publishEvent(
                UserCouponReceiveEvent(HALL_GAMEID, userId, atup[1], user_coupon_details.USER_COUPON_SHARE3))

    return assetList
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
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
Esempio n. 7
0
    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
Esempio n. 8
0
 def _publish_reward_event(cls, uid, count):
     from hall.game import TGHall
     TGHall.getEventBus().publishEvent(
         UserCouponReceiveEvent(
             HALL_GAMEID, uid, count,
             user_coupon_details.USER_COUPON_SOURCE_SEGMENT_TASK))
Esempio n. 9
0
    def sendRankRewards(self, player, rankRewards):
        '''
        给用户发奖
        '''
        conf = configure.getGameJson(DIZHU_GAMEID, 'wx.share.control', {})
        matchRewardSwitch = conf.get('matchRewardSwitch')
        if matchRewardSwitch:
            return
        try:
            ftlog.info('MatchRankRewardsSenderDizhu.sendRankRewards matchId=',
                       player.matchInst.matchId, 'instId=',
                       player.matchInst.instId, 'userId=', player.userId,
                       'rank=', player.rank, 'signinParams=',
                       player.signinParams, 'rewards=', rankRewards.rewards)
            playerMixId = int(player.mixId) if player.mixId else None
            user_remote.addAssets(self._room.gameId, player.userId,
                                  rankRewards.rewards, 'MATCH_REWARD',
                                  playerMixId or player.matchInst.matchId)

            from dizhu.game import TGDizhu
            from dizhu.entity.common.events import ActiveEvent
            TGDizhu.getEventBus().publishEvent(
                ActiveEvent(DIZHU_GAMEID, player.userId, 'redEnvelope'))

            if rankRewards:
                # 发邮件
                rewardDesc = matchutil.buildRewardsDesc(rankRewards)
                roomName = player.matchInst.matchConf.getRoomName(player.mixId)
                mailstr = '红包赛奖励#恭喜您在%s' % roomName + '中, 获得%s。' % rewardDesc
                message.send(DIZHU_GAMEID, message.MESSAGE_TYPE_SYSTEM,
                             player.userId, mailstr)

            if rankRewards.message:
                pkmessage.sendPrivate(self._room.gameId, player.userId, 0,
                                      rankRewards.message)
                datachangenotify.sendDataChangeNotify(self._room.gameId,
                                                      player.userId, 'message')

            sequence = int(player.matchInst.instId.split('.')[1])
            rewardsLen = len(rankRewards.rewards)
            for reward in rankRewards.rewards:
                # 如果是红包券则广播红包券事件
                if reward['itemId'] == 'user:coupon':
                    from hall.game import TGHall
                    TGHall.getEventBus().publishEvent(
                        UserCouponReceiveEvent(
                            HALL_GAMEID, player.userId, reward['count'],
                            user_coupon_details.USER_COUPON_SOURCE_MATCH_ARENA)
                    )

                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', player.userId, player.matchInst.matchId, 0,
                    sequence, 0, 0, 0, [
                        chipType, reward['count'], kindId, player.rank,
                        int(player.mixId) if player.mixId else 0, rewardsLen
                    ], 'match_reward')
        except:
            ftlog.error()