1
0
forked from bot/app

预渲染数据,发送更快

This commit is contained in:
2024-04-22 21:05:35 +08:00
parent ae19113141
commit bd5f6c5205
14 changed files with 1178 additions and 93 deletions

View File

@ -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(

View 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()

View File

@ -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