add # 新增种子商店界面

fixed # 修复数据库目录错误的BUG
This commit is contained in:
2026-10-20 13:15:01 +08:00
parent 92a3944e43
commit 38f4b84cf0
15 changed files with 395 additions and 15 deletions
+9 -1
View File
@@ -16,6 +16,7 @@ from zhenxun.utils.platform import PlatformUtils
from .runtime import COMMANDS, Runtime
from .data_paths import data_directories
from .config_migration import migrate_config
logger = logging.getLogger(__name__)
driver = get_driver()
@@ -30,7 +31,14 @@ runtime = Runtime(
font_dir=FONT_PATH,
legacy_data_dir=legacy_data_dir,
)
driver.on_startup(runtime.start)
async def start_runtime():
from zhenxun.configs.config import Config
migrate_config(Config, __package__.split(".")[-1])
await runtime.start()
driver.on_startup(start_runtime)
driver.on_shutdown(runtime.close)
_avatars = {}
+32
View File
@@ -0,0 +1,32 @@
"""仅清理农场已废弃配置,保存备份并同步网页配置数据。"""
import logging
import shutil
from pathlib import Path
OBSOLETE_KEYS = (
"绘制农场清晰度", "动态背景", "签到图片样式", "兑换倍数",
"点券兑换倍数", "手续费", "服务地址",
)
def migrate_config(manager, module):
group = manager.get(module)
simple = manager._simple_data.get(module, {})
removed = [key for key in OBSOLETE_KEYS
if key in group.configs or key in simple]
if not removed:
return
for source in (manager.file, manager._simple_file):
source = Path(source)
backup = source.with_name(source.name + ".farm-v1.bak")
if source.exists() and not backup.exists():
shutil.copy2(source, backup)
for key in removed:
group.configs.pop(key, None)
simple.pop(key, None)
manager.save(save_simple_data=True)
logging.getLogger(__name__).info(
"farm config migration module=%s removed_keys=%s", module, removed,
)
+23 -10
View File
@@ -12,6 +12,7 @@ from ._vendor.farm_core.storage import SCHEMA_VERSION
from ._vendor.farm_core.presentation import receipt_text, snapshot_text
from ._vendor.farm_render import FarmRenderer, RenderOptions, RenderService
from ._vendor.farm_render.seasons import season_for
from ._vendor.farm_render.shop import shop_page
from .data_paths import prepare_directory
logger = logging.getLogger(__name__)
@@ -167,17 +168,29 @@ class Runtime:
return HELP
if action == "shop":
page = int(args[0]) if args else 1
if not 1 <= page <= 100 or len(args) > 1:
if len(args) > 1:
raise ValueError()
plants = sorted(
(p for p in self.service.catalogue if p.buyable),
key=lambda p: p.plant_id,
)
chunk = plants[(page-1)*12:page*12]
return "种子商店 " + str(page) + "页\n" + "\n".join(
f"{p.name}(#{p.plant_id}):"
f"{p.cost}{'点券' if p.is_vip else '农场币'}"
f" / 等级{p.level}" for p in chunk
try:
chunk, pages = shop_page(self.service.catalogue, page)
except ValueError:
return '页码无效,请发送:种子商店 1'
if self.rendering:
account = None
try:
account = (await self.service.snapshot(who)).account
except FarmError as error:
if error.code != 'not_registered':
raise
return await self.rendering.seed_shop(
chunk, account, page, pages,
)
return f'种子商店 第{page}/{pages}页\n' + '\n'.join(
f'{p.name}(#{p.plant_id}):'
f'{p.cost}{"点券" if p.is_vip else "农场币"}'
f' / 等级{p.level}' for p in chunk
) + (
'\n购买种子 #编号 数量 或 购买种子 种子名 数量'
+ (f'\n下一页:种子商店 {page+1}' if page < pages else '')
)
if action == "inventory":
if args: