import json import requests import re import os from pathlib import Path from minecraft_version import MCVM from upload_header_image import upload_header_image LAUNCHER_MANIFSET_URL = 'https://piston-meta.mojang.com/mc/game/version_manifest.json' SNAPSHOT_PATTERN = re.compile(r'^\d{2}[w|W][0-9]{2}[A-Fa-f]$') NEW_SNAPSHOT_PATTERN = re.compile(r'^\d{2}(\.\d+)*-snapshot-\d+$') PRE_RELEASE_PATTERN = re.compile(r'^.*-pre-[0-9]+$') RELEASE_CANDIDATE_PATTERN = re.compile(r'^.*-rc-[0-9]+$') RELEASE_PATTERN = re.compile(r'^\d{1,2}\.\d+(\.\d+)?$') require_update = False def get_version_type(vid:str): if re.match(SNAPSHOT_PATTERN,vid) or re.match(NEW_SNAPSHOT_PATTERN,vid): return 'Snapshot' if re.match(PRE_RELEASE_PATTERN,vid): return 'Pre-Release' if re.match(RELEASE_CANDIDATE_PATTERN,vid): return 'Release-Candidate' if re.match(RELEASE_PATTERN,vid): return 'Release' return 'Others' def generate_filepath(ver_type:str, ver_id:str) -> Path: major_id = ver_id.split("-")[0] if ver_id[0] == '1': return Path(f'{major_id[:4]}/{major_id}/{ver_type.lower()}/{ver_id}.md') return Path(f'{major_id[:2]}/{major_id}/{ver_type.lower()}/{ver_id}.md') #return Path(f'Others/{ver_id}.md') def update_library(version_mainfest, version_libloc:str, ver_type:str, ver_id:str): #gen content filepath = Path(version_libloc) / generate_filepath(ver_type, ver_id) if os.path.exists(filepath): #print(f'版本库内已存在 {ver_type} 版 {ver_id} 的文件,跳过添加') return False header_image_link = 'null' try: header_image_link = upload_header_image(version=ver_id) finally: pass content = '---\n' content += f'version-image-link: {header_image_link}\n' #content += 'version-image-link-fallback: null\n' content += 'wip: true\n' content += f'server-jar: {get_server_jar(version_mainfest, ver_id)}\n' content += 'translator: null\n' content += f"cats: ['{ver_id[:4]}']\n" content += '---\n' upload_header_image(version=ver_id) with open(filepath.absolute(), "w", encoding='UTF-8') as file: file.write(content) #print(f'已添加 {ver_type} 版 {ver_id} 的文件到版本库') return True def get_server_jar(version_mainfest,version_id): versions = version_mainfest.get('versions') for version in versions: if version['id'] == version_id: response = requests.get(version['url']) return json.loads(response.content)['downloads']['server']['url'] return None try: response = requests.get(LAUNCHER_MANIFSET_URL) VERSION_MAINFEST = json.loads(response.content) except Exception as e: import traceback print(f'error_log={traceback.format_exc()}') exit(1) def main(): latest_snapshot_id = VERSION_MAINFEST['latest']['snapshot'] latest_release_id = VERSION_MAINFEST['latest']['release'] latest_snapshot_type = get_version_type(latest_snapshot_id) latest_release_type = get_version_type(latest_release_id) #print(f'● 最新 {latest_release_type} 版: {latest_release_id}') #print(f'● 最新 {latest_snapshot_type} 版: {latest_snapshot_id}') dir_location = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) version_lib_location = f'{dir_location}{os.sep}Project{os.sep}libraries{os.sep}Versions{os.sep}' release_require_update = \ update_library(VERSION_MAINFEST,version_lib_location, latest_release_type,latest_release_id) snapshot_require_update = \ update_library(VERSION_MAINFEST,version_lib_location, latest_snapshot_type,latest_snapshot_id) print(f'latest_release_type={latest_release_type}') print(f'latest_snapshot_type={latest_snapshot_type}') print(f'latest_release_id={latest_release_id}') print(f'latest_snapshot_id={latest_snapshot_id}') print(f'require_update={release_require_update or snapshot_require_update}') if __name__ == '__main__': main()