You've already forked KemoFureApi
							
							Compare commits
	
		
			1 Commits
		
	
	
		
			2b121be258
			...
			testBranch
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| dde3c27eb0 | 
							
								
								
									
										4
									
								
								app.py
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								app.py
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ from flask_restful import Api | ||||
|  | ||||
| from modules.KF3.database import Database as KF3DB | ||||
| from modules.Kingdom.database import Database as KFKDB | ||||
| from modules.Archive.database import Database as KFADB | ||||
| from modules.JapariSling.database import Database as KFSL | ||||
|  | ||||
| app = Flask(__name__) | ||||
| app.config['JSON_AS_ASCII'] = False | ||||
| @@ -13,7 +13,7 @@ api = Api(app) | ||||
|  | ||||
| KF3DB(api) | ||||
| KFKDB(api) | ||||
| KFADB(api) | ||||
| KFSL(api) | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     app.run(host='127.0.0.1', port=8080, debug=True) | ||||
| @@ -1,22 +0,0 @@ | ||||
| import json | ||||
| from .databaseController import DatabaseController | ||||
| from .endpoints.query import Archive_Query | ||||
|  | ||||
| class Database: | ||||
|     db : DatabaseController = None | ||||
|     processed_friends = {} | ||||
|     item_stages = {} | ||||
|  | ||||
|     def __init__(self, api) -> None: | ||||
|         app = api.app | ||||
|         if "Archive" in app.databases: | ||||
|             del app.databases["Archive"] | ||||
|  | ||||
|         self.reload_data() | ||||
|  | ||||
|         app.databases["Archive"] = self | ||||
|  | ||||
|         api.add_resource(Archive_Query, "/Archive/Query") | ||||
|    | ||||
|     def reload_data(self): | ||||
|         self.db = DatabaseController("/home/pi/python/Katbots/JapariArchive/database.db") | ||||
| @@ -1,21 +0,0 @@ | ||||
| import os | ||||
| import sqlite3 | ||||
|  | ||||
| TABLE_ACCOUNTS  = "accounts" | ||||
| TABLE_X         = "x_posts" | ||||
|  | ||||
| class DatabaseController: | ||||
|     def __init__(self, db_name): | ||||
|         self.conn = sqlite3.connect(db_name, isolation_level="DEFERRED") | ||||
|         self.cursor = self.conn.cursor() | ||||
|  | ||||
|     def run_query(self, query): | ||||
|         try: | ||||
|             self.cursor.execute(query) | ||||
|             results = self.cursor.fetchall() | ||||
|             return results | ||||
|         except: | ||||
|             return None | ||||
|  | ||||
|     def close(self): | ||||
|         self.conn.close() | ||||
| @@ -1,21 +0,0 @@ | ||||
| import json | ||||
| from flask_restful import Resource | ||||
| from flask import current_app as app, jsonify | ||||
|  | ||||
| class Archive_Query(Resource): | ||||
|     def post(self, query:str): | ||||
|         db = app.databases["Archive"] | ||||
|  | ||||
|         result = db.run_query(query) | ||||
|  | ||||
|         if result is None: | ||||
|             response = app.response_class(status=400) | ||||
|         else: | ||||
|             response = app.response_class( | ||||
|                 response=json.dumps(result, ensure_ascii=False, indent=1), | ||||
|                 status=200, | ||||
|                 mimetype='application/json' | ||||
|             ) | ||||
|  | ||||
|         response.headers.add("Access-Control-Allow-Origin", "*") | ||||
|         return response    | ||||
							
								
								
									
										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  | ||||
| @@ -82,7 +82,10 @@ async def download_cache(server_name, server : str): | ||||
|             file.write(data) | ||||
|         with open(file_path_json, "wt", encoding="utf-8") as out_file: | ||||
|             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] | ||||
|  | ||||
| @@ -93,6 +96,36 @@ async def download_cache(server_name, server : str): | ||||
|     await session.close() | ||||
|     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): | ||||
|     def parse_ab_list(filecontent : str): | ||||
|         out = {} | ||||
| @@ -194,6 +227,15 @@ async def convert_files(): | ||||
|             print("Conversion failed", f) | ||||
|  | ||||
| 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_files = {} | ||||
|      | ||||
|   | ||||
							
								
								
									
										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