minecraft_version.py 2.8 KB

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