mirror of
https://github.com/Shu-Ying/main_plugin_farm.git
synced 2026-10-29 13:40:00 +08:00
🎨 程序启动不再读取全部json, 改为首次使用时读取
This commit is contained in:
+65
-23
@@ -8,22 +8,59 @@ from .request import g_pRequestManager
|
||||
|
||||
class CJsonManager:
|
||||
def __init__(self):
|
||||
self.m_pItem = {}
|
||||
self.m_pLevel = {}
|
||||
self.m_pSoil = {}
|
||||
self.m_pSign = {}
|
||||
self._m_pItem = {}
|
||||
self._m_pLevel = {}
|
||||
self._m_pSoil = {}
|
||||
self._m_pSign = {}
|
||||
|
||||
async def init(self) -> bool:
|
||||
if not await self.initItem():
|
||||
return False
|
||||
self._m_bItemLoaded = False
|
||||
self._m_bLevelLoaded = False
|
||||
self._m_bSoilLoaded = False
|
||||
self._m_bSignLoaded = False
|
||||
|
||||
if not await self.initLevel():
|
||||
return False
|
||||
async def getItem(self) -> dict:
|
||||
if not self._m_bItemLoaded:
|
||||
success = await self.initItem()
|
||||
if not success:
|
||||
return {}
|
||||
return self._m_pItem
|
||||
|
||||
if not await self.initSoil():
|
||||
return False
|
||||
async def getLevel(self) -> dict:
|
||||
if not self._m_bLevelLoaded:
|
||||
success = await self.initLevel()
|
||||
if not success:
|
||||
return {}
|
||||
return self._m_pLevel
|
||||
|
||||
return await self.initSignInFile()
|
||||
async def getSoil(self) -> dict:
|
||||
if not self._m_bSoilLoaded:
|
||||
success = await self.initSoil()
|
||||
if not success:
|
||||
return {}
|
||||
return self._m_pSoil
|
||||
|
||||
async def getSign(self) -> dict:
|
||||
if not self._m_bSignLoaded:
|
||||
success = await self.initSign()
|
||||
if not success:
|
||||
return {}
|
||||
return self._m_pSign
|
||||
|
||||
async def reloadItem(self) -> bool:
|
||||
self._m_bItemLoaded = False
|
||||
return await self.initItem()
|
||||
|
||||
async def reloadLevel(self) -> bool:
|
||||
self._m_bLevelLoaded = False
|
||||
return await self.initLevel()
|
||||
|
||||
async def reloadSoil(self) -> bool:
|
||||
self._m_bSoilLoaded = False
|
||||
return await self.initSoil()
|
||||
|
||||
async def reloadSign(self) -> bool:
|
||||
self._m_bSignLoaded = False
|
||||
return await self.initSign()
|
||||
|
||||
async def initItem(self) -> bool:
|
||||
try:
|
||||
@@ -31,14 +68,16 @@ class CJsonManager:
|
||||
config.g_sConfigPath / "item.json",
|
||||
encoding="utf-8",
|
||||
) as file:
|
||||
self.m_pItem = json.load(file)
|
||||
|
||||
self._m_pItem = json.load(file)
|
||||
self._m_bItemLoaded = True
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
logger.warning("item.json 打开失败")
|
||||
self._m_pItem = {}
|
||||
return False
|
||||
except json.JSONDecodeError as e:
|
||||
logger.warning(f"item.json JSON格式错误: {e}")
|
||||
self._m_pItem = {}
|
||||
return False
|
||||
|
||||
async def initLevel(self) -> bool:
|
||||
@@ -47,14 +86,16 @@ class CJsonManager:
|
||||
config.g_sConfigPath / "level.json",
|
||||
encoding="utf-8",
|
||||
) as file:
|
||||
self.m_pLevel = json.load(file)
|
||||
|
||||
self._m_pLevel = json.load(file)
|
||||
self._m_bLevelLoaded = True
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
logger.warning("level.json 打开失败")
|
||||
self._m_pLevel = {}
|
||||
return False
|
||||
except json.JSONDecodeError as e:
|
||||
logger.warning(f"level.json JSON格式错误: {e}")
|
||||
self._m_pLevel = {}
|
||||
return False
|
||||
|
||||
async def initSoil(self) -> bool:
|
||||
@@ -63,26 +104,25 @@ class CJsonManager:
|
||||
config.g_sConfigPath / "soil.json",
|
||||
encoding="utf-8",
|
||||
) as file:
|
||||
self.m_pSoil = json.load(file)
|
||||
|
||||
self._m_pSoil = json.load(file)
|
||||
self._m_bSoilLoaded = True
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
logger.warning("soil.json 打开失败")
|
||||
self._m_pSoil = {}
|
||||
return False
|
||||
except json.JSONDecodeError as e:
|
||||
logger.warning(f"soil.json JSON格式错误: {e}")
|
||||
self._m_pSoil = {}
|
||||
return False
|
||||
|
||||
async def initSignInFile(self) -> bool:
|
||||
if not await g_pRequestManager.initSignInFile():
|
||||
config.g_bSignStatus = False
|
||||
|
||||
return False
|
||||
else:
|
||||
result = await self.initSign()
|
||||
|
||||
config.g_bSignStatus = result
|
||||
|
||||
return result
|
||||
|
||||
async def initSign(self) -> bool:
|
||||
@@ -91,14 +131,16 @@ class CJsonManager:
|
||||
config.g_sSignInPath,
|
||||
encoding="utf-8",
|
||||
) as file:
|
||||
self.m_pSign = json.load(file)
|
||||
|
||||
self._m_pSign = json.load(file)
|
||||
self._m_bSignLoaded = True
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
logger.warning("sign_in.json 打开失败")
|
||||
self._m_pSign = {}
|
||||
return False
|
||||
except json.JSONDecodeError as e:
|
||||
logger.warning(f"sign_in.json JSON格式错误: {e}")
|
||||
self._m_pSign = {}
|
||||
return False
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
from datetime import datetime
|
||||
import os
|
||||
from pathlib import Path
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from jinja2 import Template
|
||||
from playwright.async_api import async_playwright
|
||||
|
||||
from zhenxun.services.log import logger
|
||||
from zhenxun.utils.message import MessageUtils
|
||||
|
||||
@@ -107,5 +111,87 @@ class CToolManager:
|
||||
tz = ZoneInfo("Asia/Shanghai")
|
||||
return datetime.now(tz)
|
||||
|
||||
@classmethod
|
||||
def renderHtmlToFile(
|
||||
cls, path: Path | str, context: dict, output: Path | str
|
||||
) -> None:
|
||||
"""
|
||||
使用 Jinja2 渲染 HTML 模板并保存到指定文件,会自动创建父目录
|
||||
|
||||
Args:
|
||||
path (str): 模板 HTML 路径
|
||||
context (dict): 用于渲染的上下文字典
|
||||
output (str): 输出 HTML 文件路径
|
||||
"""
|
||||
templatePath = str(path)
|
||||
outputPath = str(output)
|
||||
|
||||
templateStr = Path(templatePath).read_text(encoding="utf-8")
|
||||
template = Template(templateStr)
|
||||
rendered = template.render(**context)
|
||||
|
||||
# 自动创建目录
|
||||
Path(outputPath).parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
Path(outputPath).write_text(rendered, encoding="utf-8")
|
||||
|
||||
@classmethod
|
||||
async def screenshotHtmlToBytes(cls, path: str) -> bytes:
|
||||
"""
|
||||
使用 Playwright 截图本地 HTML 文件并返回 PNG 图片字节数据
|
||||
|
||||
Args:
|
||||
path (str): 本地 HTML 文件路径
|
||||
|
||||
Returns:
|
||||
bytes: PNG 图片的原始字节内容
|
||||
"""
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch()
|
||||
page = await browser.new_page(
|
||||
viewport={"width": 1200, "height": 900}, device_scale_factor=1
|
||||
)
|
||||
file_url = Path(path).resolve().as_uri()
|
||||
await page.goto(file_url, wait_until="networkidle")
|
||||
await page.evaluate("""() => {
|
||||
return new Promise(r => setTimeout(r, 200));
|
||||
}""")
|
||||
image_bytes = await page.screenshot(full_page=True)
|
||||
await browser.close()
|
||||
|
||||
return image_bytes
|
||||
|
||||
@classmethod
|
||||
async def screenshotSave(
|
||||
cls, path: str, save: str, width: int, height: int
|
||||
) -> None:
|
||||
"""
|
||||
使用 Playwright 渲染本地 HTML 并将截图保存到指定路径
|
||||
|
||||
Args:
|
||||
path (str): HTML 文件路径
|
||||
save (str): PNG 保存路径(如 output/image.png)
|
||||
width (int): 图片宽度
|
||||
height (int): 图片高度
|
||||
"""
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch()
|
||||
page = await browser.new_page(
|
||||
viewport={"width": width, "height": height}, device_scale_factor=1
|
||||
)
|
||||
|
||||
file_url = Path(path).resolve().as_uri()
|
||||
await page.goto(file_url, wait_until="networkidle")
|
||||
await page.evaluate("""() => {
|
||||
return new Promise(r => setTimeout(r, 200));
|
||||
}""")
|
||||
|
||||
# 确保保存目录存在
|
||||
Path(save).parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 截图并保存到本地文件
|
||||
await page.screenshot(path=save, full_page=True)
|
||||
await browser.close()
|
||||
|
||||
|
||||
g_pToolManager = CToolManager()
|
||||
|
||||
Reference in New Issue
Block a user