Esempio n. 1
0
class AdClick(BaseRequestHandler):
    def get(self, tp):
        # type: (object) -> object
        from views import ad_click

        func = getattr(ad_click, '%s_click' % tp)
        if settings.DEBUG:
            print '=== AdClick ===:', self.request.arguments
            path = os.path.join(
                settings.BASE_ROOT, 'logs',
                'adclick_%s_%s.txt' % (tp, time.strftime('%F-%T')))
            f = open(path, 'w')
            f.write(repr(self.request))
            f.close()

        d = func(self)
        # 由tornado自动判断是否转JSON
        # d = json.dumps(d, ensure_ascii=False, encoding="utf-8", default=to_json)
        if d is not None:
            self.write(d)
            self.finish()

    if not settings.DEBUG:
        get = error_mail(get, settings.ADMIN_LIST)

    def post(self, tp):
        return self.get(tp)
Esempio n. 2
0
class ConfigHandler(BaseRequestHandler):
    def get(self):
        import game_config
        if not game_config.is_config_out():
            game_config.load_all()

        from views import config
        method = self.get_argument('method', 'resource_version')
        func = getattr(config, method)
        d = {
            'status': 0,
            'data': func(self),
            'msg': '',
            'user_status': {},
        }

        self.set_header('content_type', 'application/json; charset=UTF-8')
        self.set_header('Content-Type', 'application/json; charset=UTF-8')
        r = json.dumps(d,
                       ensure_ascii=False,
                       separators=(',', ':'),
                       encoding="utf-8",
                       default=to_json)
        self.write(r)
        self.finish()

    if not settings.DEBUG:
        get = error_mail(get, settings.ADMIN_LIST)

    def post(self):
        self.get(self)
Esempio n. 3
0
class PayCallBack(BaseRequestHandler):
    def get(self, tp):
        from views import payment

        func = payment.callback

        d = pay_lock(tp, payment, func, [self, tp])

        self.write(d)
        self.finish()

    if not settings.DEBUG:
        get = error_mail(get, settings.ADMIN_LIST)

    def post(self, tp):
        return self.get(tp)
Esempio n. 4
0
class Pay(BaseRequestHandler):
    def get(self):
        from views import payment
        method = self.get_argument('method', 'callback')
        tp = self.get_argument('tp', 'apple')

        func = getattr(payment, method)

        d = pay_lock(tp, payment, func, [self])

        self.write(d)
        self.finish()

    if not settings.DEBUG:
        get = error_mail(get, settings.ADMIN_LIST)

    def post(self):
        return self.get()
Esempio n. 5
0
class Login(BaseRequestHandler):
    def api(self):
        import game_config
        if not game_config.is_config_out():
            game_config.load_all()
        method = self.get_argument('method', 'new_user')
        from views import user
        msg = ''
        is_login = True
        if method == 'loading':
            rc, user, data = 0, None, {}
            # 通过version配置的格式 来判断是否提交了新版本的version
            # 如果提交了新版version 开始强制更新前端,则老版本前端包不再下载各个 game_config 配置,等到更新完新版客户端之后再去下载game_config 配置
            # 老版本的version配置格式 {'version': '','url': '','msg': unicode('''《超级英雄》敬请期待!''','utf-8'),}
            # 新版本的version配置格式 按平台区分更新信息 {'sogou':[],'androidcmge':[],'itools':[], ...}
            # 这代码为了解决 前端 遗留bug, 等更新完新客户端之后 可删除
            version_info = {}
            for version_info in game_config.version.itervalues():
                break
            need_upgrade = 'tongbu' in version_info or 'cmge' in version_info or 'itools' in version_info
            version = self.get_argument('version', '1.0.2')
            if version < '1.0.7' and need_upgrade:
                is_login = False
        else:
            func = getattr(user, method)
            rc, user, data = func(self)
            method_param = '%s.%s' % ('user', func.__name__)
            if rc != 0:
                msg = game_config.return_msg_config.get(method_param, {}).get(
                    rc, method_param + '_error_%d' % rc)

        # get_user_server_list 接口判断客户端是否需要强制更新
        if method == 'new_user':
            from models.user import UnameUid

            account = self.get_argument('account', '')
            uu = UnameUid.get(account)
            cur_server = uu.current_server
            if cur_server and cur_server in game_config.version:
                client_upgrade = {
                    'url': 'http://www.baidu.com',  # 前端需要跳转到的新包下载地址,一般是官网什么的
                    'msg': u'当前测试已经结束啦。感谢您对《禁区》的支持,我们将于2月中旬进行第二轮测试,敬请期待。',
                    'version': '',
                    'need_upgrade': False
                }

                _platform = account.split('_')[0].lower()
                _version_config = game_config.version[cur_server]
                _platform_config = _version_config.get(_platform, [])
                if _platform_config and len(_platform_config) == 3:
                    # [[version], [url], [msg]]
                    client_upgrade['version'] = _platform_config[0][0]
                    client_upgrade['url'] = _platform_config[1][0]
                    client_upgrade['msg'] = _platform_config[2][0]

                version = self.get_argument('version', '1.0.2')
                new_version = client_upgrade.get('version', '')
                if new_version and version < new_version:
                    client_upgrade['need_upgrade'] = True

                    d = {
                        'status': 0,
                        'data': {},
                        'msg': '',
                        'user_status': {},
                        'client_upgrade': client_upgrade
                    }
                    self.set_header('content_type',
                                    'application/json; charset=UTF-8')
                    self.set_header('Content-Type',
                                    'application/json; charset=UTF-8')
                    r = json.dumps(d,
                                   ensure_ascii=False,
                                   encoding="utf-8",
                                   indent=2,
                                   default=to_json)
                    self.write(r)
                    self.finish()
                    return -99009, {}, '', None

        ########################################
        self.set_header('content_type', 'application/json; charset=UTF-8')
        self.set_header('Content-Type', 'application/json; charset=UTF-8')
        try:
            r = handler_tools.result_generator(rc,
                                               data,
                                               msg,
                                               user,
                                               login=True,
                                               request=self)
            self.write(r)
        finally:
            self.finish()
            return rc, data, msg, user

    if not settings.DEBUG:
        api = stat(api, 'login')
        api = error_mail(api, settings.ADMIN_LIST)

    def get(self):
        """# get: docstring
        args:
            :    ---    arg
        returns:
            0    ---
        """
        user_agent = self.request.headers.get('User-Agent')
        skip = settings.DEBUG or self.get_argument(
            'browser', '') == 'a7b87e9d6faae5e7c4962d001bbd62b1'
        skip = True
        if not skip and (user_agent is not None
                         or not self.get_argument('method')):
            d = {
                'status': 9999,
                'data': {},
                'msg': '',
                'user_status': {},
            }
            self.set_header('content_type', 'application/json; charset=UTF-8')
            self.set_header('Content-Type', 'application/json; charset=UTF-8')
            r = json.dumps(d,
                           ensure_ascii=False,
                           encoding="utf-8",
                           indent=2,
                           default=to_json)
            self.write(r)
            self.finish()
            return
        # 登录接口的调用
        self.api()

    def post(self):
        """# post: docstring
        args:
            :    ---    arg
        returns:
            0    ---
        """
        self.get()
Esempio n. 6
0
class APIRequestHandler(UserMixIn, BaseRequestHandler):
    """ 统一的API Handler

    全部API处理公共接口
    """
    def initialize(self):
        """ 初始化操作

        创建全局环境和运行环境
        """
        try:
            self.env = APIEnviron.build_env(self)
        except:
            import traceback
            print_log(traceback.print_exc())
            self.env = None

    determine_card_package = { # 以下这些接口判断卡包是否已满
        'private_city.recapture': {'step_n': ('0', )},
        'private_city.auto_recapture': {},
        'arena.battle': {},
        'active.fight': {'step_n': ('0',)},
    }
    # 判断单点登录 可忽略的接口、模块
    single_login_ignore_api_module = ['config']
    single_login_ignore_api_method = ['test.test', 'payment.pay']

    # 忽略消费活动的接口
    single_payment_active_api_module = ['mine']
    single_payment_active_api_method = [
        'gringotts.investing', 'gringotts.quickly_reward'
    ]

    def api(self):
        """ API统一调用方法
        """
        method_param = self.env.req.get_argument('method')
        module_name, method_name = method_param.split('.')
        ########################################
        # 客户端版本判断
        # game_config.version eg:{'h1': {'msg': u'当前测试已经结束啦。感谢您对《禁区》的支持,我们将于2月中旬进行第二轮测试,敬请期待。',
        #                                 'url': 'http://www.baidu.com',
        #                                 'version': '1.0.1'}
        #                         }
        uid = self.env.req.get_argument('user_token')
        all_server_flag = 'all'
        if uid and (uid[:-7] in game_config.version
                    or all_server_flag in game_config.version):
            data = {
                'url': 'http://www.baidu.com',  # 前端需要跳转到的新包下载地址,一般是官网什么的
                'msg': u'当前测试已经结束啦。感谢您对《禁区》的支持,我们将于2月中旬进行第二轮测试,敬请期待。',
                'version': '',
                'need_upgrade': False
            }

            if settings.ENV_NAME in [
                    settings.ENV_IOS, settings.ENV_STG_IOS,
                    settings.ENV_TEST_IOS
            ]:
                data.update(
                    game_config.version.get(
                        uid[:-7], game_config.version.get(all_server_flag,
                                                          {})))
            else:
                user = self.env.user
                _platform = user.account.split('_')[0].lower()
                _version_config = game_config.version.get(
                    uid[:-7], game_config.version.get(all_server_flag, {}))
                _platform_config = _version_config.get(_platform, [])
                if _platform_config and len(_platform_config) == 3:
                    # [[version], [url], [msg]]
                    data['version'] = _platform_config[0][0]
                    data['url'] = _platform_config[1][0]
                    data['msg'] = _platform_config[2][0]

            version = self.env.get_argument('version', '1.0.2')
            new_version = data.get('version', '')
            if new_version and version < new_version:
                data['need_upgrade'] = True

                d = {
                    'status': 0,
                    'data': {},
                    'msg': '',
                    'user_status': {},
                    'client_upgrade': data
                }
                self.set_header('content_type',
                                'application/json; charset=UTF-8')
                self.set_header('Content-Type',
                                'application/json; charset=UTF-8')
                r = json.dumps(d,
                               ensure_ascii=False,
                               encoding="utf-8",
                               indent=2,
                               default=to_json)
                self.write(r)
                self.finish()
                return -99009, {}, '', None

        ########################################
        # # 清档测试    2014-05-19 17:00:00 之后注册的用户不让进 测试服
        # if 'g1' in self.env.user.uid:
        #     pts = ['downjoy', 'uc', 'pp', 'kuaiyong', 'itools', 'tongbu']
        #     pt = self.env.user.account.split('_')[0]
        #     if self.env.user.regist_time > 1400490000 or pt.lower() in pts:
        #         rc = 'f**k'
        #         d = {
        #             'status': rc,
        #             'data': {},
        #             'msg': game_config.return_msg_config.get(rc, rc),
        #             'user_status': {},
        #         }
        #         self.set_header('content_type', 'application/json; charset=UTF-8')
        #         self.set_header('Content-Type', 'application/json; charset=UTF-8')
        #         r = json.dumps(d, ensure_ascii=False, encoding="utf-8", indent=2, default=to_json)
        #         self.write(r)
        #         self.finish()
        #         return rc, {}, d['msg'], self.env.user

        ########### 封号 start #################
        if self.env.user.is_ban:
            rc = 'error_17173'
            d = {
                'status': rc,
                'data': {},
                'msg': game_config.return_msg_config.get(rc, rc),
                'user_status': {},
            }
            self.set_header('content_type', 'application/json; charset=UTF-8')
            self.set_header('Content-Type', 'application/json; charset=UTF-8')
            r = json.dumps(d,
                           ensure_ascii=False,
                           encoding="utf-8",
                           indent=2,
                           default=to_json)
            self.write(r)
            self.finish()
            return rc, {}, d['msg'], self.env.user
        ########### 封号 end #################

        ########### 多点登录判断 start #################
        device_mark = self.env.get_argument('device_mark', '')
        device_mem = self.env.get_argument('device_mem', '')
        frontwindow = settings.DEBUG or self.env.get_argument(
            'frontwindow', '') == '5e3b4530b293b5c1f4eeca4638ab4dc1'
        mem_unavaible_api = self.env.user.device_mem and self.env.user.device_mem != device_mem
        unavaible_api = self.env.user.device_mark and self.env.user.device_mark != device_mark
        mk = self.env.req.get_argument('mk', 0)
        _mk = int(mk) if mk else 0
        if not frontwindow and (mem_unavaible_api or unavaible_api or not _mk
                                or _mk != self.env.user._mark):
            if module_name not in self.single_login_ignore_api_module and method_param not in self.single_login_ignore_api_method:
                rc = 9527
                d = {
                    'status': rc,
                    'data': {},
                    'msg': game_config.return_msg_config.get(rc, rc),
                    'user_status': {},
                }
                self.set_header('content_type',
                                'application/json; charset=UTF-8')
                self.set_header('Content-Type',
                                'application/json; charset=UTF-8')
                r = json.dumps(d,
                               ensure_ascii=False,
                               encoding="utf-8",
                               indent=2,
                               default=to_json)
                self.write(r)
                self.finish()
                return rc, {}, d['msg'], self.env.user
        ########### 多点登录判断 end #################

        ########### session验证判断 start #################
        ks = self.env.get_argument('ks', '')
        if not frontwindow and settings.SESSION_SWITCH and self.env.user.session_expired(
                ks):
            rc = 9527
            d = {
                'status': rc,
                'data': {},
                'msg': game_config.return_msg_config.get(rc, rc),
                'user_status': {},
            }
            self.set_header('content_type', 'application/json; charset=UTF-8')
            self.set_header('Content-Type', 'application/json; charset=UTF-8')
            r = json.dumps(d,
                           ensure_ascii=False,
                           encoding="utf-8",
                           indent=2,
                           default=to_json)
            self.write(r)
            self.finish()
            return rc, {}, d['msg'], self.env.user
        ########### session验证判断 end #################

        ############## 如果卡包已满,则部分接口直接跳出 #########
        if method_param in self.determine_card_package:
            need_check = True
            param_dict = self.determine_card_package[method_param]
            if param_dict:
                for k, v in param_dict.iteritems():
                    param_value = self.env.req.get_argument(k)
                    if not v or param_value in v:
                        need_check = True
                        break
                else:
                    need_check = False

            if need_check:
                if self.env.user.is_cards_full():
                    from logics import guide

                    rc = 'error_1'
                    guide.mark_guide_4_error(self.env.user, 1)
                    msg = game_config.return_msg_config[rc]
                    data = {
                        '_client_cache_update': {},
                    }
                    self.write(
                        handler_tools.result_generator(rc, data, msg,
                                                       self.env.user))
                    self.finish()
                    return rc, data, msg, self.env.user
                if self.env.user.is_equip_full():
                    rc = 'error_2'
                    msg = game_config.return_msg_config[rc]
                    data = {
                        '_client_cache_update': {},
                    }
                    self.write(
                        handler_tools.result_generator(rc, data, msg,
                                                       self.env.user))
                    self.finish()
                    return rc, data, msg, self.env.user

        ########################################
        user = self.env.user
        old_coin = user.coin
        old_level = user.level

        module = __import__('views.%s' % module_name, globals(), locals(),
                            [method_name])
        method = getattr(module, method_name)

        if callable(method):
            msg = ''
            rc, data = method(self.env)
            if rc != 0:
                msg = data.get('custom_msg', '') or game_config.return_msg_config.get(rc) or \
                    game_config.return_msg_config.get(method_param, {}).get(rc, method_param + '_error_%s' % rc)
                if rc == 'error_14':  # 级别不足 的提示 用后端给的msg
                    rc = 'xx'
            else:
                new_coin = user.con
                # 简单粗暴的记录消费记录
                if new_coin < old_coin:
                    from models.payment import spend_insert
                    arguments = copy.deepcopy(self.env.req.summary_params())
                    for _ in ['method', 'user_token', 'mk']:
                        arguments.pop(_, None)

                    spend_data = {
                        'coin_1st': old_coin,
                        'coin_2nd': new_coin,
                        'coin_num': old_coin - new_coin,
                        'goods_cnname': '',
                        'goods_name': '',
                        'goods_num': 1,
                        'goods_subtype': '',
                        'goods_type': method_param,
                        'level': user.level,
                        'subtime': time.strftime('%F %T'),
                        'uid': user.uid,
                        'args': json.dumps(arguments, separators=(',', ':')),
                    }
                    spend_insert('%s_%s' % (user.uid, time.time()), spend_data)
                    if module_name not in self.single_payment_active_api_module and method_param not in self.single_payment_active_api_method:
                        coin = cal_new_coin(old_coin, new_coin, method_param)
                        # 钻石摩天轮的消耗钻石开启摩天轮的活动
                        try:
                            user.diamond_wheel.pay_coin(coin)
                        except:
                            pass
                        # 开服的钻石摩天轮的消耗钻石开启摩天轮的活动
                        try:
                            user.server_diamond_wheel.pay_coin(coin)
                        except:
                            pass
                        # 赛亚人归来活动
                        user.super_active.add_score(old_coin - new_coin,
                                                    save=True)
                        try:
                            # 新服人归来活动
                            user.server_super_active.add_score(old_coin -
                                                               new_coin,
                                                               save=True)
                        except:
                            pass
                        # 悬赏令消耗的钻石
                        try:
                            user.bounty_order.use_coin(coin)
                        except:
                            import traceback
                            print_log(traceback.print_exc())

                        try:
                            user.server_bounty_order.use_coin(coin)
                        except:
                            import traceback
                            print_log(traceback.print_exc())

                        # 全服神龙消耗的钻石数量
                        try:
                            user.large_super_all.use_coin_or_action_point(
                                coin=coin)
                        except:
                            import traceback
                            print_log(traceback.print_exc())

                        # 全服宇宙最强消耗的钻石数量
                        try:
                            user.large_super_rich.use_coin_or_action_point(
                                coin=coin)
                        except:
                            import traceback
                            print_log(traceback.print_exc())

                        # 开服充值活动
                        user.server_active_recharge.reward_coin(old_coin -
                                                                new_coin)
                        user.consume_reward.add_score(old_coin - new_coin,
                                                      method_param)

                        if 'foundation.activate' not in method_param:
                            #消费钻石,领取奖励活动
                            user.active_consume.add_consume_coin(coin)

                # 用户到2级才回调积分墙接口
                if old_level < user.level and user.level in [2, 3, 4, 5]:
                    from views import ad_click
                    ad_click.ad_callback(self, user.level)

            self.set_header('content_type',
                            'application/javascript; charset=UTF-8')
            self.set_header('Content-Type',
                            'application/javascript; charset=UTF-8')

            # 关于客户端数据缓存的更新
            client_cache_update = {}
            for k, v in self.env.user.__class__.__dict__.iteritems():
                if 'fget' in dir(v) and k not in self.env.user.user_m._attrs:
                    obj = getattr(self.env.user, '_' + k, None)
                    if obj and getattr(obj, '_diff', None):
                        client_cache_update[k] = obj._client_cache_update()

            data['_client_cache_update'] = client_cache_update
            # self.env.user.reward.do_task_api(method_param, self.env, rc, data)
            # self.env.user.daily_score.do_daily_score_api(method_param, self.env, rc, data)
            # try:
            #     self.env.user.recall_daily_score.do_daily_score_api(method_param, self.env, rc, data)
            # except:
            #     import traceback
            #     print_log(traceback.print_exc())
            # self.env.user.bounty_order.do_task_api(method_param, self.env, rc, data)
            # self.env.user.server_bounty_order.do_task_api(method_param, self.env, rc, data)
            # self.env.user.role_reward.do_role_reward_api(method_param, self.env, rc, data)
            self.write(
                handler_tools.result_generator(rc, data, msg, self.env.user))
            self.finish()
            return rc, data, msg, self.env.user

    # if not settings.DEBUG:
    api = stat(api)
    if not settings.DEBUG:
        api = error_mail(api, settings.ADMIN_LIST)
    api = lock(api)

    def on_finish(self):
        """ 处理异步方法
        """
        if self.env is not None:
            for callback in self.env.callbacks:
                callback(self.env)

            self.env.finish()

    @tornado.web.asynchronous
    def get(self):
        """ 处理GET请求
        """
        user_agent = self.request.headers.get('User-Agent')
        skip = settings.DEBUG or (self.env is not None
                                  and self.env.get_argument('browser', '')
                                  == 'a7b87e9d6faae5e7c4962d001bbd62b1')

        if not skip and (user_agent is not None or self.env is None
                         or not self.env.req.get_argument('method')):
            d = {
                'status': 9999,
                'data': {},
                'msg': game_config.return_msg_config.get(9999, 9999),
                'user_status': {},
            }
            self.set_header('content_type', 'application/json; charset=UTF-8')
            self.set_header('Content-Type', 'application/json; charset=UTF-8')
            r = json.dumps(d,
                           ensure_ascii=False,
                           encoding="utf-8",
                           indent=2,
                           default=to_json)
            self.write(r)
            self.finish()
            return
        self.api()

    @tornado.web.asynchronous
    def post(self):
        """ 处理POST请求
        """
        self.get()