MinecraftVersions.py 2.4 KB

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