parent
b38d94cf55
commit
42d1fdffc4
File diff suppressed because one or more lines are too long
@ -1,6 +1,13 @@
|
|||||||
from sanic import Blueprint
|
from sanic import Blueprint
|
||||||
|
|
||||||
from .login import bp_sif_login
|
from .login import bp_sif_login
|
||||||
|
from .user import bp_sif_user
|
||||||
|
from .misc import bp_sif_misc
|
||||||
|
from .download import bp_sif_download
|
||||||
|
|
||||||
bp_sif = Blueprint.group(bp_sif_login, url_prefix="main.php")
|
bp_sif = Blueprint.group(bp_sif_login,
|
||||||
|
bp_sif_user,
|
||||||
|
bp_sif_misc,
|
||||||
|
bp_sif_download,
|
||||||
|
url_prefix="main.php")
|
||||||
|
|
||||||
|
@ -0,0 +1,57 @@
|
|||||||
|
from sanic import Sanic, json, SanicException
|
||||||
|
from sanic.log import logger
|
||||||
|
|
||||||
|
from decorator import decorator
|
||||||
|
import json as jsonlib
|
||||||
|
import urllib.parse
|
||||||
|
|
||||||
|
from utils.crypto import base64_encode
|
||||||
|
from utils.crypto import get_rsa_privkey, rsa_sha1_sign
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@decorator
|
||||||
|
def check_token(f, *args, **kw):
|
||||||
|
request = args[0]
|
||||||
|
user_id = request.headers["user-id"]
|
||||||
|
request.ctx.user_id = user_id
|
||||||
|
authorize = dict(urllib.parse.parse_qsl(request.headers["authorize"]))
|
||||||
|
token = authorize["token"]
|
||||||
|
logger.debug(f"{request.path=} {user_id=} {token=}")
|
||||||
|
return f(*args, **kw)
|
||||||
|
if token != Sanic.get_app().ctx.auth_token[user_id]:
|
||||||
|
raise SanicException("Auth failed", status_code=403)
|
||||||
|
return f(*args, **kw)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@decorator
|
||||||
|
def parse_data(f, *args, **kw):
|
||||||
|
request = args[0]
|
||||||
|
request_data = jsonlib.loads(request.form.get("request_data", "")) # type: ignore
|
||||||
|
logger.debug(f"{request.path=} {request_data=}")
|
||||||
|
request.ctx.request_data = request_data
|
||||||
|
return f(*args, **kw)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@decorator
|
||||||
|
async def pack_resp(f, *args, **kw):
|
||||||
|
request = args[0]
|
||||||
|
ret = await f(*args, **kw)
|
||||||
|
data = {
|
||||||
|
"response_data": ret,
|
||||||
|
"release_info": {},
|
||||||
|
"status_code": 200
|
||||||
|
}
|
||||||
|
x_message_sign = base64_encode(
|
||||||
|
rsa_sha1_sign(jsonlib.dumps(data).encode(), get_rsa_privkey()))
|
||||||
|
logger.debug(f"{request.path=} {data=} {x_message_sign=}")
|
||||||
|
return json(data, headers={
|
||||||
|
"X-Message-Sign": x_message_sign,
|
||||||
|
"Server-Version": Sanic.get_app().config["PACKAGE_VERSION"]
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def common_api(f):
|
||||||
|
return check_token(parse_data(pack_resp(f)))
|
@ -0,0 +1,84 @@
|
|||||||
|
from sanic import Sanic, Blueprint, Request
|
||||||
|
from sanic.log import logger
|
||||||
|
|
||||||
|
from .common import common_api
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bp_sif_download = Blueprint("sif_download", url_prefix="download")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_download.route("additional", methods=["POST"])
|
||||||
|
@common_api
|
||||||
|
async def additional(request: Request):
|
||||||
|
request_data = request.ctx.request_data
|
||||||
|
static_root = Sanic.get_app().config["STATIC_ROOT"]
|
||||||
|
package_type = request_data.get("package_type", 0)
|
||||||
|
package_id = request_data.get("package_id", 0)
|
||||||
|
target_os = request_data.get("target_os", "")
|
||||||
|
|
||||||
|
download_resp = []
|
||||||
|
package_list = Sanic.get_app().ctx.assets_list[target_os][package_type][package_id]
|
||||||
|
static_root = Sanic.get_app().config["STATIC_ROOT"]
|
||||||
|
for package_order, package_size in package_list:
|
||||||
|
download_resp.append({
|
||||||
|
"size": package_size,
|
||||||
|
"url": f"{static_root}/{target_os}/{package_type}_{package_id}_{package_order}.zip"
|
||||||
|
})
|
||||||
|
|
||||||
|
return download_resp
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_download.route("batch", methods=["POST"])
|
||||||
|
@common_api
|
||||||
|
async def batch(request: Request):
|
||||||
|
request_data = request.ctx.request_data
|
||||||
|
static_root = Sanic.get_app().config["STATIC_ROOT"]
|
||||||
|
|
||||||
|
download_resp = []
|
||||||
|
if request_data.get("client_version", "") == Sanic.get_app().config["PACKAGE_VERSION"]: # 97.4.6
|
||||||
|
package_type = request_data.get("package_type", 0)
|
||||||
|
excluded_package_ids = request_data.get("excluded_package_ids", [])
|
||||||
|
os = request_data.get("os", "")
|
||||||
|
package_dict = Sanic.get_app().ctx.assets_list[os][package_type]
|
||||||
|
for package_id, package_order_list in package_dict.items():
|
||||||
|
if package_id in excluded_package_ids: continue
|
||||||
|
package_order_list.sort(key=lambda x: x[0])
|
||||||
|
for package_order, package_size in package_order_list:
|
||||||
|
download_resp.append({
|
||||||
|
"size": package_size,
|
||||||
|
"url": f"{static_root}/{os}/{package_type}_{package_id}_{package_order}.zip"
|
||||||
|
})
|
||||||
|
return download_resp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_download.route("update", methods=["POST"])
|
||||||
|
@common_api
|
||||||
|
async def update(request: Request):
|
||||||
|
request_data = request.ctx.request_data
|
||||||
|
static_root = Sanic.get_app().config["STATIC_ROOT"]
|
||||||
|
version = Sanic.get_app().config["PACKAGE_VERSION"]
|
||||||
|
target_os = request_data.get("target_os", "")
|
||||||
|
|
||||||
|
download_resp = []
|
||||||
|
if request_data.get("external_version", "") != version: # 97.4.6
|
||||||
|
package_type = 99
|
||||||
|
package_dict = Sanic.get_app().ctx.assets_list[target_os][package_type]
|
||||||
|
for package_id, package_order_list in package_dict.items():
|
||||||
|
package_order_list.sort(key=lambda x: x[0])
|
||||||
|
for package_order, package_size in package_order_list:
|
||||||
|
download_resp.append({
|
||||||
|
"size": package_size,
|
||||||
|
"url": f"{static_root}/{target_os}/{package_type}_{package_id}_{package_order}.zip",
|
||||||
|
"version": version
|
||||||
|
})
|
||||||
|
return download_resp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_download.route("event", methods=["POST"])
|
||||||
|
@common_api
|
||||||
|
async def event(request: Request):
|
||||||
|
return []
|
@ -0,0 +1,90 @@
|
|||||||
|
from sanic import Blueprint, Request
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
|
from .common import common_api
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bp_sif_misc = Blueprint("sif_misc")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_misc.route("/gdpr/get", methods=["POST"])
|
||||||
|
@common_api
|
||||||
|
async def gdpr_get(request: Request):
|
||||||
|
gdpr_resp = {
|
||||||
|
"enable_gdpr": True,
|
||||||
|
"is_eea": False,
|
||||||
|
"server_timestamp": int(time.time())
|
||||||
|
}
|
||||||
|
return gdpr_resp
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_misc.route("/lbonus/execute", methods=["POST"])
|
||||||
|
@common_api
|
||||||
|
async def lbonus_execute(request: Request):
|
||||||
|
lbdays = {
|
||||||
|
"day": 0,
|
||||||
|
"day_of_the_week": 1,
|
||||||
|
"special_day": False,
|
||||||
|
"special_image_asset": "",
|
||||||
|
"received": False,
|
||||||
|
"ad_received": False,
|
||||||
|
"item": {
|
||||||
|
"item_id": 0,
|
||||||
|
"add_type": 0,
|
||||||
|
"amount": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lbonus_resp = {
|
||||||
|
"sheets": [],
|
||||||
|
"calendar_info": {
|
||||||
|
"current_date": "2006-01-02 03:04:05",
|
||||||
|
"current_month": {
|
||||||
|
"year": 0,
|
||||||
|
"month": 0,
|
||||||
|
"days": [lbdays]
|
||||||
|
},
|
||||||
|
"next_month": {
|
||||||
|
"year": 0,
|
||||||
|
"month": 0,
|
||||||
|
"days": [lbdays]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"total_login_info": {
|
||||||
|
"login_count": 100,
|
||||||
|
"remaining_count": 100,
|
||||||
|
"reward": {
|
||||||
|
"item_id": 5,
|
||||||
|
"add_type": 1000,
|
||||||
|
"amount": 5,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"license_lbonus_list": [],
|
||||||
|
"class_system": {
|
||||||
|
"rank_info": {
|
||||||
|
"before_class_rank_id": 10,
|
||||||
|
"after_class_rank_id": 10,
|
||||||
|
"rank_up_date": "2020-02-12 11:57:15",
|
||||||
|
},
|
||||||
|
"complete_flag": False,
|
||||||
|
"is_opened": True,
|
||||||
|
"is_visible": True,
|
||||||
|
},
|
||||||
|
"start_dash_sheets": [],
|
||||||
|
"effort_point": {
|
||||||
|
"live_effort_point_box_spec_id": 0,
|
||||||
|
"capacity": 0,
|
||||||
|
"before": 0,
|
||||||
|
"after": 0,
|
||||||
|
"rewards": 0,
|
||||||
|
},
|
||||||
|
"limited_effort_box": [],
|
||||||
|
"museum_info": {},
|
||||||
|
"server_timestamp": int(time.time()),
|
||||||
|
"present_cnt": 0,
|
||||||
|
}
|
||||||
|
return lbonus_resp
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
from sanic import Blueprint, Request
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
|
from .common import common_api
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bp_sif_user = Blueprint("sif_user", url_prefix="user")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_user.route("userInfo", methods=["POST"])
|
||||||
|
@common_api
|
||||||
|
async def userinfo(request: Request):
|
||||||
|
userinfo_resp = {
|
||||||
|
"user": {
|
||||||
|
"user_id": request.ctx.user_id,
|
||||||
|
"name": "wlt233",
|
||||||
|
"level": 100,
|
||||||
|
"exp": 100,
|
||||||
|
"previous_exp": 0,
|
||||||
|
"next_exp": 100,
|
||||||
|
"game_coin": 0,
|
||||||
|
"sns_coin": 0,
|
||||||
|
"free_sns_coin": 0,
|
||||||
|
"paid_sns_coin": 0,
|
||||||
|
"social_point": 0,
|
||||||
|
"unit_max": 100,
|
||||||
|
"waiting_unit_max": 100,
|
||||||
|
"energy_max": 100,
|
||||||
|
"energy_full_time": "2023-03-20 03:58:55",
|
||||||
|
"license_live_energy_recoverly_time": 100,
|
||||||
|
"energy_full_need_time": 0,
|
||||||
|
"over_max_energy": 0,
|
||||||
|
"training_energy": 100,
|
||||||
|
"training_energy_max": 0,
|
||||||
|
"friend_max": 100,
|
||||||
|
"invite_code": "",
|
||||||
|
"insert_date": "2023-03-20 03:58:55",
|
||||||
|
"update_date": "2023-03-20 03:58:55",
|
||||||
|
"tutorial_state": -1,
|
||||||
|
"diamond_coin": 0,
|
||||||
|
"crystal_coin": 0,
|
||||||
|
"lp_recovery_item": []
|
||||||
|
},
|
||||||
|
"birth": {
|
||||||
|
"birth_month": 1,
|
||||||
|
"birth_day": 1
|
||||||
|
},
|
||||||
|
"server_timestamp": int(time.time())
|
||||||
|
}
|
||||||
|
return userinfo_resp
|
@ -0,0 +1,59 @@
|
|||||||
|
from sanic import Sanic
|
||||||
|
from sanic.log import logger
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
from collections import defaultdict
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
def load_assets():
|
||||||
|
config = Sanic.get_app().config
|
||||||
|
|
||||||
|
if config["ASSETS_LIST_PATH"] and os.path.exists(config["ASSETS_LIST_PATH"]):
|
||||||
|
with open(config["ASSETS_LIST_PATH"], "r") as f:
|
||||||
|
assets_list = json.load(f,
|
||||||
|
object_hook=lambda d: {int(k) if k.lstrip('-').isdigit() else k: v for k, v in d.items()})
|
||||||
|
logger.info(f"Loaded packages list from {config['ASSETS_LIST_PATH']}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
assets_list = { "Android": {}, "iOS": {} }
|
||||||
|
for i in [0, 1, 2, 3, 4, 5, 6, 99]:
|
||||||
|
assets_list["Android"][i] = defaultdict(list)
|
||||||
|
assets_list["iOS"][i] = defaultdict(list)
|
||||||
|
|
||||||
|
android_i = 0
|
||||||
|
if config["ASSETS_PATH_ANDROID"]:
|
||||||
|
for r, d, fs in os.walk(config["ASSETS_PATH_ANDROID"]):
|
||||||
|
for f in fs:
|
||||||
|
if f.endswith(".zip"):
|
||||||
|
package_type, package_id, package_order = [int(i) for i in f.replace(".zip", "").split("_")]
|
||||||
|
package_size = os.stat(os.path.join(r, f)).st_size
|
||||||
|
assets_list["Android"][package_type][package_id].append((package_order, package_size))
|
||||||
|
android_i += 1
|
||||||
|
logger.info(f"Loaded {android_i} Android packages from {config['ASSETS_PATH_ANDROID']}")
|
||||||
|
|
||||||
|
ios_i = 0
|
||||||
|
if config["ASSETS_PATH_IOS"]:
|
||||||
|
for r, d, fs in os.walk(config["ASSETS_PATH_IOS"]):
|
||||||
|
for f in fs:
|
||||||
|
if f.endswith(".zip"):
|
||||||
|
package_type, package_id, package_order = [int(i) for i in f.replace(".zip", "").split("_")]
|
||||||
|
package_size = os.stat(os.path.join(r, f)).st_size
|
||||||
|
assets_list["iOS"][package_type][package_id].append((package_order, package_size))
|
||||||
|
ios_i += 1
|
||||||
|
logger.info(f"Loaded {ios_i} iOS packages from {config['ASSETS_PATH_IOS']}")
|
||||||
|
|
||||||
|
if not os.path.exists("data"): os.makedirs("data")
|
||||||
|
with open("data/assets_list.json", "w") as f:
|
||||||
|
json.dump(assets_list, f)
|
||||||
|
|
||||||
|
Sanic.get_app().ctx.assets_list = assets_list
|
||||||
|
|
||||||
|
|
||||||
|
if config["ASSETS_PATH_ANDROID"]:
|
||||||
|
Sanic.get_app().static("/Android", config["ASSETS_PATH_ANDROID"])
|
||||||
|
logger.info(f"Hosted {config['ASSETS_PATH_ANDROID']} to {config['STATIC_ROOT']}/Android")
|
||||||
|
if config["ASSETS_PATH_IOS"]:
|
||||||
|
Sanic.get_app().static("/iOS", config["ASSETS_PATH_IOS"])
|
||||||
|
logger.info(f"Hosted {config['ASSETS_PATH_IOS']} to {config['STATIC_ROOT']}/iOS")
|
||||||
|
|
Loading…
Reference in new issue