Compare commits

2 Commits

Author SHA1 Message Date
dde3c27eb0 uncommited changes 2024-12-26 16:02:30 +01:00
bfb19ab7c1 checkpoint 2024-07-08 12:54:18 +02:00
14 changed files with 186 additions and 22 deletions

2
app.py
View File

@@ -3,6 +3,7 @@ from flask_restful import Api
from modules.KF3.database import Database as KF3DB from modules.KF3.database import Database as KF3DB
from modules.Kingdom.database import Database as KFKDB from modules.Kingdom.database import Database as KFKDB
from modules.JapariSling.database import Database as KFSL
app = Flask(__name__) app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False app.config['JSON_AS_ASCII'] = False
@@ -12,6 +13,7 @@ api = Api(app)
KF3DB(api) KF3DB(api)
KFKDB(api) KFKDB(api)
KFSL(api)
if __name__ == '__main__': if __name__ == '__main__':
app.run(host='127.0.0.1', port=8080, debug=True) app.run(host='127.0.0.1', port=8080, debug=True)

View File

@@ -0,0 +1,7 @@
from typing import List
from .construct_serialized import ConstructSerialized
class ConstructLevel:
Name : str
Description : str
Objects : List[ConstructSerialized]

View File

@@ -0,0 +1,13 @@
class SVector3:
x : float
y : float
z : float
class ConstructSerialized:
Id : int
Variant : int
Position : SVector3
Rotation : SVector3
Width : float
Height : float
Properties : int

View File

@@ -0,0 +1,15 @@
from .endpoints.get import Get
from .endpoints.upload import Upload
class Database:
def __init__(self, api) -> None:
app = api.app
if "JapariSling" in app.databases:
del app.databases["JapariSling"]
app.databases["JapariSling"] = self
api.add_resource(Upload, "/JapariSling/Upload")
api.add_resource(Get, "/JapariSling/Get")

View File

@@ -0,0 +1,23 @@
import os
import json
from flask_restful import Resource
from flask import abort, request, current_app as app
class Get(Resource):
def get(self):
dir_name = os.path.join(app.root_path, 'data', 'JapariSling')
files = [json.loads(read_file(os.path.join(dir_name, f))) for f in os.listdir(dir_name) if os.path.isfile(os.path.join(dir_name, f))]
files = files[:10]
files = {"levels": files}
response = app.response_class(
response = json.dumps(files),
status=200,
mimetype='application/json'
)
response.headers.add("Access-Control-Allow-Origin", "*")
return response
def read_file(path):
with open(path, 'r') as f:
return f.read()

View File

@@ -0,0 +1,29 @@
import os
import json
from flask_restful import Resource
from ..classes.construct_level import ConstructLevel
from flask import abort, request, current_app as app
class Upload(Resource):
def post(self):
cl = request.content_length
if cl is not None and cl > 1024:
abort(413)
content = request.json
if "Name" not in content:
abort(400)
filename = os.path.join(app.root_path, 'data', 'JapariSling', content["Name"] + '.json')
with open(filename, "wt") as text_file:
text_file.write(json.dumps(content, ensure_ascii=False, indent=1))
response = app.response_class(
response="level uploaded",
status=200,
mimetype='text/plain'
)
response.headers.add("Access-Control-Allow-Origin", "*")
return response

View File

@@ -123,7 +123,7 @@ class Database:
chara = {} chara = {}
charaData = self.charaData[id] charaData = self.charaData[id]
alphaBase = self.paramAlphaBases[id] alphaBase = self.paramAlphaBases[id] if id in self.paramAlphaBases else None
wrLocked = False wrLocked = False
promoIds = [] promoIds = []
@@ -136,7 +136,8 @@ class Database:
else: else:
promoIds.append([promo["promoteId00"], promo["promoteId01"], promo["promoteId02"], promo["promoteId03"], promo["promoteId04"], promo["promoteId05"]]) promoIds.append([promo["promoteId00"], promo["promoteId01"], promo["promoteId02"], promo["promoteId03"], promo["promoteId04"], promo["promoteId05"]])
promoteDatas = [[self.promoteData[id] for id in promo] for promo in promoIds] emptyPromote = {"promoteAtk": 0, "promoteDef": 0, "promoteHp": 0, "promoteAvoid": 0, "promoteActionDamageRatio": 0, "promoteBeatDamageRatio": 0, "promoteTryDamageRatio": 0}
promoteDatas = [[(self.promoteData[id] if id in self.promoteData else emptyPromote) for id in promo] for promo in promoIds]
promote_bonus = {"atk" : 0, "def" : 0, "hp" : 0, "evd" : 0, "beat" : 0, "act" : 0, "try" : 0} promote_bonus = {"atk" : 0, "def" : 0, "hp" : 0, "evd" : 0, "beat" : 0, "act" : 0, "try" : 0}
for promoTier in promoteDatas: for promoTier in promoteDatas:
for promoteStep in promoTier: for promoteStep in promoTier:
@@ -189,6 +190,12 @@ class Database:
else: else:
level_curve = self.limitlevel_rising_status[patternId] if patternId != 0 else None level_curve = self.limitlevel_rising_status[patternId] if patternId != 0 else None
if alphaBase is None:
chara["stats_min"] = {"level" : 0,"status" : 0,"wr" : 0,"hp" : 0,"atk" : 0,"def" : 0,"evd" : 0,"beat" : 0,"act" : 0,"try" : 0}
chara["stats_max"] = {"level" : 0,"status" : 0,"wr" : 0,"hp" : 0,"atk" : 0,"def" : 0,"evd" : 0,"beat" : 0,"act" : 0,"try" : 0}
chara["plasmPoint"] = 0
chara["cards"] = {0,0,0,0,0}
else:
chara["stats_min"] = get_all_stats(chara, alphaBase, max_level = False, rising_status_pattern=level_curve) chara["stats_min"] = get_all_stats(chara, alphaBase, max_level = False, rising_status_pattern=level_curve)
chara["stats_max"] = get_all_stats(chara, alphaBase, max_level = True, rising_status_pattern=level_curve) chara["stats_max"] = get_all_stats(chara, alphaBase, max_level = True, rising_status_pattern=level_curve)
chara["plasmPoint"] = alphaBase["plasmPoint"] chara["plasmPoint"] = alphaBase["plasmPoint"]
@@ -199,6 +206,7 @@ class Database:
{"type":alphaBase["orderCardType03"], "value":alphaBase["orderCardValue03"]}, {"type":alphaBase["orderCardType03"], "value":alphaBase["orderCardValue03"]},
{"type":alphaBase["orderCardType04"], "value":alphaBase["orderCardValue04"]} {"type":alphaBase["orderCardType04"], "value":alphaBase["orderCardValue04"]}
] ]
chara["synergy_flag"] = self.paramArts[id]["authParam"]["SynergyFlag"] if id in self.paramArts else 0 chara["synergy_flag"] = self.paramArts[id]["authParam"]["SynergyFlag"] if id in self.paramArts else 0
chara["arts"] = self.paramArts[id] if id in self.paramArts else None chara["arts"] = self.paramArts[id] if id in self.paramArts else None

View File

@@ -82,7 +82,10 @@ async def download_cache(server_name, server : str):
file.write(data) file.write(data)
with open(file_path_json, "wt", encoding="utf-8") as out_file: with open(file_path_json, "wt", encoding="utf-8") as out_file:
data = gzip.decompress(data) data = gzip.decompress(data)
json.dump(json.loads(data), out_file, ensure_ascii=False, indent=1) data = json.loads(data)
# if key == "GACHA_DATA":
# download_banners(data, server_name)
json.dump(data, out_file, ensure_ascii=False, indent=1)
old_mst_ver[key] = new_mst_ver[key] old_mst_ver[key] = new_mst_ver[key]
@@ -93,6 +96,36 @@ async def download_cache(server_name, server : str):
await session.close() await session.close()
return downloaded_files return downloaded_files
async def download_banners(gacha_data, server_name, session):
path = f"/var/www/html/Katworks/KF/assets/KF3/{server_name}/banners/"
os.makedirs(path, exist_ok=True)
for entry in gacha_data:
banner_name = entry["banner"]
if banner_name == "" or banner_name == None:
continue
banner_name += ".png"
file_path = path + banner_name
if os.path.exists(file_path):
continue
file_url = "https://parade-mobile-prod-cdn.kemono-friends-3.jp/Texture2D/GachaTop/" + banner_name
file_url_alt = "https://parade-mobile-develop01-app.kemono-friends-3.jp/Texture2D/GachaTop/" + banner_name
status = 0
async with session.get(file_url) as resp:
response = await resp.read()
status = resp.status
if status != 200:
async with session.get(file_url_alt) as resp:
response = await resp.read()
status = resp.status
if status != 200: continue
with open(file_path, "wb") as file:
file.write(response)
async def download_files(server_name, asset_bundle_url, srv_platform : str): async def download_files(server_name, asset_bundle_url, srv_platform : str):
def parse_ab_list(filecontent : str): def parse_ab_list(filecontent : str):
out = {} out = {}
@@ -112,7 +145,7 @@ async def download_files(server_name, asset_bundle_url, srv_platform : str):
convert_path = f"/var/www/html/Katworks/KF/assets/KF3/WebGL/assets/" + file_name convert_path = f"/var/www/html/Katworks/KF/assets/KF3/WebGL/assets/" + file_name
extract_path = f"/var/www/html/Katworks/KF/assets/KF3/extracted/" extract_path = f"/var/www/html/Katworks/KF/assets/KF3/extracted/"
try: try:
convert(data, convert_path, enums.BuildTarget.WebGL, True) convert(data, convert_path, enums.BuildTarget.WebGL)
except: except:
with open(convert_path, "wb") as file: with open(convert_path, "wb") as file:
file.write(data) file.write(data)
@@ -173,7 +206,36 @@ async def download_files(server_name, asset_bundle_url, srv_platform : str):
await session.close() await session.close()
return files_to_download return files_to_download
async def convert_files():
directory = f"/var/www/html/Katworks/KF/assets/KF3/develop01/assets/Windows/"
with open("/var/www/html/Katworks/KF/assets/KF3/lastUpdate_dev_files.json", "rt", encoding="utf-8") as file:
files_to_convert = json.load(file)
for file_name in os.listdir(directory):
if file_name not in files_to_convert:
continue
f = os.path.join(directory, file_name)
if not os.path.isfile(f):
return
convert_path = f"/var/www/html/Katworks/KF/assets/KF3/WebGL/assets/" + file_name
try:
print(f)
convert(f, convert_path, enums.BuildTarget.WebGL)
except:
print("Conversion failed", f)
async def manual(): async def manual():
# session = aiohttp.ClientSession()
# path = f"/var/www/html/Katworks/KF/assets/KF3/{server_name}/cache/"
# await session.close()
# return
downloaded_cache = {} downloaded_cache = {}
downloaded_files = {} downloaded_files = {}
@@ -211,3 +273,4 @@ async def manual():
if __name__ == "__main__": if __name__ == "__main__":
asyncio.run(manual()) asyncio.run(manual())
#asyncio.run(convert_files())

View File

@@ -5,7 +5,7 @@ import json
class KF3_Friend(Resource): class KF3_Friend(Resource):
def get(self, id:int): def get(self, id:int):
from KF3.database import Database from ..database import Database
db : Database = app.databases["KF3"] db : Database = app.databases["KF3"]
if "wiki" in request.args: if "wiki" in request.args:

View File

@@ -5,7 +5,7 @@ from flask import request
class KF3_Friends(Resource): class KF3_Friends(Resource):
def get(self): def get(self):
from KF3.database import Database from ..database import Database
db : Database = app.databases["KF3"] db : Database = app.databases["KF3"]
result = [] result = []

View File

@@ -5,7 +5,7 @@ import json
class KF3_Item(Resource): class KF3_Item(Resource):
def get(self, id:int): def get(self, id:int):
from KF3.database import Database from ..database import Database
db : Database = app.databases["KF3"] db : Database = app.databases["KF3"]
result = db.get_item(id) result = db.get_item(id)

View File

@@ -4,12 +4,12 @@ from flask import current_app as app
class KF3_Items(Resource): class KF3_Items(Resource):
def get(self): def get(self):
from KF3.database import Database from ..database import Database
db : Database = app.databases["KF3"] db : Database = app.databases["KF3"]
result = [] result = []
for value in db.itemCommon.values(): for value in db.itemCommon.values():
result.append({"id": value["id"], "name": value["name"]}) result.append({"id": value["id"], "name": value["name"], "iconName" : value["iconName"], "flavorText" : value["flavorText"]})
response = app.response_class( response = app.response_class(
response=json.dumps(result, ensure_ascii=False, indent=1), response=json.dumps(result, ensure_ascii=False, indent=1),

2
run.sh Normal file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env bash
gunicorn --bind 127.0.0.1:8081 --config gunicorn_config.py wsgi:app

2
update.sh Normal file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env bash
python -m modules.KF3.downloader