MinecraftVersions.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from Core.Debug import LogWarning, LogInfo
  2. import requests
  3. import json
  4. import re
  5. LAUNCHER_MANIFSET_URL = 'https://piston-meta.mojang.com/mc/game/version_manifest.json'
  6. MANIFSET = None
  7. VERSIONS_DICT = None
  8. FULL_VERSIONS = None
  9. LATEST_VERSIONS = None
  10. def fetch_manifset():
  11. try:
  12. response = requests.get(LAUNCHER_MANIFSET_URL)
  13. return json.loads(response.content)
  14. except Exception as e:
  15. LogWarning(f'获取版本列表失败:{e.with_traceback()}')
  16. return {}
  17. def get_manifset():
  18. global MANIFSET
  19. if not MANIFSET:
  20. MANIFSET = fetch_manifset()
  21. return MANIFSET
  22. def init_version_dict():
  23. global LATEST_VERSIONS,FULL_VERSIONS,VERSIONS_DICT
  24. VERSIONS_DICT = {}
  25. LATEST_VERSIONS = {'snapshot':None,'release':None}
  26. manifset = get_manifset()
  27. LATEST_VERSIONS.update(manifset['latest'])
  28. FULL_VERSIONS = manifset.get('versions')
  29. for version in FULL_VERSIONS:
  30. VERSIONS_DICT[version['id']] = version
  31. LogInfo(f'[VersionScript] 最新快照版:{LATEST_VERSIONS["snapshot"]}; 最新正式版:{LATEST_VERSIONS["release"]}')
  32. def get_latest(version_type = 'snapshot',version_rank = 1):
  33. global LATEST_VERSIONS
  34. if not LATEST_VERSIONS:
  35. init_version_dict()
  36. version_rank = int(version_rank)
  37. if version_rank <= 1:
  38. return LATEST_VERSIONS[version_type]
  39. count = version_rank
  40. for version in FULL_VERSIONS:
  41. if version['type'] == version_type:
  42. count -= 1
  43. if count == 0:
  44. return version['id']
  45. return ''
  46. def get_server_jar(version_id):
  47. global VERSIONS_DICT
  48. if not (ver_info := VERSIONS_DICT.get(version_id)):
  49. return None
  50. response = requests.get(ver_info['url'])
  51. return json.loads(response.content)['downloads']['server']['url']
  52. SNAPSHOT_PATTERN = re.compile(r'^[0-9]{2}[w|W][0-9]{2}[A-Fa-f]$')
  53. PRE_RELEASE_PATTERN = re.compile(r'^.*-pre[0-9]+$')
  54. RELEASE_CANDIDATE_PATTERN = re.compile(r'^.*-rc[0-9]+$')
  55. RELEASE_PATTERN = re.compile(r'^1\.[0-9]+(\.[0-9]+)?$')
  56. def get_version_type(version_id):
  57. '''获取版本类型'''
  58. if re.match(SNAPSHOT_PATTERN,version_id):
  59. return 'snapshot'
  60. if re.match(PRE_RELEASE_PATTERN,version_id):
  61. return 'pre_release'
  62. if re.match(RELEASE_CANDIDATE_PATTERN,version_id):
  63. return 'release_candidate'
  64. if re.match(RELEASE_PATTERN,version_id):
  65. return 'release'
  66. return 'other'