""" API相关的页面 """ import json from homepagebuilder.interfaces import page_class_handles, require from homepagebuilder.core.page import CodeBasedPage from homepagebuilder.core.types import Context def get_args(context): if setter := context.setter: return setter.override.get('args', {}) return {} def is_true(string:str): return string and isinstance(string,str) and string.lower() != 'false' @page_class_handles('apis/status') class StatusPage(CodeBasedPage): @property def display_name(self): return 'api/status' def generate(self, *args, **kwargs): return 'ok' def get_content_type(self, setter, *args, **kwargs): return 'text/plain' mcv = require('minecraft_version') # 需求前置 MinecraftVersions latest_version = mcv.get_latest() @page_class_handles('apis/versions/latest') class LatestVersionAPI(CodeBasedPage): def __init__(self, project): super().__init__(project) self.latest_release = self.project.base_library.get_card(mcv.get_latest('release'),False) if latest_snap_shot_id := mcv.get_latest('snapshot'): self.latest_snapshot = self.project.base_library.get_card(latest_snap_shot_id,False) else: self.latest_snapshot = None self.respond = None @property def display_name(self): return 'api/versions/latest' def pregen_respond(self): respond = {} if self.latest_snapshot: respond['snapshot'] = self.extract_version_info(self.latest_snapshot) respond['release'] = self.extract_version_info(self.latest_release) self.respond = respond def extract_version_info(self,card): respond = {} context = Context.get_current_context() expendedcard = context.builder.template_manager.expend_card_placeholders(card,'') self.copyinfo(respond,expendedcard,'version-type') self.copyinfo(respond,expendedcard,'intro') self.copyinfo(respond,expendedcard,'version-image-link') self.copyinfo(respond,expendedcard,'server-jar') self.copyinfo(respond,expendedcard,'translator') self.copyinfo(respond,expendedcard,'official-link') self.copyinfo(respond,expendedcard,'wiki-link') self.copyinfo(respond,expendedcard,'version-id') self.copyinfo(respond,expendedcard,'title') respond['homepage-json-link'] = f"https://news.bugjump.net/VersionDetail.json?ver={expendedcard['version-id']}" return respond def copyinfo(self,respond,card,key): respond[key] = card.get(key) def generate(self, *args, **kwargs): context = Context.get_current_context() args = get_args(context) ensure_ascii = is_true(args.get('ascii',False)) print(args) if not self.respond: self.pregen_respond() return json.dumps(self.respond,ensure_ascii=ensure_ascii) def get_content_type(self, setter, *args, **kwargs): return 'application/json' @page_class_handles('apis/versions/latest-card') class LatestVersionCardAPI(CodeBasedPage): def generate(self, *args, **kwargs): context = Context.get_current_context() setter = context.setter card = self.project.base_library.get_card('VersionLatestListCard', False) card = setter.decorate(card) return context.builder.template_manager.build(card) def get_content_type(self, setter, *args, **kwargs): return 'application/xml'