apis.py 3.4 KB

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