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
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
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)
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')
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
def on_props_list(self, uid, gid, mi): props_list = FishProps.get_props_list(uid, gid) info = { 'c': Context.UserAttr.get_chip(uid, gid, 0), 'd': Context.UserAttr.get_diamond(uid, gid, 0), 'o': Context.UserAttr.get_coupon(uid, gid, 0) } if props_list: info['p'] = props_list # 升级礼包 conf = Context.Configure.get_game_item_json(gid, 'exp.level.reward') level, _ = FishAccount.get_exp_info(uid, gid) if level < len(conf): info['up'] = FishProps.convert_reward(conf[level]) mo = MsgPack(Message.MSG_SYS_PROPS_LIST | Message.ID_ACK) mo.update_param(info) return mo
def on_task_list(self, uid, gid, mi): conf = Context.Configure.get_game_item_json(gid, 'task.config') task_list = Context.Daily.get_daily_data(uid, gid, 'task.list') if task_list: task_list = Context.json_loads(task_list) else: what_day = Time.weekday(today=True) task_types = conf['daily'][what_day] task_map = {} for task in conf['task']: task_map[task['type']] = task total_degree, task_list = 0, [] for i, task_type in enumerate(task_types): task = {'id': i, 'type': task_type} if task_type == 2: # boss task['total'] = random.randint(*task_map[task_type]['range']) task['desc'] = task_map[task_type]['desc'] task['degree'] = task_map[task_type]['degree'] elif task_type == 3: task['total'] = random.randint(*task_map[task_type]['range']) task['desc'] = task_map[task_type]['desc'] task['degree'] = task_map[task_type]['degree'] elif task_type == 11: barrel_level = Context.Data.get_game_attr_int(uid, gid, 'barrel_level', 1) task['total'] = random.randint(*task_map[task_type]['range']) * barrel_level task['desc'] = task_map[task_type]['desc'] task['degree'] = task_map[task_type]['degree'] elif task_type == 21: task['desc'] = task_map[task_type]['desc'] task['degree'] = task_map[task_type]['degree'] elif task_type == 31: task['desc'] = task_map[task_type]['desc'] task['degree'] = task_map[task_type]['degree'] else: break total_degree += task['degree'] task_list.append(task) if total_degree < conf['total_degree']: fish_config = Context.Configure.get_game_item_json(gid, 'fish.201.config') fish_config = Context.copy_json_obj(fish_config) while total_degree < conf['total_degree']: # 普通鱼填充, 直到达到最大活跃值 task_type = 1 task = {'id': len(task_list), 'type': task_type} index = random.randrange(0, len(fish_config['common'])) fish = fish_config['common'][index] del fish_config['common'][index] task['total'] = random.randint(*task_map[task_type]['range']) task['desc'] = task_map[task_type]['desc'] task['fish_type'] = fish['type'] if isinstance(task_map[task_type]['degree'], list): for rg in task_map[task_type]['degree']: if task['total'] >= rg[0]: task['degree'] = rg[1] break else: task['degree'] = task_map[task_type]['degree'][-1][1] else: task['degree'] = task_map[task_type]['degree'] total_degree += task['degree'] task_list.insert(0, task) Context.Daily.set_daily_data(uid, gid, 'task.list', Context.json_dumps(task_list)) rewards, 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: task['done'] = 1 degree += task['degree'] if 'count' in task and task['count'] >= task['total']: task['done'] = 1 degree += task['degree'] # 处理奖励 _ids = range(len(conf['reward'])) for i, _id in enumerate(_ids): _ids[i] = 'task.reward.%d' % _id _states = Context.Daily.get_daily_data(uid, gid, *_ids) for _state, reward in zip(_states, conf['reward']): _state = 1 if _state else 0 _reward = FishProps.convert_reward(reward['reward']) rewards.append({'degree': reward['degree'], 'state': _state, 'reward': _reward}) mo = MsgPack(Message.MSG_SYS_TASK_LIST | Message.ID_ACK) mo.set_param('tasks', task_list) mo.set_param('reward', rewards) mo.set_param('degree', degree) return mo