From 82339c346327214cab89a0000c8cf2f1bc916349 Mon Sep 17 00:00:00 2001 From: GiriNeko Date: Tue, 26 Aug 2025 15:38:35 +0800 Subject: [PATCH] feat: minecraft be support and custom default icon. --- main.py | 45 ++++++++++++++++++++++++++++++++++++- mc_status_api | 2 +- minecraft-creeper-face.png | Bin 0 -> 7870 bytes 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 minecraft-creeper-face.png diff --git a/main.py b/main.py index 9330b4a..473b227 100644 --- a/main.py +++ b/main.py @@ -14,6 +14,15 @@ import base64 import asyncio BACKGROUND_URL = "https://www.loliapi.com/acg/" +DEFAULT_ICON = "./minecraft-creeper-face.png" + +if DEFAULT_ICON.startswith("http"): + default_icon = asyncio.run(download_image_with_httpx_auto_redirect(DEFAULT_ICON)) + if not default_icon: + default_icon = None +else: + with open(DEFAULT_ICON, "rb") as f: + default_icon = f.read() async def generate_java_status_image(addr: str): loop = asyncio.get_event_loop() @@ -49,7 +58,37 @@ async def generate_java_status_image(addr: str): image = await loop.run_in_executor(None, create_image, background_data, - None, + default_icon, + text_list, + motd_list) + return image + +async def generate_bedrock_status_image(addr: str): + loop = asyncio.get_event_loop() + try: + ip, type = await loop.run_in_executor(None, dns_lookup, addr) + status = await loop.run_in_executor(None, bedrock_status, ip) + data = format_bedrock_data(ip, status) + except Exception as e: + print(f"查询服务器时出错: {e}") + return + + background_data = await download_image_with_httpx_auto_redirect(BACKGROUND_URL) + if not background_data: + background_data = None + + motd_list = data['motd'].split("\n") + text_list = [ + f"ip: {data['ip']}", + f"version: {data['version']}", + f"latency: {round(data['latency'], 2)} ms", + f"players: {data['players']['online']}/{data['players']['max']}", + ] + + image = await loop.run_in_executor(None, + create_image, + background_data, + default_icon, text_list, motd_list) return image @@ -58,3 +97,7 @@ if __name__ == "__main__": image = asyncio.run(generate_java_status_image("mc.hypixel.net")) if image: image.save("output_image.png") + + image = asyncio.run(generate_bedrock_status_image("play.cubecraft.net")) + if image: + image.save("output_image-be.png") \ No newline at end of file diff --git a/mc_status_api b/mc_status_api index 7346b1f..859b6b1 160000 --- a/mc_status_api +++ b/mc_status_api @@ -1 +1 @@ -Subproject commit 7346b1f7729c7d0884f5ba705420f8a6aeb643b8 +Subproject commit 859b6b1c537a5104887db6835e4a08602cad8529 diff --git a/minecraft-creeper-face.png b/minecraft-creeper-face.png new file mode 100644 index 0000000000000000000000000000000000000000..623db0238fcab90f4c6bb36d994d1ab0d2d6ec1d GIT binary patch literal 7870 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 f{?Gk0;9oS(KpStm$S1D*sF4K>ashC literal 0 HcmV?d00001