import requests import json import binascii import bcrypt import re import xml.etree.ElementTree as ET from config import MODEL, TUNEFILE, SKIN FMAX_VER = None FMAX_RES = None def get_4max_version_string(): url = "https://studio.code.org/v3/sources/3-aKHy16Y5XaAPXQHI95RnFOKlyYT2O95ia2HN2jKIs/main.json" global FMAX_VER try: with open("./files/4max_ver.txt", 'r') as file: FMAX_VER = file.read().strip() except Exception as e: print(f"An unexpected error occurred when loading files/4max_ver.txt: {e}") def fetch(): global FMAX_RES try: response = requests.get(url) if 200 <= response.status_code <= 207: try: FMAX_RES = json.loads(json.loads(response.text)['source']) except (json.JSONDecodeError, KeyError): FMAX_RES = 500 else: FMAX_RES = response.status_code except requests.RequestException: FMAX_RES = 400 fetch() def parse_res(res): parsed_data = [] if isinstance(res, int): return "Failed to fetch version info: Error " + str(res) for item in res: if item.get("isOpen"): version = item.get("version", "Unknown Version") changelog = "
".join(item.get("changeLog", {}).get("en", [])) parsed_data.append(f"Version: {version}

Changelog:
{changelog}

") return "".join(parsed_data) def crc32_decimal(data): crc32_hex = binascii.crc32(data.encode()) return int(crc32_hex & 0xFFFFFFFF) def hash_password(password): salt = bcrypt.gensalt() hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt) return hashed_password def verify_password(password, hashed_password): if type(hashed_password) == str: hashed_password = hashed_password.encode('utf-8') return bcrypt.checkpw(password.encode('utf-8'), hashed_password) def is_alphanumeric(username): pattern = r"^[a-zA-Z0-9]+$" return bool(re.match(pattern, username)) def get_model_pak(host): mid = ET.Element("model_pak") rid = ET.Element("date") uid = ET.Element("url") rid.text = MODEL uid.text = host + "files/gc2/model" + MODEL + ".pak" mid.append(rid) mid.append(uid) return mid def get_tune_pak(host): mid = ET.Element("tuneFile_pak") rid = ET.Element("date") uid = ET.Element("url") rid.text = TUNEFILE uid.text = host + "files/gc2/tuneFile" + TUNEFILE + ".pak" mid.append(rid) mid.append(uid) return mid def get_skin_pak(host): mid = ET.Element("skin_pak") rid = ET.Element("date") uid = ET.Element("url") rid.text = SKIN uid.text = host + "files/gc2/skin" + SKIN + ".pak" mid.append(rid) mid.append(uid) return mid def get_m4a_path(host): mid = ET.Element("m4a_path") mid.text = host + "files/gc2/audio/" return mid def get_stage_path(host): mid = ET.Element("stage_path") mid.text = host + "files/gc2/stage/" return mid def get_stage_zero(): sid = ET.Element("my_stage") did = ET.Element("stage_id") cid = ET.Element("ac_mode") did.text = "0" cid.text = "0" sid.append(did) sid.append(cid) return sid def inform_page(text, mode): if mode == 0: mode = "/files/web/ttl_taitoid.png" elif mode == 1: mode = "/files/web/ttl_information.png" elif mode == 2: mode = "/files/web/ttl_buy.png" elif mode == 3: mode = "/files/web/ttl_title.png" with open("files/inform.html", "r") as file: return file.read().format(text=text, img=mode)