Merge pull request #35 from Young-Lord/master

加入aggregate
This commit is contained in:
Lost-MSth
2022-01-24 21:28:44 +08:00
committed by GitHub
6 changed files with 159 additions and 39 deletions

4
.gitignore vendored
View File

@@ -1 +1,5 @@
*.log *.log
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

View File

@@ -1,6 +1,6 @@
# encoding: utf-8 # 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 logging.config import dictConfig
from setting import Config from setting import Config
import base64 import base64
@@ -23,6 +23,10 @@ import sys
from multiprocessing import Process, Pipe from multiprocessing import Process, Pipe
from urllib.parse import parse_qs, urlparse
from werkzeug.datastructures import ImmutableMultiDict
app = Flask(__name__) app = Flask(__name__)
wsgi_app = app.wsgi_app wsgi_app = app.wsgi_app
@@ -36,6 +40,14 @@ app.register_blueprint(api.api_main.bp)
conn1, conn2 = Pipe() 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): def add_url_prefix(url, strange_flag=False):
# 给url加前缀返回字符串 # 给url加前缀返回字符串
@@ -122,10 +134,16 @@ def error_return(error_code, extra={}): # 错误返回
}) })
def success_return(value):
return jsonify({
"success": True,
"value": value
})
@app.route('/') @app.route('/')
def hello(): def hello():
return "Hello World!" return "Hello World!"
# 自定义路径
@app.route('/favicon.ico', methods=['GET']) # 图标 @app.route('/favicon.ico', methods=['GET']) # 图标
@@ -191,25 +209,83 @@ def register():
return error_return(error_code) return error_return(error_code)
# 集成式请求,没想到什么好办法处理,就先这样写着 @app.route(add_url_prefix('/purchase/bundle/pack'), methods=['GET']) # 曲包信息
@app.route(add_url_prefix('/compose/aggregate'), methods=['GET'])
@server.auth.auth_required(request) @server.auth.auth_required(request)
def aggregate(user_id): def bundle_pack(user_id):
calls = request.args.get('calls') return success_return(server.info.get_purchase_pack(user_id))
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']) # 用户信息给baa查分器用的 @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']) # 用户奖励信息
@server.auth.auth_required(request)
def present_info(user_id):
return success_return(server.info.get_user_present(user_id))
@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_
return jsonify(finally_response)
finally_response['value'].append(
{'id': i.get('id'), 'value': resp['value'] if hasattr(resp, 'get') else resp})
#request = request_
return jsonify(finally_response)
except KeyError:
return error_return(108)
# # 集成式请求,没想到什么好办法处理,就先这样写着
# @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) @server.auth.auth_required(request)
def user_me(user_id): def user_me(user_id):
r = server.info.arc_aggregate_small(user_id) r = server.info.get_user_me_c(user_id)
if r['success']: if r:
r['value'] = r['value'][0]['value'] return success_return(r)
return jsonify(r) else:
return error_return(108)
@app.route(add_url_prefix('/user/me/character'), methods=['POST']) # 角色切换 @app.route(add_url_prefix('/user/me/character'), methods=['POST']) # 角色切换
@@ -614,10 +690,11 @@ def world_one(user_id, map_id):
@server.auth.auth_required(request) @server.auth.auth_required(request)
def download_song(user_id): def download_song(user_id):
song_ids = request.args.getlist('sid') song_ids = request.args.getlist('sid')
if server.arcdownload.is_able_download(user_id): url_flag = json.loads(request.args.get('url', 'true'))
if server.arcdownload.is_able_download(user_id) or not url_flag:
re = {} re = {}
if not song_ids: if not song_ids:
re = server.arcdownload.get_all_songs(user_id) re = server.arcdownload.get_all_songs(user_id, url_flag=url_flag)
else: else:
re = server.arcdownload.get_some_songs(user_id, song_ids) re = server.arcdownload.get_some_songs(user_id, song_ids)
@@ -723,9 +800,11 @@ def sys_set(user_id, path):
set_arg = path[5:] set_arg = path[5:]
value = request.form['value'] value = request.form['value']
server.setme.arc_sys_set(user_id, value, set_arg) server.setme.arc_sys_set(user_id, value, set_arg)
r = server.info.arc_aggregate_small(user_id) r = server.info.get_user_me_c(user_id)
r['value'] = r['value'][0]['value'] if r:
return jsonify(r) return success_return(r)
else:
return error_return(108)
def main(): def main():

View File

@@ -1,5 +1,6 @@
import json import json
from server.sql import Connect from server.sql import Connect
from .config import Constant
from setting import Config from setting import Config
import server.item import server.item
import server.character import server.character
@@ -26,14 +27,14 @@ def int2b(x):
def calc_stamina(max_stamina_ts, curr_stamina): def calc_stamina(max_stamina_ts, curr_stamina):
# 计算体力,返回剩余体力数值 # 计算体力,返回剩余体力数值
stamina = int(server.info.MAX_STAMINA - (max_stamina_ts - stamina = int(Constant.MAX_STAMINA - (max_stamina_ts -
int(time.time()*1000)) / server.info.STAMINA_RECOVER_TICK) int(time.time()*1000)) / Constant.STAMINA_RECOVER_TICK)
if stamina >= server.info.MAX_STAMINA: if stamina >= Constant.MAX_STAMINA:
if curr_stamina >= server.info.MAX_STAMINA: if curr_stamina >= Constant.MAX_STAMINA:
stamina = curr_stamina stamina = curr_stamina
else: else:
stamina = server.info.MAX_STAMINA stamina = Constant.MAX_STAMINA
if stamina < 0: if stamina < 0:
stamina = 0 stamina = 0
@@ -245,8 +246,8 @@ def play_world_song(user_id, args):
return {} return {}
stamina = calc_stamina(max_stamina_ts, stamina) - \ stamina = calc_stamina(max_stamina_ts, stamina) - \
info['stamina_cost'] * stamina_multiply info['stamina_cost'] * stamina_multiply
max_stamina_ts = now + server.info.STAMINA_RECOVER_TICK * \ max_stamina_ts = now + Constant.STAMINA_RECOVER_TICK * \
(server.info.MAX_STAMINA - stamina) (Constant.MAX_STAMINA - stamina)
c.execute('''update user set max_stamina_ts=?, stamina=? where user_id=?''', c.execute('''update user set max_stamina_ts=?, stamina=? where user_id=?''',
(max_stamina_ts, stamina, user_id)) (max_stamina_ts, stamina, user_id))
r = { 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: if x and x[0] is not None and x[1] is not None:
stamina = calc_stamina(x[0], x[1]) + add_stamina stamina = calc_stamina(x[0], x[1]) + add_stamina
max_stamina_ts = now - \ max_stamina_ts = now - \
(stamina-server.info.MAX_STAMINA) * \ (stamina-Constant.MAX_STAMINA) * \
server.info.STAMINA_RECOVER_TICK Constant.STAMINA_RECOVER_TICK
else: else:
max_stamina_ts = now max_stamina_ts = now
stamina = server.info.MAX_STAMINA stamina = Constant.MAX_STAMINA
c.execute('''update user set max_stamina_ts=?, stamina=? where user_id=?''', c.execute('''update user set max_stamina_ts=?, stamina=? where user_id=?''',
(max_stamina_ts, stamina, user_id)) (max_stamina_ts, stamina, user_id))

View File

@@ -213,7 +213,7 @@ def char_use_core(user_id, character_id, amount):
x = c.fetchone() x = c.fetchone()
if x: if x:
exp, level = calc_level_up( exp, level = calc_level_up(
c, user_id, character_id, x[0], amount*server.info.CORE_EXP) c, user_id, character_id, x[0], amount*Config.CORE_EXP)
c.execute('''update user_char set level=?, exp=? where user_id=? and character_id=?''', c.execute('''update user_char set level=?, exp=? where user_id=? and character_id=?''',
(level, exp, user_id, character_id)) (level, exp, user_id, character_id))
server.item.claim_user_item( server.item.claim_user_item(

View File

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

View File

@@ -6,10 +6,7 @@ import server.character
import server.item import server.item
import time import time
from setting import Config from setting import Config
from .config import Constant
MAX_STAMINA = 12
STAMINA_RECOVER_TICK = 1800000
CORE_EXP = 250
def int2b(x): def int2b(x):
@@ -202,6 +199,38 @@ def get_user_me(c, user_id):
return r 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): def arc_aggregate_small(user_id):
# 返回用户数据 # 返回用户数据
r = {"success": False} r = {"success": False}
@@ -239,9 +268,9 @@ def arc_aggregate_big(user_id):
}, { }, {
"id": 3, "id": 3,
"value": { "value": {
"max_stamina": MAX_STAMINA, "max_stamina": Constant.MAX_STAMINA,
"stamina_recover_tick": STAMINA_RECOVER_TICK, "stamina_recover_tick": Constant.STAMINA_RECOVER_TICK,
"core_exp": CORE_EXP, "core_exp": Constant.CORE_EXP,
"curr_ts": int(time.time()*1000), "curr_ts": int(time.time()*1000),
"level_steps": server.character.get_level_steps(), "level_steps": server.character.get_level_steps(),
"world_ranking_enabled": True, "world_ranking_enabled": True,