add web
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, jsonify, make_response
|
||||
from app.models.fflag_group import FflagGroup
|
||||
from app.models.fflag_value import FflagValue
|
||||
from app.models.gameservers import GameServer
|
||||
from app.extensions import redis_controller, get_remote_address
|
||||
import json
|
||||
import base64
|
||||
import os
|
||||
import requests
|
||||
|
||||
FFlagRoute = Blueprint("fflag", __name__, url_prefix="/")
|
||||
|
||||
def ClearCache( GroupId : int ):
|
||||
redis_controller.delete("fflags_" + str(GroupId))
|
||||
GenerateFFlags(GroupId, True)
|
||||
|
||||
def GenerateFFlags( GroupId : int, BypassCache : bool = False ) -> dict:
|
||||
if not BypassCache:
|
||||
CachedFFlags = redis_controller.get("fflags_" + str(GroupId))
|
||||
if CachedFFlags is not None:
|
||||
return json.loads(CachedFFlags)
|
||||
|
||||
FFlagValues = FflagValue.query.filter_by(group_id=GroupId).all()
|
||||
if FFlagValues is None:
|
||||
return jsonify({}),200
|
||||
|
||||
FinalData = {}
|
||||
for FFlagValue in FFlagValues:
|
||||
FinalData[FFlagValue.name] = str(base64.b64decode(FFlagValue.flag_value).decode('utf-8'))
|
||||
|
||||
redis_controller.set("fflags_" + str(GroupId), json.dumps(FinalData), ex = 60 * 60)
|
||||
return FinalData
|
||||
|
||||
@FFlagRoute.route("/Setting/QuietGet/<group>", methods=["GET"])
|
||||
@FFlagRoute.route("/Setting/QuietGet/<group>/", methods=["GET"])
|
||||
@FFlagRoute.route("/Setting/Get/<group>/", methods=["GET"])
|
||||
def get_fflag(group):
|
||||
api_key = request.headers.get('apiKey') or request.args.get('apiKey')
|
||||
|
||||
json_file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'files')
|
||||
|
||||
if api_key == "D6925E56-BFB9-4908-AAA2-A5B1EC4B2D78":
|
||||
json_file_path = os.path.join(json_file_path, 'Client18Setting.json')
|
||||
return get_json_response(json_file_path)
|
||||
|
||||
if group in ["RCCServiceaRWyf4zz9jy", "ClientAppSettings", "RCCServiceS2kvmA2lVpz4g9qlbDw1"]:
|
||||
json_file_path = os.path.join(json_file_path, f'{group}.json')
|
||||
return get_json_response(json_file_path)
|
||||
elif group in ["Client2014Setting", "Client2014SharedConf"]:
|
||||
json_file_path = os.path.join(json_file_path, 'Client2014SharedConf.json')
|
||||
return get_json_response(json_file_path)
|
||||
else:
|
||||
return 'Invalid request', 400
|
||||
|
||||
def get_json_response(file_path):
|
||||
try:
|
||||
with open(file_path, 'r') as file:
|
||||
json_data = json.load(file)
|
||||
return jsonify(json_data), 200
|
||||
except FileNotFoundError:
|
||||
return 'File not found', 404
|
||||
except json.JSONDecodeError:
|
||||
return 'Invalid JSON file', 500
|
||||
|
||||
@FFlagRoute.route("/v1/settings/application", methods=["GET"])
|
||||
def fflag_application():
|
||||
application_name = request.args.get("applicationName")
|
||||
if not application_name:
|
||||
return jsonify({"error": "Missing 'applicationName' query parameter"}), 400
|
||||
|
||||
base_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'files')
|
||||
|
||||
file_mapping = {
|
||||
"PCDesktopClient": os.path.join(base_path, 'PCDesktopClient.json'),
|
||||
"GD5Z5gO1n0gYX1P": os.path.join(base_path, 'PCDesktopClient.json'),
|
||||
"6sxp8X2Y02aRWyf4zz9jy": os.path.join(base_path, '2020RCCService.json'),
|
||||
"6sxp8X2Y02SecureR": os.path.join(base_path, '2020RCCService.json'),
|
||||
"S2kvmA2lVpz4g9qlbDw1": os.path.join(base_path, '2020RCCService.json'),
|
||||
"RCCServiceaRWyf4zz9jy": os.path.join(base_path, '2020RCCService.json')
|
||||
}
|
||||
# 2020 rcc fix
|
||||
request_host = request.headers.get('Host', '')
|
||||
if request_host.startswith("clientsettingzcdn."):
|
||||
json_file_path = os.path.join(base_path, 'classicrcc.json')
|
||||
else:
|
||||
json_file_path = file_mapping.get(application_name)
|
||||
|
||||
#json_file_path = file_mapping.get(application_name)
|
||||
if not json_file_path:
|
||||
#os.path.join(base_path, '2020RCCService.json'),
|
||||
return jsonify({"error": f"No configuration found forr '{application_name}'"}), 404
|
||||
|
||||
if not os.path.exists(json_file_path):
|
||||
return jsonify({"error": "Configuration file not found"}), 404
|
||||
|
||||
try:
|
||||
with open(json_file_path, 'r') as json_file:
|
||||
json_data = json.load(json_file)
|
||||
return jsonify(json_data)
|
||||
except (json.JSONDecodeError, IOError) as e:
|
||||
return jsonify({"error": "Failed to read or parse JSON file", "details": str(e)}), 500
|
||||
|
||||
@FFlagRoute.route("/v2/settings/application/<application_name>", methods=["GET"])
|
||||
def fflag_application_v2(application_name):
|
||||
base_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'files')
|
||||
|
||||
if application_name == "PCDesktopClient":
|
||||
json_file = "2022DesktopClient.json"
|
||||
elif application_name == "PCStudioApp":
|
||||
json_file = "2022StudioApp.json"
|
||||
else:
|
||||
return jsonify({"error": "Unsupported application"}), 400
|
||||
|
||||
json_file_path = os.path.join(base_path, json_file)
|
||||
|
||||
if not os.path.exists(json_file_path):
|
||||
return jsonify({"error": "Configuration file not found"}), 404
|
||||
|
||||
try:
|
||||
with open(json_file_path, 'r') as f:
|
||||
fflags_data = json.load(f)
|
||||
|
||||
return jsonify(fflags_data)
|
||||
|
||||
except (json.JSONDecodeError, IOError) as e:
|
||||
return jsonify({
|
||||
"error": "Failed to read configuration",
|
||||
"details": str(e)
|
||||
}), 500
|
||||
|
||||
"""@FFlagRoute.route("/v1/settings/application", methods=["GET"])
|
||||
def fflag_application():
|
||||
|
||||
application_name = request.args.get("applicationName")
|
||||
if not application_name:
|
||||
return jsonify({"error": "Missing 'applicationName' query parameter"}), 400
|
||||
|
||||
external_url = f"https://www.solario.ws/v1/settings/application?applicationName={application_name}"
|
||||
|
||||
try:
|
||||
external_response = requests.get(external_url, timeout=5)
|
||||
if external_response.status_code == 200:
|
||||
return jsonify(external_response.json()), 200
|
||||
else:
|
||||
return jsonify({"error": f"External service error: {external_response.status_code}"}), external_response.status_code
|
||||
except requests.RequestException as e:
|
||||
return jsonify({"error": f"Failed to fetch data from external service: {str(e)}"}), 500 """
|
||||
Reference in New Issue
Block a user