parent
b38d94cf55
commit
42d1fdffc4
File diff suppressed because one or more lines are too long
@ -1,6 +1,13 @@
|
||||
from sanic import Blueprint
|
||||
|
||||
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