mirror of
				https://github.com/LiteyukiStudio/LiteyukiBot.git
				synced 2025-10-31 19:36:24 +00:00 
			
		
		
		
	✨ 预渲染数据,发送更快
This commit is contained in:
		| @@ -3,6 +3,7 @@ from nonebot.plugin import PluginMetadata | ||||
| from .core import * | ||||
| from .loader import * | ||||
| from .runtime import * | ||||
| from .dev_tools import * | ||||
|  | ||||
| __author__ = "snowykami" | ||||
| __plugin_meta__ = PluginMetadata( | ||||
|   | ||||
							
								
								
									
										43
									
								
								liteyuki/liteyuki_main/dev_tools.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								liteyuki/liteyuki_main/dev_tools.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| import time | ||||
|  | ||||
| import nonebot | ||||
| from watchdog.observers import Observer | ||||
| from watchdog.events import FileSystemEventHandler | ||||
|  | ||||
| from liteyuki.utils.base.config import get_config | ||||
| from liteyuki.utils.base.reloader import Reloader | ||||
| from liteyuki.utils.base.resource import load_resources | ||||
|  | ||||
| if get_config("liteyuki_reload", False): | ||||
|     nonebot.logger.info("Liteyuki Reload is enable, watching for file changes...") | ||||
|  | ||||
|  | ||||
|     class CodeModifiedHandler(FileSystemEventHandler): | ||||
|         def on_modified(self, event): | ||||
|             if "liteyuki/resources" not in event.src_path.replace("\\", "/"): | ||||
|                 nonebot.logger.debug(f"{event.src_path} has been modified, reloading bot...") | ||||
|                 Reloader.reload() | ||||
|  | ||||
|  | ||||
|     class ResourceModifiedHandler(FileSystemEventHandler): | ||||
|         def on_modified(self, event): | ||||
|             if not event.is_directory: | ||||
|                 nonebot.logger.debug(f"{event.src_path} has been modified, reloading resource...") | ||||
|                 load_resources() | ||||
|  | ||||
|  | ||||
|     code_modified_handler = CodeModifiedHandler() | ||||
|     resource_modified_handle = ResourceModifiedHandler() | ||||
|  | ||||
|     observer = Observer() | ||||
|     observer.schedule(resource_modified_handle, path="liteyuki/resources", recursive=True) | ||||
|     observer.schedule(resource_modified_handle, path="resources", recursive=True) | ||||
|     observer.schedule(code_modified_handler, path="liteyuki", recursive=True) | ||||
|     observer.start() | ||||
|  | ||||
| # try: | ||||
| #     while True: | ||||
| #         time.sleep(1) | ||||
| # except KeyboardInterrupt: | ||||
| #     observer.stop() | ||||
| # observer.join() | ||||
| @@ -3,17 +3,20 @@ import platform | ||||
| import nonebot | ||||
| import psutil | ||||
| from cpuinfo import get_cpu_info | ||||
| from nonebot import on_command | ||||
| from nonebot import on_command, require | ||||
| from nonebot.adapters.onebot.v11 import MessageSegment | ||||
| from nonebot.permission import SUPERUSER | ||||
| from liteyuki.utils import __NAME__, __VERSION__, load_from_yaml | ||||
| from liteyuki.utils.message.html_tool import template2image | ||||
| from liteyuki.utils.base.language import Language, get_default_lang_code, get_user_lang | ||||
| from liteyuki.utils.base.language import Language, get_all_lang, get_default_lang_code, get_user_lang | ||||
| from liteyuki.utils.base.ly_typing import T_Bot, T_MessageEvent | ||||
| from liteyuki.utils.base.resource import get_path | ||||
| from liteyuki.utils.message.tools import convert_size | ||||
| from PIL import Image   | ||||
| from io import BytesIO   | ||||
| from PIL import Image | ||||
| from io import BytesIO | ||||
|  | ||||
| require("nonebot_plugin_apscheduler") | ||||
| from nonebot_plugin_apscheduler import scheduler | ||||
|  | ||||
| stats = on_command("status", aliases={"状态"}, priority=5, permission=SUPERUSER) | ||||
|  | ||||
| @@ -28,29 +31,63 @@ protocol_names = { | ||||
|         6: "Android Pad", | ||||
| } | ||||
|  | ||||
| # 预存数据区 | ||||
| stats_data = {}  # lang -> dict | ||||
| image_data = {}  # lang -> bytes | ||||
| localization = {} | ||||
| for lang in get_all_lang(): | ||||
|     ulang = Language(lang) | ||||
|     localization[lang] = { | ||||
|             "cpu"  : ulang.get("main.monitor.cpu"), | ||||
|             "mem"  : ulang.get("main.monitor.memory"), | ||||
|             "swap" : ulang.get("main.monitor.swap"), | ||||
|             "disk" : ulang.get("main.monitor.disk"), | ||||
|             "used" : ulang.get("main.monitor.used"), | ||||
|             "free" : ulang.get("main.monitor.free"), | ||||
|             "total": ulang.get("main.monitor.total"), | ||||
|     } | ||||
|  | ||||
|  | ||||
| @scheduler.scheduled_job("cron", second="*/20") | ||||
| async def _(): | ||||
|     nonebot.logger.info("数据已刷新") | ||||
|     for lang_code in get_all_lang(): | ||||
|         stats_data[lang_code] = await get_stats_data(lang=lang_code) | ||||
|         image_data[lang_code] = await template2image( | ||||
|             get_path("templates/stats.html", abs_path=True), | ||||
|             { | ||||
|                     "data": stats_data[lang_code] | ||||
|             }, | ||||
|             wait=1 | ||||
|         ) | ||||
|  | ||||
|  | ||||
| @stats.handle() | ||||
| async def _(bot: T_Bot, event: T_MessageEvent): | ||||
|     global stats_data | ||||
|     ulang = get_user_lang(str(event.user_id)) | ||||
|     image = await template2image( | ||||
|         get_path("templates/stats.html", abs_path=True), | ||||
|         { | ||||
|                 "data": await get_stats_data(bot.self_id, ulang.lang_code) | ||||
|         }, | ||||
|         wait=1 | ||||
|     ) | ||||
|     image = await png_to_jpg(image) | ||||
|  | ||||
|     if ulang.lang_code not in image_data: | ||||
|         stats_data[ulang.lang_code] = await get_stats_data(lang=ulang.lang_code) | ||||
|         image_data[ulang.lang_code] = await template2image( | ||||
|             get_path("templates/stats.html", abs_path=True), | ||||
|             { | ||||
|                     "data": stats_data[ulang.lang_code] | ||||
|             }, | ||||
|             wait=1 | ||||
|         ) | ||||
|     image = await png_to_jpg(image_data[ulang.lang_code]) | ||||
|     await stats.finish(MessageSegment.image(image)) | ||||
|  | ||||
|  | ||||
| async def png_to_jpg(image):    | ||||
|     image_stream = BytesIO(image)    | ||||
|     img = Image.open(image_stream)     | ||||
|     rgb_img = img.convert('RGB')   | ||||
|     output_stream = BytesIO()     | ||||
|     rgb_img.save(output_stream, format='JPEG')    | ||||
|     jpg_bytes = output_stream.getvalue()    | ||||
|     return jpg_bytes   | ||||
| async def png_to_jpg(image): | ||||
|     image_stream = BytesIO(image) | ||||
|     img = Image.open(image_stream) | ||||
|     rgb_img = img.convert('RGB') | ||||
|     output_stream = BytesIO() | ||||
|     rgb_img.save(output_stream, format='JPEG') | ||||
|     jpg_bytes = output_stream.getvalue() | ||||
|     return jpg_bytes | ||||
|  | ||||
|  | ||||
| async def get_bots_data(ulang: Language, self_id) -> list: | ||||
| @@ -181,10 +218,10 @@ async def get_stats_data(self_id: str = None, lang: str = None) -> dict: | ||||
|  | ||||
|     cpu_info = get_cpu_info() | ||||
|     templ = { | ||||
|             "plugin"     : len(nonebot.get_loaded_plugins()), | ||||
|             "version"    : __VERSION__, | ||||
|             "system"     : platform.platform(), | ||||
|             "cpu"        : [ | ||||
|             "plugin"      : len(nonebot.get_loaded_plugins()), | ||||
|             "version"     : __VERSION__, | ||||
|             "system"      : platform.platform(), | ||||
|             "cpu"         : [ | ||||
|                     { | ||||
|                             "name" : "USED", | ||||
|                             "value": psutil.cpu_percent() | ||||
| @@ -194,7 +231,7 @@ async def get_stats_data(self_id: str = None, lang: str = None) -> dict: | ||||
|                             "value": 100 - psutil.cpu_percent() | ||||
|                     } | ||||
|             ], | ||||
|             "mem"        : [ | ||||
|             "mem"         : [ | ||||
|  | ||||
|                     { | ||||
|                             "name" : "OTHER", | ||||
| @@ -209,7 +246,7 @@ async def get_stats_data(self_id: str = None, lang: str = None) -> dict: | ||||
|                             "value": mem_used_bot | ||||
|                     }, | ||||
|             ], | ||||
|             "swap"       : [ | ||||
|             "swap"        : [ | ||||
|                     { | ||||
|                             "name" : "USED", | ||||
|                             "value": psutil.swap_memory().used | ||||
| @@ -219,32 +256,25 @@ async def get_stats_data(self_id: str = None, lang: str = None) -> dict: | ||||
|                             "value": psutil.swap_memory().free | ||||
|                     } | ||||
|             ], | ||||
|             "disk"       : disk_data,  # list[{"name":"C", "total":100, "used":50, "free":50}] | ||||
|             "bot"        : await get_bots_data(ulang, self_id), | ||||
|             "cpuTags"    : [ | ||||
|             "disk"        : disk_data,  # list[{"name":"C", "total":100, "used":50, "free":50}] | ||||
|             "bot"         : await get_bots_data(ulang, self_id), | ||||
|             "cpuTags"     : [ | ||||
|                     f"{brand} {cpu_info.get('arch', 'Unknown')}", | ||||
|                     f"{fake_device_info.get('cpu', {}).get('cores', psutil.cpu_count(logical=False))}C " | ||||
|                     f"{fake_device_info.get('cpu', {}).get('logical_cores', psutil.cpu_count(logical=True))}T", | ||||
|                     f"{'%.2f' % (fake_device_info.get('cpu', {}).get('frequency', psutil.cpu_freq().current) / 1000)}GHz" | ||||
|             ], | ||||
|             "memTags"    : [ | ||||
|             "memTags"     : [ | ||||
|                     f"Bot {mem_used_bot_show}", | ||||
|                     f"{ulang.get('main.monitor.used')} {mem_used_show}", | ||||
|                     f"{ulang.get('main.monitor.free')} {convert_size(mem_free, 1)}", | ||||
|                     f"{ulang.get('main.monitor.total')} {mem_total_show}", | ||||
|             ], | ||||
|             "swapTags"   : [ | ||||
|             "swapTags"    : [ | ||||
|                     f"{ulang.get('main.monitor.used')} {convert_size(swap_info.used, 1)}", | ||||
|                     f"{ulang.get('main.monitor.free')} {convert_size(swap_info.free, 1)}", | ||||
|                     f"{ulang.get('main.monitor.total')} {convert_size(swap_info.total, 1)}", | ||||
|             ], | ||||
|             "cpu_trans"  : ulang.get("main.monitor.cpu"), | ||||
|             "mem_trans"  : ulang.get("main.monitor.memory"), | ||||
|             "swap_trans" : ulang.get("main.monitor.swap"), | ||||
|             "disk_trans" : ulang.get("main.monitor.disk"), | ||||
|             "used_trans" : ulang.get("main.monitor.used"), | ||||
|             "free_trans" : ulang.get("main.monitor.free"), | ||||
|             "total_trans": ulang.get("main.monitor.total"), | ||||
|             "localization": localization[ulang.lang_code] | ||||
|     } | ||||
|  | ||||
|     return templ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user