Change something about aggregate

This commit is contained in:
Lost-MSth
2022-01-24 21:22:38 +08:00
parent 34497d0638
commit 32bcbb0ccd
5 changed files with 138 additions and 131 deletions

View File

@@ -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():

View File

@@ -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))

View File

@@ -0,0 +1,7 @@
class Constant:
MAX_STAMINA = 12
STAMINA_RECOVER_TICK = 1800000
CORE_EXP = 250

View File

@@ -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,

View File

@@ -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
'''
--------------------
'''