APIs.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from homepagebuilder.interfaces import page_class_handles, require
  2. from homepagebuilder.core.page import CodeBasedPage
  3. import json
  4. def get_args(kwargs):
  5. if setter := kwargs.get('setter'):
  6. return setter.override
  7. return {}
  8. def is_true(string:str):
  9. return string and isinstance(string,str) and string.lower() != 'false'
  10. @page_class_handles('apis/status')
  11. class StatusPage(CodeBasedPage):
  12. @property
  13. def display_name(self):
  14. return 'api/status'
  15. def generate(self, *args, **kwargs):
  16. return 'ok'
  17. def get_content_type(self, setter):
  18. return 'text/plain'
  19. mcv = require('MinecraftVersions') # 需求前置 MinecraftVersions
  20. latest_version = mcv.get_latest()
  21. @page_class_handles('apis/versions/latest')
  22. class LatestVersionAPI(CodeBasedPage):
  23. def __init__(self, project):
  24. super().__init__(project)
  25. self.latest_release = self.project.base_library.get_card(mcv.get_latest('release'),False)
  26. if latest_snap_shot_id := mcv.get_latest('snapshot'):
  27. self.latest_snapshot = self.project.base_library.get_card(latest_snap_shot_id,False)
  28. else:
  29. self.latest_snapshot = None
  30. self.respond = None
  31. @property
  32. def display_name(self):
  33. return 'api/versions/latest'
  34. def pregen_respond(self):
  35. respond = {}
  36. if self.latest_snapshot:
  37. respond['snapshot'] = self.extract_version_info(self.latest_snapshot)
  38. respond['release'] = self.extract_version_info(self.latest_release)
  39. self.respond = respond
  40. def extract_version_info(self,card):
  41. respond = {}
  42. expendedcard = self.project.template_manager.expend_card_placeholders(card,'')
  43. self.copyinfo(respond,expendedcard,'version-type')
  44. self.copyinfo(respond,expendedcard,'intro')
  45. self.copyinfo(respond,expendedcard,'version-image-link')
  46. self.copyinfo(respond,expendedcard,'server-jar')
  47. self.copyinfo(respond,expendedcard,'translator')
  48. self.copyinfo(respond,expendedcard,'official-link')
  49. self.copyinfo(respond,expendedcard,'wiki-link')
  50. self.copyinfo(respond,expendedcard,'version-id')
  51. self.copyinfo(respond,expendedcard,'title')
  52. respond['homepage-json-link'] = f"https://news.bugjump.net/VersionDetail.json?ver={expendedcard['version-id']}"
  53. return respond
  54. def copyinfo(self,respond,card,key):
  55. respond[key] = card.get(key)
  56. def generate(self, *args, **kwargs):
  57. args = get_args(kwargs)
  58. ensure_ascii = is_true(args.get('ascii',False))
  59. if not self.respond:
  60. self.pregen_respond()
  61. return json.dumps(self.respond,ensure_ascii=ensure_ascii)
  62. def get_content_type(self, setter):
  63. return 'application/json'
  64. @page_class_handles('apis/versions/latest-card')
  65. class LatestVersionCardAPI(CodeBasedPage):
  66. def generate(self, *args, **kwargs):
  67. setter = kwargs.get('setter')
  68. card = self.project.base_library.get_card('VersionLatestListCard', False)
  69. card = setter.decorate(card)
  70. return self.project.template_manager.build(card)