You've already forked KemoFureApi
Compare commits
2 Commits
b6862eb429
...
testBranch
| Author | SHA1 | Date | |
|---|---|---|---|
| dde3c27eb0 | |||
| bfb19ab7c1 |
2
app.py
2
app.py
@@ -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)
|
||||||
7
modules/JapariSling/classes/construct_level.py
Normal file
7
modules/JapariSling/classes/construct_level.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
from typing import List
|
||||||
|
from .construct_serialized import ConstructSerialized
|
||||||
|
|
||||||
|
class ConstructLevel:
|
||||||
|
Name : str
|
||||||
|
Description : str
|
||||||
|
Objects : List[ConstructSerialized]
|
||||||
13
modules/JapariSling/classes/construct_serialized.py
Normal file
13
modules/JapariSling/classes/construct_serialized.py
Normal 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
|
||||||
15
modules/JapariSling/database.py
Normal file
15
modules/JapariSling/database.py
Normal 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")
|
||||||
23
modules/JapariSling/endpoints/get.py
Normal file
23
modules/JapariSling/endpoints/get.py
Normal 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()
|
||||||
29
modules/JapariSling/endpoints/upload.py
Normal file
29
modules/JapariSling/endpoints/upload.py
Normal 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
|
||||||
@@ -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,16 +190,23 @@ 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
|
||||||
|
|
||||||
chara["stats_min"] = get_all_stats(chara, alphaBase, max_level = False, rising_status_pattern=level_curve)
|
if alphaBase is None:
|
||||||
chara["stats_max"] = get_all_stats(chara, alphaBase, max_level = True, rising_status_pattern=level_curve)
|
chara["stats_min"] = {"level" : 0,"status" : 0,"wr" : 0,"hp" : 0,"atk" : 0,"def" : 0,"evd" : 0,"beat" : 0,"act" : 0,"try" : 0}
|
||||||
chara["plasmPoint"] = alphaBase["plasmPoint"]
|
chara["stats_max"] = {"level" : 0,"status" : 0,"wr" : 0,"hp" : 0,"atk" : 0,"def" : 0,"evd" : 0,"beat" : 0,"act" : 0,"try" : 0}
|
||||||
chara["cards"] = [
|
chara["plasmPoint"] = 0
|
||||||
{"type":alphaBase["orderCardType00"], "value":alphaBase["orderCardValue00"]},
|
chara["cards"] = {0,0,0,0,0}
|
||||||
{"type":alphaBase["orderCardType01"], "value":alphaBase["orderCardValue01"]},
|
else:
|
||||||
{"type":alphaBase["orderCardType02"], "value":alphaBase["orderCardValue02"]},
|
chara["stats_min"] = get_all_stats(chara, alphaBase, max_level = False, rising_status_pattern=level_curve)
|
||||||
{"type":alphaBase["orderCardType03"], "value":alphaBase["orderCardValue03"]},
|
chara["stats_max"] = get_all_stats(chara, alphaBase, max_level = True, rising_status_pattern=level_curve)
|
||||||
{"type":alphaBase["orderCardType04"], "value":alphaBase["orderCardValue04"]}
|
chara["plasmPoint"] = alphaBase["plasmPoint"]
|
||||||
]
|
chara["cards"] = [
|
||||||
|
{"type":alphaBase["orderCardType00"], "value":alphaBase["orderCardValue00"]},
|
||||||
|
{"type":alphaBase["orderCardType01"], "value":alphaBase["orderCardValue01"]},
|
||||||
|
{"type":alphaBase["orderCardType02"], "value":alphaBase["orderCardValue02"]},
|
||||||
|
{"type":alphaBase["orderCardType03"], "value":alphaBase["orderCardValue03"]},
|
||||||
|
{"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
|
||||||
|
|||||||
@@ -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 = {}
|
||||||
|
|
||||||
@@ -210,4 +272,5 @@ async def manual():
|
|||||||
json.dump(downloaded_files, file, ensure_ascii=False, indent=1)
|
json.dump(downloaded_files, file, ensure_ascii=False, indent=1)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
asyncio.run(manual())
|
asyncio.run(manual())
|
||||||
|
#asyncio.run(convert_files())
|
||||||
@@ -5,9 +5,9 @@ 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:
|
||||||
result = db.get_chara_wiki(id)
|
result = db.get_chara_wiki(id)
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ 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 = []
|
||||||
for value in db.processed_friends.values():
|
for value in db.processed_friends.values():
|
||||||
result.append({"id": value["id"], "name": value["nameEn"], "startTime" : value["startTime"], "startTimeRaw" : value["startTimeRaw"]})
|
result.append({"id": value["id"], "name": value["nameEn"], "startTime" : value["startTime"], "startTimeRaw" : value["startTimeRaw"]})
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
2
run.sh
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
gunicorn --bind 127.0.0.1:8081 --config gunicorn_config.py wsgi:app
|
||||||
Reference in New Issue
Block a user