MinecraftVersions.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. FULL_VERSIONS = None
  8. LATEST_VERSIONS = None
  9. def fetch_manifset():
  10. try:
  11. response = requests.get(LAUNCHER_MANIFSET_URL)
  12. return json.loads(response.content)
  13. except Exception as e:
  14. LogWarning(f'获取版本列表失败:{e.with_traceback()}')
  15. return {}
  16. def get_manifset():
  17. global MANIFSET
  18. if not MANIFSET:
  19. MANIFSET = fetch_manifset()
  20. return MANIFSET
  21. def init_version_dict():
  22. global LATEST_VERSIONS,FULL_VERSIONS
  23. LATEST_VERSIONS = {'snapshot':None,'release':None}
  24. manifset = get_manifset()
  25. LATEST_VERSIONS.update(manifset['latest'])
  26. FULL_VERSIONS = manifset.get('versions')
  27. LogInfo(f'[VersionScript] 最新快照版:{LATEST_VERSIONS["snapshot"]}; 最新正式版:{LATEST_VERSIONS["release"]}')
  28. def get_latest(version_type = 'snapshot',version_rank = 1):
  29. global LATEST_VERSIONS
  30. if not LATEST_VERSIONS:
  31. init_version_dict()
  32. version_rank = int(version_rank)
  33. if version_rank <= 1:
  34. return LATEST_VERSIONS[version_type]
  35. count = version_rank
  36. for version in FULL_VERSIONS:
  37. if version['type'] == version_type:
  38. count -= 1
  39. if count == 0:
  40. return version['id']
  41. return ''
  42. SNAPSHOT_PATTERN = re.compile(r'^[0-9]{2}[w|W][0-9]{2}[A-Fa-f]$')
  43. PRE_RELEASE_PATTERN = re.compile(r'^.*-pre[0-9]+$')
  44. RELEASE_CANDIDATE_PATTERN = re.compile(r'^.*-rc[0-9]+$')
  45. RELEASE_PATTERN = re.compile(r'^1\.[0-9]+(\.[0-9]+)?$')
  46. def get_version_type(version_id):
  47. '''获取版本类型'''
  48. if re.match(SNAPSHOT_PATTERN,version_id):
  49. return 'snapshot'
  50. if re.match(PRE_RELEASE_PATTERN,version_id):
  51. return 'pre_release'
  52. if re.match(RELEASE_CANDIDATE_PATTERN,version_id):
  53. return 'release_candidate'
  54. if re.match(RELEASE_PATTERN,version_id):
  55. return 'release'
  56. return 'other'