From 32bcbb0ccd8343fe509901ab17d1497d39ba15fb Mon Sep 17 00:00:00 2001 From: Lost-MSth Date: Mon, 24 Jan 2022 21:22:38 +0800 Subject: [PATCH] Change something about aggregate --- latest version/main.py | 138 ++++++++++++++++++------------ latest version/server/arcworld.py | 21 ++--- latest version/server/config.py | 7 ++ latest version/server/info.py | 62 ++++++++------ latest version/setting.py | 41 --------- 5 files changed, 138 insertions(+), 131 deletions(-) create mode 100644 latest version/server/config.py diff --git a/latest version/main.py b/latest version/main.py index 4da579d..f9b9d62 100644 --- a/latest version/main.py +++ b/latest version/main.py @@ -1,6 +1,6 @@ # encoding: utf-8 -from flask import Flask, json, request, jsonify, make_response, send_from_directory +from flask import Flask, json, request, jsonify, send_from_directory from logging.config import dictConfig from setting import Config import base64 @@ -21,9 +21,10 @@ from udpserver.udp_main import link_play import os import sys from multiprocessing import Process, Pipe -if Config.USE_EXPERIMENTAL_AGGREGATE: - from urllib.parse import parse_qs, urlparse - from werkzeug.datastructures import ImmutableMultiDict + + +from urllib.parse import parse_qs, urlparse +from werkzeug.datastructures import ImmutableMultiDict app = Flask(__name__) @@ -39,6 +40,14 @@ app.register_blueprint(api.api_main.bp) conn1, conn2 = Pipe() +map_dict = {'/user/me': 'user_me', + '/purchase/bundle/pack': 'bundle_pack', + '/serve/download/me/song': 'download_song', + '/game/info': 'game_info', + '/present/me': 'present_info', + '/world/map/me': 'world_all', + '/score/song/friend': 'song_score_friend'} + def add_url_prefix(url, strange_flag=False): # 给url加前缀,返回字符串 @@ -124,16 +133,17 @@ def error_return(error_code, extra={}): # 错误返回 "error_code": error_code }) + def success_return(value): return jsonify({ - "success": True, - "value": value - }) + "success": True, + "value": value + }) + @app.route('/') def hello(): return "Hello World!" -# 自定义路径 @app.route('/favicon.ico', methods=['GET']) # 图标 @@ -198,66 +208,84 @@ def register(): else: return error_return(error_code) -@app.route(add_url_prefix('/purchase/bundle/pack'), methods=['GET']) + +@app.route(add_url_prefix('/purchase/bundle/pack'), methods=['GET']) # 曲包信息 @server.auth.auth_required(request) def bundle_pack(user_id): return success_return(server.info.get_purchase_pack(user_id)) -@app.route(add_url_prefix('/game/info'), methods=['GET']) + +@app.route(add_url_prefix('/game/info'), methods=['GET']) # 系统信息 def game_info(): return success_return(server.info.get_game_info()) -@app.route(add_url_prefix('/present/me'), methods=['GET']) + +@app.route(add_url_prefix('/present/me'), methods=['GET']) # 用户奖励信息 @server.auth.auth_required(request) def present_info(user_id): return success_return(server.info.get_user_present(user_id)) -if Config.USE_EXPERIMENTAL_AGGREGATE: - @app.route(add_url_prefix('/compose/aggregate'), methods=['GET']) - def aggregate_experimental(): - global request - # ()都不requests.request('http://localhost') - finally_response={'success':True,'value':[]} - request_=request - for i in json.loads(request_.args.get('calls')): - url=add_url_prefix(i.get('endpoint')) - request.args=ImmutableMultiDict({key:value[0] for key,value in parse_qs(urlparse(url).query).items()}) - url=urlparse(url).path - urls = app.url_map.bind("example.com", "/") - resp_t=app.view_functions[urls.match(url,"GET")[0]]() - if hasattr(resp_t,"response"): - resp_t=resp_t.response[0].decode().rstrip('\n') - resp=json.loads(resp_t) - if hasattr(resp,'get') and resp.get('success') is False: - finally_response={'success':False,'error_code':7,'extra':{"id":i.get('id'),'error_code':resp.get('error_code')}} + +@app.route(add_url_prefix('/compose/aggregate'), methods=['GET']) # 集成式请求 +def aggregate(): + try: + #global request + finally_response = {'success': True, 'value': []} + #request_ = request + get_list = json.loads(request.args.get('calls')) + if len(get_list) > 10: + # 请求太多驳回 + return error_return(108) + + for i in get_list: + endpoint = i['endpoint'] + url = add_url_prefix(endpoint) + request.args = ImmutableMultiDict( + {key: value[0] for key, value in parse_qs(urlparse(url).query).items()}) + + resp_t = app.view_functions[map_dict[urlparse(endpoint).path]]() + + if hasattr(resp_t, "response"): + resp_t = resp_t.response[0].decode().rstrip('\n') + resp = json.loads(resp_t) + + if hasattr(resp, 'get') and resp.get('success') is False: + finally_response = {'success': False, 'error_code': 7, 'extra': { + "id": i['id'], 'error_code': resp.get('error_code')}} if "extra" in resp: - finally_response['extra']['extra']=resp['extra'] - request=request_# 无实际影响 + finally_response['extra']['extra'] = resp['extra'] + #request = request_ return jsonify(finally_response) - # I don't sure if the behavior is correct - finally_response['value'].append({'id':i.get('id'),'value':resp.get('value') if hasattr(resp,'get') else resp}) - request=request_# 无实际影响 + + finally_response['value'].append( + {'id': i.get('id'), 'value': resp['value'] if hasattr(resp, 'get') else resp}) + + #request = request_ return jsonify(finally_response) -else: - # 集成式请求,没想到什么好办法处理,就先这样写着 - @app.route(add_url_prefix('/compose/aggregate'), methods=['GET']) - @server.auth.auth_required(request) - def aggregate(user_id): - calls = request.args.get('calls') - if calls == '[{ "endpoint": "/user/me", "id": 0 }]': # 极其沙雕的判断,我猜get的参数就两种 - r = server.info.arc_aggregate_small(user_id) - else: - r = server.info.arc_aggregate_big(user_id) - return jsonify(r) + except KeyError: + return error_return(108) -@app.route(add_url_prefix('/user/me'), methods=['GET']) # 用户信息,给baa查分器用的 +# # 集成式请求,没想到什么好办法处理,就先这样写着 +# @app.route(add_url_prefix('/compose/aggregate'), methods=['GET']) +# @server.auth.auth_required(request) +# def aggregate(user_id): +# calls = request.args.get('calls') +# if calls == '[{ "endpoint": "/user/me", "id": 0 }]': # 极其沙雕的判断,我猜get的参数就两种 +# r = server.info.arc_aggregate_small(user_id) +# else: +# r = server.info.arc_aggregate_big(user_id) +# return jsonify(r) + + +@app.route(add_url_prefix('/user/me'), methods=['GET']) # 用户信息 @server.auth.auth_required(request) def user_me(user_id): - r = server.info.arc_aggregate_small(user_id) # TODO:独立函数 - if r['success']: - r['value'] = r['value'][0]['value'] - return jsonify(r) + r = server.info.get_user_me_c(user_id) + if r: + return success_return(r) + else: + return error_return(108) @app.route(add_url_prefix('/user/me/character'), methods=['POST']) # 角色切换 @@ -662,7 +690,7 @@ def world_one(user_id, map_id): @server.auth.auth_required(request) def download_song(user_id): song_ids = request.args.getlist('sid') - url_flag=json.loads(request.args.get('url','true')) + url_flag = json.loads(request.args.get('url', 'true')) if server.arcdownload.is_able_download(user_id) or not url_flag: re = {} if not song_ids: @@ -772,9 +800,11 @@ def sys_set(user_id, path): set_arg = path[5:] value = request.form['value'] server.setme.arc_sys_set(user_id, value, set_arg) - r = server.info.arc_aggregate_small(user_id) - r['value'] = r['value'][0]['value'] - return jsonify(r) + r = server.info.get_user_me_c(user_id) + if r: + return success_return(r) + else: + return error_return(108) def main(): diff --git a/latest version/server/arcworld.py b/latest version/server/arcworld.py index b81ca76..885939a 100644 --- a/latest version/server/arcworld.py +++ b/latest version/server/arcworld.py @@ -1,5 +1,6 @@ import json from server.sql import Connect +from .config import Constant from setting import Config import server.item import server.character @@ -26,14 +27,14 @@ def int2b(x): def calc_stamina(max_stamina_ts, curr_stamina): # 计算体力,返回剩余体力数值 - stamina = int(Config.MAX_STAMINA - (max_stamina_ts - - int(time.time()*1000)) / Config.STAMINA_RECOVER_TICK) + stamina = int(Constant.MAX_STAMINA - (max_stamina_ts - + int(time.time()*1000)) / Constant.STAMINA_RECOVER_TICK) - if stamina >= Config.MAX_STAMINA: - if curr_stamina >= Config.MAX_STAMINA: + if stamina >= Constant.MAX_STAMINA: + if curr_stamina >= Constant.MAX_STAMINA: stamina = curr_stamina else: - stamina = Config.MAX_STAMINA + stamina = Constant.MAX_STAMINA if stamina < 0: stamina = 0 @@ -245,8 +246,8 @@ def play_world_song(user_id, args): return {} stamina = calc_stamina(max_stamina_ts, stamina) - \ info['stamina_cost'] * stamina_multiply - max_stamina_ts = now + Config.STAMINA_RECOVER_TICK * \ - (Config.MAX_STAMINA - stamina) + max_stamina_ts = now + Constant.STAMINA_RECOVER_TICK * \ + (Constant.MAX_STAMINA - stamina) c.execute('''update user set max_stamina_ts=?, stamina=? where user_id=?''', (max_stamina_ts, stamina, user_id)) r = { @@ -600,11 +601,11 @@ def add_stamina(c, user_id, add_stamina): if x and x[0] is not None and x[1] is not None: stamina = calc_stamina(x[0], x[1]) + add_stamina max_stamina_ts = now - \ - (stamina-Config.MAX_STAMINA) * \ - Config.STAMINA_RECOVER_TICK + (stamina-Constant.MAX_STAMINA) * \ + Constant.STAMINA_RECOVER_TICK else: max_stamina_ts = now - stamina = Config.MAX_STAMINA + stamina = Constant.MAX_STAMINA c.execute('''update user set max_stamina_ts=?, stamina=? where user_id=?''', (max_stamina_ts, stamina, user_id)) diff --git a/latest version/server/config.py b/latest version/server/config.py new file mode 100644 index 0000000..f7f552e --- /dev/null +++ b/latest version/server/config.py @@ -0,0 +1,7 @@ +class Constant: + + MAX_STAMINA = 12 + + STAMINA_RECOVER_TICK = 1800000 + + CORE_EXP = 250 diff --git a/latest version/server/info.py b/latest version/server/info.py index e4d5af5..5a58af6 100644 --- a/latest version/server/info.py +++ b/latest version/server/info.py @@ -6,7 +6,7 @@ import server.character import server.item import time from setting import Config - +from .config import Constant def int2b(x): @@ -199,6 +199,38 @@ def get_user_me(c, user_id): return r +def get_user_me_c(user_id): + # user/me调用,上边没开数据库这里开一下 + with Connect() as c: + return get_user_me(c, user_id) + + +def get_purchase_pack(user_id): + # 返回曲包数据 + with Connect() as c: + return server.arcpurchase.get_purchase(c, 'pack') + + +def get_game_info(): + # 返回游戏基本信息 + r = { + "max_stamina": Constant.MAX_STAMINA, + "stamina_recover_tick": Constant.STAMINA_RECOVER_TICK, + "core_exp": Constant.CORE_EXP, + "curr_ts": int(time.time()*1000), + "level_steps": server.character.get_level_steps(), + "world_ranking_enabled": True, + "is_byd_chapter_unlocked": True + } + return r + + +def get_user_present(user_id): + # 返回奖励信息 + with Connect() as c: + return server.arcpurchase.get_user_present(c, user_id) + + def arc_aggregate_small(user_id): # 返回用户数据 r = {"success": False} @@ -211,28 +243,6 @@ def arc_aggregate_small(user_id): return r -def get_purchase_pack(user_id): - # 返回曲包数据 - with Connect() as c: - return server.arcpurchase.get_purchase(c, 'pack') - -def get_game_info(): - # 返回游戏基本信息 - r={ - "max_stamina": Config.MAX_STAMINA, - "stamina_recover_tick": Config.STAMINA_RECOVER_TICK, - "core_exp": Config.CORE_EXP, - "curr_ts": int(time.time()*1000), - "level_steps": server.character.get_level_steps(), - "world_ranking_enabled": True, - "is_byd_chapter_unlocked": True - } - return r - -def get_user_present(user_id): - # 返回礼品信息 - with Connect() as c: - return server.arcpurchase.get_user_present(c, user_id) def arc_aggregate_big(user_id): # 返回比较全的用户数据 @@ -258,9 +268,9 @@ def arc_aggregate_big(user_id): }, { "id": 3, "value": { - "max_stamina": MAX_STAMINA, - "stamina_recover_tick": STAMINA_RECOVER_TICK, - "core_exp": CORE_EXP, + "max_stamina": Constant.MAX_STAMINA, + "stamina_recover_tick": Constant.STAMINA_RECOVER_TICK, + "core_exp": Constant.CORE_EXP, "curr_ts": int(time.time()*1000), "level_steps": server.character.get_level_steps(), "world_ranking_enabled": True, diff --git a/latest version/setting.py b/latest version/setting.py index e73a8b3..9b2a307 100644 --- a/latest version/setting.py +++ b/latest version/setting.py @@ -251,44 +251,3 @@ class Config(): ''' -------------------- ''' - - ''' - -------------------- - 体力上限 - TODO - ''' - MAX_STAMINA = 12 - ''' - -------------------- - ''' - - ''' - -------------------- - 恢复1格体力所需时间 - TODO - ''' - STAMINA_RECOVER_TICK = 1800000 - ''' - -------------------- - ''' - - ''' - -------------------- - 1个以太之滴增加的经验值 - TODO - ''' - CORE_EXP = 250 - ''' - -------------------- - ''' - - ''' - -------------------- - 使用实验性的 aggregate 接口 - TODO - ''' - USE_EXPERIMENTAL_AGGREGATE = True - ''' - -------------------- - ''' -