APIs.py 3.3 KB

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