✨ 预渲染数据,发送更快
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