示例#1
0
    def on_use_props(self, uid, gid, mi):
        _id = mi.get_param('id')
        _count = mi.get_param('count')
        mo = MsgPack(Message.MSG_SYS_USE_PROPS | Message.ID_ACK)
        if _id not in [
                FishProps.PROP_EGG_BRONZE, FishProps.PROP_EGG_SILVER,
                FishProps.PROP_EGG_GOLD, FishProps.PROP_EGG_COLOR
        ]:
            return mo.set_error(1, 'can not use')

        if not isinstance(_count, int) or _count <= 0:
            return mo.set_error(2, 'count error')

        conf = FishProps.get_config_by_id(gid, _id)
        if not conf:
            Context.Log.error('not found props:', uid, gid, _id, _count)
            return mo.set_error(4, 'not found props')

        real, final = FishProps.incr_props(uid, gid, _id, -_count,
                                           'entity.use')
        if real != -_count:
            return mo.set_error(3, 'not enough')

        if _count == 1:
            reward = conf['content']
        else:
            reward = FishProps.merge_reward(*[conf['content']] * _count)
        reward = Context.copy_json_obj(reward)
        reward = self.deal_reward(reward)
        reward = FishProps.issue_rewards(uid, gid, reward, 'entity.use')
        reward = FishProps.convert_reward(reward)
        mo.update_param(reward)
        return mo
示例#2
0
 def on_consume_cdkey(self, uid, gid, mi):
     code = mi.get_param('code')
     imei = mi.get_param('imei')
     timestamp = (int(time.time()))
     # data = {'appId': 1002, 'code': code, 'userChannel': 0, 'imei': imei, 'userId': uid,'timestamp': timestamp ,'token':'asdsd'}
     data = 'code=' + str(code) + '&' + 'userId=' + str(
         uid) + '&' + 'timestamp=' + str(timestamp) + '&token=asdsd'
     cdkey_server_url = Context.Configure.get_game_item(
         gid, 'cdkey.server.url')
     Context.Log.info("cdkey_server_url:", cdkey_server_url)
     result = Context.WebPage.wait_for_json(cdkey_server_url, postdata=data)
     mo = MsgPack(Message.MSG_SYS_CONSUME_CDKEY | Message.ID_ACK)
     if result['result'] != 1:  # 错误
         mo.set_error(result['result'])
     else:
         try:
             Context.Log.info("desc:", result['desc'])
             reward = self.__convert_cdkey_desc(result['desc'])
             rewards = FishProps.issue_rewards(uid, gid, reward,
                                               'cdkey.reward')
             _rewards = FishProps.convert_reward(rewards)
             mo.update_param(_rewards)
         except Exception, e:
             Context.Log.exception(uid, gid, result)
             return
示例#3
0
    def on_create_user(cls, uid, gid):
        super(FishAccount, cls).on_create_user(uid, gid)
        # 发放一级礼包
        conf = Context.Configure.get_game_item_json(gid, 'exp.level.reward')
        rewards_info = FishProps.issue_rewards(uid, gid, conf[0],
                                               'exp.upgrade')
        rewards_info = FishProps.convert_reward(rewards_info)
        mo = MsgPack(Message.FISH_MSG_EXP_UPGRADE | Message.ID_NTF)
        mo.set_param('exp', 0)
        mo.set_param('lv', 1)
        mo.set_param('df', [1, [0, conf[1]]])
        mo.update_param(rewards_info)
        Context.GData.send_to_connect(uid, mo)

        # new user carrying
        pipe_args = []
        for k in ('chip', 'diamond', 'coupon'):
            if k in rewards_info:
                pipe_args.append('login.carrying.volume.%s' % k)
                pipe_args.append(rewards_info[k])
        if 'chip' in rewards_info:
            pipe_args.append('carrying.volume.chip')
            pipe_args.append(rewards_info['chip'])
        if pipe_args:
            Context.Stat.mincr_daily_data(gid, *pipe_args)
示例#4
0
    def on_raffle(self, uid, gid, mi):
        _id = mi.get_param('i')
        _button = mi.get_param('bt')
        mo = MsgPack(Message.MSG_SYS_RAFFLE | Message.ID_ACK)
        raffle_config = Context.Configure.get_game_item_json(
            gid, 'raffle.config')
        raffle_config = Context.copy_json_obj(raffle_config)
        loop_config = raffle_config['loop']
        raffle_config = raffle_config['config']
        class_pool, loop_times = Context.Daily.get_daily_data(
            uid, gid, 'fake.bonus.count', 'bonus.loop.times')
        class_pool = Tool.to_int(class_pool, 0)
        loop_times = Tool.to_int(loop_times, 0)
        if loop_times > len(loop_config) - 1:
            this_count = loop_config[-1]
        else:
            this_count = loop_config[loop_times]
        if class_pool < this_count:
            return mo.set_error(1, 'lack fish')

        for item in raffle_config:
            if item['id'] == _id:
                bonus_pool = Context.Data.get_game_attr_int(
                    uid, gid, 'bonus_pool', 0)
                if bonus_pool < item['limit']:
                    return mo.set_error(2, 'lack chip')
                # 发放奖励
                index, which = Algorithm.choice_by_ratio(item['reward'],
                                                         10000,
                                                         func=lambda l: l[0])
                reward = FishProps.issue_rewards(uid, gid, which[1],
                                                 'bonus.raffle')
                mo.set_param('bt', _button)
                mo.set_param('i', index + 1)
                rw = FishProps.convert_reward(reward)
                mo.update_param(rw)
                # 重置数据
                pipe_args = [
                    'fake.bonus.count', -class_pool, 'bonus.loop.times', 1
                ]
                Context.Daily.mincr_daily_data(uid, gid, *pipe_args)
                Context.Data.hincr_game(uid, gid, 'bonus_pool', -bonus_pool)
                self.__pub_raffle_led(uid, gid, item['name'], reward)
                return mo

        return mo.set_error(3, 'error id')
示例#5
0
    def on_consume_task(self, uid, gid, mi):
        _id = mi.get_param('id')
        mo = MsgPack(Message.MSG_SYS_CONSUME_TASK | Message.ID_ACK)
        task_list = Context.Daily.get_daily_data(uid, gid, 'task.list')
        if not task_list:
            return mo.set_error(1, 'no task')

        task_list = Context.json_loads(task_list)
        degree = 0
        for task in task_list:
            if task['type'] == 1:
                count = Context.Daily.get_daily_data(uid, gid, 'fish.' + str(task['fish_type']))
                task['count'] = Tool.to_int(count, 0)
            elif task['type'] == 2:
                count = Context.Daily.get_daily_data(uid, gid, 'class.boss')
                task['count'] = Tool.to_int(count, 0)
            elif task['type'] == 3:
                count = Context.Daily.get_daily_data(uid, gid, 'class.bonus')
                task['count'] = Tool.to_int(count, 0)
            elif task['type'] == 11:
                count = Context.Daily.get_daily_data(uid, gid, 'win.chip')
                task['count'] = Tool.to_int(count, 0)
            elif task['type'] == 21:
                degree += task['degree']

            if 'count' in task and task['count'] >= task['total']:
                task['done'] = 1
                degree += task['degree']

        conf = Context.Configure.get_game_item_json(gid, 'task.config')
        for i, reward in enumerate(conf['reward']):
            if i == _id:
                if degree < reward['degree']:
                    return mo.set_error(2, 'not done')
                state = Context.Daily.incr_daily_data(uid, gid, 'task.reward.%d' % _id, 1)
                if state > 1:
                    return mo.set_error(3, 'received')
                reward = FishProps.issue_rewards(uid, gid, reward['reward'], 'task.reward.%d' % _id)
                _reward = FishProps.convert_reward(reward)
                mo.update_param(_reward)
                break
        else:
            mo.set_error(4, 'error id')

        return mo
示例#6
0
 def issue_rewards(self, rewards, event, **kwargs):
     result = FishProps.issue_rewards(self.uid, self.gid, rewards, event,
                                      **kwargs)
     if result:
         if 'chip' in result:
             self.game_info['chip'] = result['chip']
         if 'coupon' in result:
             self.game_info['coupon'] = result['coupon']
         if 'diamond' in result:
             self.game_info['diamond'] = result['diamond']
         if 'props' in result:
             props = self._props_info
             for one in result['props']:
                 if one['id'] in props:
                     props[one['id']] += one['count']
                 else:
                     props[one['id']] = one['count']
     return result
示例#7
0
    def on_sign_in(self, uid, gid, mi):
        mo = MsgPack(Message.MSG_SYS_SIGN_IN | Message.ID_ACK)
        conf = Context.Configure.get_game_item_json(gid, 'login.reward')
        if not conf:
            Context.Log.error('miss config')
            return mo.set_error(1, 'miss config')

        now_day, last_login, ns_login = FishAccount.get_login_info(uid, gid)
        if now_day == last_login:
            return mo.set_error(2, 'already sign in')
        elif now_day == last_login + 1:  # 连续登陆
            ns_login += 1
        else:
            ns_login = 0
        FishAccount.set_login_info(uid, gid, now_day, ns_login)
        vip_level = FishAccount.get_vip_level(uid, gid)

        if vip_level:
            conf = conf['vip']
        else:
            conf = conf['common']
        reward = conf[ns_login % len(conf)]
        real, final = Context.UserAttr.incr_chip(uid, gid, reward,
                                                 'signin.reward')

        pipe_args = []
        delta_chip = real
        # 领取月卡奖励
        success, left_days = FishProps.use_vip(uid, gid)
        if success:
            conf = Context.Configure.get_game_item_json(
                gid, 'month.card.reward')
            reward = FishProps.issue_rewards(uid, gid, conf,
                                             'month.card.reward')
            if 'diamond' in reward:
                mo.set_param('diamond', reward['diamond'])
                pipe_args.append('login.carrying.volume.diamond')
                pipe_args.append(reward['reward']['diamond'])
            if 'coupon' in reward:
                mo.set_param('coupon', reward['coupon'])
                pipe_args.append('login.carrying.volume.coupon')
                pipe_args.append(reward['reward']['coupon'])
            if 'chip' in reward:
                final = reward['chip']
                delta_chip += reward['reward']['chip']

        pipe_args.append('login.carrying.volume.chip')
        pipe_args.append(delta_chip)
        pipe_args.append('carrying.volume.chip')
        pipe_args.append(delta_chip)
        Context.Daily.mincr_daily_data(uid, gid, *pipe_args)

        if vip_level:
            vip_conf = Context.Configure.get_game_item_json(
                gid, 'vip.config')[vip_level - 1]
            stone_count = vip_conf.get('stone', 0)
            if stone_count:
                FishProps.mincr_props(uid, gid, 'vip_reward', 215, stone_count,
                                      216, stone_count, 217, stone_count, 218,
                                      stone_count)
            chip_num = vip_conf.get('chip')
            if chip_num and chip_num > final:
                add_num = chip_num - final
                real, final = Context.UserAttr.incr_chip(
                    uid, gid, add_num, 'vip_reward')
        if final:
            mo.set_param('chip', final)
        return mo
示例#8
0
    def on_product_deliver(self, uid, gid, mi):
        orderId = mi.get_param('orderId')
        productId = mi.get_param('productId')
        payType = mi.get_param('payType')
        channel = mi.get_param('channel')
        cost = mi.get_param('cost')
        param = {
            'orderId': orderId,
            'productId': productId,
            'payType': payType,
            'channel': channel,
            'cost': cost
        }
        Context.Log.report('product.issue: [%d, %d, %s, %s]' %
                           (uid, gid, orderId, param))
        all_product = Context.Configure.get_game_item_json(
            gid, 'product.config')
        if productId not in all_product:
            Context.Log.error('productId not exist', orderId, productId,
                              all_product)
            return MsgPack.Error(0, 1, 'no product found')

        shop_config = Context.Configure.get_game_item_json(gid, 'shop.config')

        pipe_args = ['product_%s' % productId, 1]
        times = Context.Data.hincr_game(uid, gid, 'product_%s' % productId, 1)

        # 记录充值相关字段
        pay_total = FishProps.incr_pay(uid,
                                       gid,
                                       cost,
                                       'buy.product',
                                       orderId=orderId)
        today_pay_times, _ = Context.Daily.mincr_daily_data(
            uid, gid, 'pay_times', 1, 'pay_total', cost)

        is_reset_chance, is_first_double = False, False
        if productId in shop_config['chip']:
            if times == 1:
                is_first_double = True
            else:
                reset_choice = Context.Data.get_game_attr_int(
                    uid, gid, 'reset_' + str(productId), 0)
                if reset_choice:
                    is_reset_chance = True

        product = all_product[productId]
        if is_reset_chance:  # reset chance
            reward = self.__rebate_reward(gid, pay_total, product['first'],
                                          channel)
            FishProps.issue_rewards(uid,
                                    gid,
                                    reward,
                                    'buy.product',
                                    orderId=orderId,
                                    reset=1)
            Context.Data.del_game_attrs(uid, gid, 'reset_' + str(productId))
        elif is_first_double:
            reward = self.__rebate_reward(gid, pay_total, product['first'],
                                          channel)
            FishProps.issue_rewards(uid,
                                    gid,
                                    reward,
                                    'buy.product',
                                    orderId=orderId,
                                    first=1)
        elif productId in shop_config['card']:
            state, days = FishProps.incr_vip(uid,
                                             gid,
                                             30,
                                             'buy.product',
                                             orderId=orderId)
            if state == 0:  # 今日未领取
                sign_in = Context.Daily.get_daily_data(uid, gid, 'sign_in')
                if sign_in:
                    success, left_days = FishProps.use_vip(uid, gid)
                    if success:
                        conf = Context.Configure.get_game_item_json(
                            gid, 'month.card.reward')
                        FishProps.issue_rewards(uid, gid, conf,
                                                'month.card.reward')
        else:
            reward = self.__rebate_reward(gid, pay_total, product['content'],
                                          channel)
            FishProps.issue_rewards(uid,
                                    gid,
                                    reward,
                                    'buy.product',
                                    orderId=orderId)

        if today_pay_times == 1:  # today first pay
            pipe_args.append(channel + '.pay.user.count')
            pipe_args.append(1)
        pipe_args.append(channel + '.pay.user.pay_total')
        pipe_args.append(cost)
        pipe_args.append(channel + '.user.pay.times')
        pipe_args.append(1)

        if pay_total == cost:  # life first pay
            pipe_args.append(channel + '.new.pay.user.count')
            pipe_args.append(1)
            pipe_args.append('new_pay_user')
            pipe_args.append(1)
            new_pay_user = 1
        else:
            new_pay_user = Context.Daily.get_daily_data(
                uid, gid, 'new_pay_user')

        if new_pay_user:
            pipe_args.append(channel + '.new.pay.user.pay_total')
            pipe_args.append(cost)

        Context.Stat.mincr_daily_data(gid, *pipe_args)

        key = 'game.%d.info.hash' % gid
        pipe_args = []
        if pay_total == cost:
            pipe_args.append(channel + '.pay.user.count')
            pipe_args.append(1)

        pipe_args.append(channel + '.pay.user.pay_total')
        pipe_args.append(cost)
        pipe_args.append(channel + '.user.pay.times')
        pipe_args.append(1)
        Context.RedisMix.hash_mincrby(key, *pipe_args)

        self.__handle_pay_effect(uid, gid, cost, today_pay_times)

        return MsgPack(0, {'msg': u'已到货'})