apis.py 3.4 KB

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