From 3d42c1d283b353a359ea2e71f13e37a0b0fafe52 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Wed, 6 Aug 2025 17:51:26 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=E7=AD=BE?= =?UTF-8?q?=E5=88=B0=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E4=BD=9C=E7=89=A9=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- command.py | 82 ++++++++++++++++++++-------- config.py | 6 +++ database/userPlant.py | 68 ++++++++++++++++++++++- database/userSign.py | 9 ++-- database/userSoil.py | 2 +- farm/farm.py | 46 +++++++++++++++- farm/help.py | 117 ++++++++++++++++++++++++++++++++++++++++ farm/shop.py | 7 +++ resource/html/help.html | 75 ++++++++++++++++++++++++++ 9 files changed, 381 insertions(+), 31 deletions(-) create mode 100644 farm/help.py create mode 100644 resource/html/help.html diff --git a/command.py b/command.py index 229f673..30948ff 100644 --- a/command.py +++ b/command.py @@ -85,6 +85,8 @@ diuse_farm = on_alconna( Subcommand("harvest", help_text="收获"), Subcommand("eradicate", help_text="铲除"), Subcommand("my-plant", help_text="我的作物"), + Subcommand("lock-plant", Args["name?", str], help_text="作物加锁"), + Subcommand("unlock-plant", Args["name?", str], help_text="作物解锁"), Subcommand("sell-plant", Args["name?", str]["num?", int], help_text="出售作物"), Subcommand("stealing", Args["target?", At], help_text="偷菜"), Subcommand("buy-point", Args["num?", int], help_text="购买农场币"), @@ -328,6 +330,65 @@ async def _(session: Uninfo): await MessageUtils.build_message(result).send(reply_to=True) +diuse_farm.shortcut( + "作物加锁(?P)", + command="我的农场", + arguments=["lock-plant", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("lock-plant") +async def _(session: Uninfo, name: Match[str]): + uid = str(session.user.id) + + if not await g_pToolManager.isRegisteredByUid(uid): + return + + result = await g_pFarmManager.lockUserPlantByUid(uid, name.result, 1) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "作物解锁(?P)", + command="我的农场", + arguments=["unlock-plant", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("unlock-plant") +async def _(session: Uninfo, name: Match[str]): + uid = str(session.user.id) + + if not await g_pToolManager.isRegisteredByUid(uid): + return + + result = await g_pFarmManager.lockUserPlantByUid(uid, name.result, 0) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "出售作物(?P.*?)", + command="我的农场", + arguments=["sell-plant", "{name}"], + prefix=True, +) + + +@diuse_farm.assign("sell-plant") +async def _( + session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", -1) +): + uid = str(session.user.id) + + if not await g_pToolManager.isRegisteredByUid(uid): + return + + result = await g_pShopManager.sellPlantByUid(uid, name.result, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + reclamation = on_alconna( Alconna("开垦"), priority=5, @@ -364,27 +425,6 @@ async def _(session: Uninfo): await MessageUtils.build_message(res).send(reply_to=True) -diuse_farm.shortcut( - "出售作物(?P.*?)", - command="我的农场", - arguments=["sell-plant", "{name}"], - prefix=True, -) - - -@diuse_farm.assign("sell-plant") -async def _( - session: Uninfo, name: Match[str], num: Query[int] = AlconnaQuery("num", -1) -): - uid = str(session.user.id) - - if not await g_pToolManager.isRegisteredByUid(uid): - return - - result = await g_pShopManager.sellPlantByUid(uid, name.result, num.result) - await MessageUtils.build_message(result).send(reply_to=True) - - diuse_farm.shortcut( "偷菜", command="我的农场", diff --git a/config.py b/config.py index c878887..d2f73a9 100644 --- a/config.py +++ b/config.py @@ -121,4 +121,10 @@ g_sTranslation = { "aquamarine": "增产+32% 经验+32% 时间-28% 幸运+1%", "blackcrystal": "增产+32% 经验+40% 时间-28% 幸运+2%", }, + "lockPlant": { + "noPlant": "很抱歉,你的作物仓库中没有该作物", + "lockPlant": "加锁成功,现在{name}不会被一键售卖了", + "unlockPlant": "解锁成功,现在{name}会被一键售卖了", + "error": "未知错误", + }, } diff --git a/database/userPlant.py b/database/userPlant.py index 4d403d8..7f8492e 100644 --- a/database/userPlant.py +++ b/database/userPlant.py @@ -10,6 +10,7 @@ class CUserPlantDB(CSqlManager): "uid": "TEXT NOT NULL", # 用户Uid "plant": "TEXT NOT NULL", # 作物名称 "count": "INTEGER NOT NULL DEFAULT 0", # 数量 + "isLock": "INTEGER NOT NULL DEFAULT 0", # 是否上锁 0=没有,非0=有 "PRIMARY KEY": "(uid, plant)", } @@ -91,6 +92,27 @@ class CUserPlantDB(CSqlManager): logger.warning("getUserPlantByName 查询失败!", e=e) return None + @classmethod + async def checkUserPlantByName(cls, uid: str, plant: str) -> bool: + """根据作物名称判断用户作物仓库是否存在该作物 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + + Returns: + bool: 是否存在 + """ + try: + async with cls.m_pDB.execute( + "SELECT * FROM userPlant WHERE uid = ? AND plant = ?", (uid, plant) + ) as cursor: + row = await cursor.fetchone() + return True if row else False + except Exception as e: + logger.warning("checkUserPlantByName 查询失败!", e=e) + return False + @classmethod async def updateUserPlantByName(cls, uid: str, plant: str, count: int) -> bool: """更新 userPlant 表中某个作物的数量 @@ -114,7 +136,51 @@ class CUserPlantDB(CSqlManager): ) return True except Exception as e: - logger.warning("updateUserPlantByName失败!", e=e) + logger.warning("updateUserPlantByName 失败!", e=e) + return False + + @classmethod + async def lockUserPlantByName(cls, uid: str, plant: str, lock: int) -> bool: + """给作物加锁,防止一键售卖 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + lock (int): 0为解锁,非0均为加锁 + + Returns: + bool: 是否加锁成功 + """ + try: + async with cls._transaction(): + await cls.m_pDB.execute( + "UPDATE userPlant SET isLock = ? WHERE uid = ? AND plant = ?", + (lock, uid, plant), + ) + return True + except Exception as e: + logger.warning("lockUserPlantByName 失败!", e=e) + return False + + @classmethod + async def checkPlantLockByName(cls, uid: str, plant: str) -> bool: + """根据作物名称判断是否加锁 + + Args: + uid (str): 用户uid + plant (str): 作物名称 + + Returns: + bool: 是否加锁 + """ + try: + async with cls.m_pDB.execute( + "SELECT isLock FROM userPlant WHERE uid = ? AND plant = ?", (uid, plant) + ) as cursor: + row = await cursor.fetchone() + return row[0] > 0 if row else False + except Exception as e: + logger.warning("checkUserPlantByName 查询失败!", e=e) return False @classmethod diff --git a/database/userSign.py b/database/userSign.py index ffe2abe..4046572 100644 --- a/database/userSign.py +++ b/database/userSign.py @@ -165,7 +165,6 @@ class CUserSignDB(CSqlManager): if row["currentMonth"] == currentMonth else 1 ) - totalSignDays = row["totalSignDays"] lastDate = row["lastSignDate"] prevDate = ( g_pToolManager.dateTime().strptime(signDate, "%Y-%m-%d") @@ -200,7 +199,7 @@ class CUserSignDB(CSqlManager): ), ) else: - totalSignDays = 1 + monthSignDays = 1 await cls.m_pDB.execute( """ INSERT INTO userSignSummary @@ -211,7 +210,7 @@ class CUserSignDB(CSqlManager): uid, 1, currentMonth, - 1, + monthSignDays, signDate, 1, 1 if isSupplement else 0, @@ -219,15 +218,13 @@ class CUserSignDB(CSqlManager): ) # 计算累签奖励 - reward = g_pJsonManager.m_pSign["continuou"].get(f"{totalSignDays}", None) - + reward = g_pJsonManager.m_pSign["continuou"].get(f"{monthSignDays}", None) if reward: point += reward.get("point", 0) exp += reward.get("exp", 0) vipPoint = reward.get("vipPoint", 0) plant = reward.get("plant", {}) - if plant: for key, value in plant.items(): await g_pDBService.userSeed.addUserSeedByUid(uid, key, value) diff --git a/database/userSoil.py b/database/userSoil.py index 48bce09..ad16ee6 100644 --- a/database/userSoil.py +++ b/database/userSoil.py @@ -24,7 +24,7 @@ class CUserSoilDB(CSqlManager): "weedStatus": "INTEGER DEFAULT 0", # 杂草状态 0=无杂草,1=有杂草 "waterStatus": "INTEGER DEFAULT 0", # 缺水状态 0=不缺水,1=缺水 "harvestCount": "INTEGER DEFAULT 0", # 收获次数 - "isSoilPlanted": "INTEGER DEFAULT NULL", # 是否种植作物 + "isSoilPlanted": "INTEGER DEFAULT NULL", # 是否种植作物 0=没有,1=有 "PRIMARY KEY": "(uid, soilIndex)", } diff --git a/farm/farm.py b/farm/farm.py index f88e110..cef620a 100644 --- a/farm/farm.py +++ b/farm/farm.py @@ -159,6 +159,7 @@ class CFarmManager: if image: avatar = BuildImage(background=image) + await avatar.resize(0, 140, 150) await img.paste(avatar, (125, 85)) # 头像框 @@ -732,7 +733,15 @@ class CFarmManager: bytes: 返回图片 """ data_list = [] - column_name = ["-", "作物名称", "数量", "单价", "总价", "是否可以上架交易行"] + column_name = [ + "-", + "作物名称", + "数量", + "单价", + "总价", + "是否上锁", + "是否可以上架交易行", + ] plant = await g_pDBService.userPlant.getUserPlantByUid(uid) @@ -763,7 +772,15 @@ class CFarmManager: number = int(count) * plantInfo["price"] - data_list.append([icon, name, count, plantInfo["price"], number, sell]) + isLock = await g_pDBService.userPlant.checkPlantLockByName(uid, name) + if isLock: + lock = "上锁" + else: + lock = "未上锁" + + data_list.append( + [icon, name, count, plantInfo["price"], number, lock, sell] + ) result = await ImageTemplate.table_page( "作物仓库", @@ -774,6 +791,31 @@ class CFarmManager: return result.pic2bytes() + @classmethod + async def lockUserPlantByUid(cls, uid: str, name: str, lock: int) -> str: + """加/解 锁用户作物 + + Args: + uid (str): 用户uid + name (str): 作物名称 + lock (int): 0=解锁 非0=加锁 + + Returns: + str: 返回 + """ + # 先判断该用户仓库是否有该作物 + if not await g_pDBService.userPlant.checkUserPlantByName(uid, name): + return g_sTranslation["lockPlant"]["noPlant"] + + # 更改加锁状态 + if await g_pDBService.userPlant.lockUserPlantByName(uid, name, lock): + if lock == 0: + return g_sTranslation["lockPlant"]["unlockPlant"].format(name=name) + else: + return g_sTranslation["lockPlant"]["lockPlant"].format(name=name) + else: + return g_sTranslation["lockPlant"]["error"] + @classmethod async def stealing(cls, uid: str, target: str) -> str: """偷菜 diff --git a/farm/help.py b/farm/help.py new file mode 100644 index 0000000..8094376 --- /dev/null +++ b/farm/help.py @@ -0,0 +1,117 @@ +from pathlib import Path + +from jinja2 import Template +from playwright.async_api import async_playwright + +from zhenxun.configs.path_config import DATA_PATH +from zhenxun.services.log import logger + +from ..config import g_sResourcePath + + +def rendeerHtmlToFile(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") + + +async def screenshotHtmlToBytes(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() + file_url = Path(path).resolve().as_uri() + await page.goto(file_url) + image_bytes = await page.screenshot(full_page=True) + await browser.close() + + return image_bytes + + +async def screenshotSave(path: str, save: str) -> None: + """ + 使用 Playwright 渲染本地 HTML 并将截图保存到指定路径 + + Args: + path (str): HTML 文件路径 + save (str): PNG 保存路径(如 output/image.png) + """ + async with async_playwright() as p: + browser = await p.chromium.launch() + page = await browser.new_page() + + file_url = Path(path).resolve().as_uri() + await page.goto(file_url) + + # 确保保存目录存在 + Path(save).parent.mkdir(parents=True, exist_ok=True) + + # 截图并保存到本地文件 + await page.screenshot(path=save, full_page=True) + await browser.close() + + +async def createHelpImage() -> bool: + templatePath = g_sResourcePath / "html/help.html" + outputPath = DATA_PATH / "farm_res/html/help.html" + + context = { + "title": "功能指令总览", + "data": [ + { + "command": "开通农场", + "description": "首次进入游戏开通农场", + "tip": "", + }, + { + "command": "购买种子", + "description": "从商店中购买可用种子", + "tip": "", + }, + {"command": "播种", "description": "将种子种入土地中", "tip": "先开垦土地"}, + { + "command": "收获", + "description": "收获成熟作物获得收益", + "tip": "", + }, + { + "command": "偷菜", + "description": "从好友农场中偷取成熟作物", + "tip": "1", + }, + ], + } + + try: + rendeerHtmlToFile(templatePath, context, outputPath) + + image_bytes = await screenshot_html_to_bytes(html_output_path) + except Exception as e: + logger.warning("绘制农场帮助菜单失败", e=e) + return False + + return True diff --git a/farm/shop.py b/farm/shop.py index 4f1bb10..812b1e2 100644 --- a/farm/shop.py +++ b/farm/shop.py @@ -167,6 +167,13 @@ class CShopManager: if name == "": for plantName, count in plant.items(): + isLock = await g_pDBService.userPlant.checkPlantLockByName( + uid, plantName + ) + + if isLock: + continue + plantInfo = await g_pDBService.plant.getPlantByName(plantName) if not plantInfo: continue diff --git a/resource/html/help.html b/resource/html/help.html new file mode 100644 index 0000000..2c6dc6d --- /dev/null +++ b/resource/html/help.html @@ -0,0 +1,75 @@ + + + + + {{ title }} + + + +
+
+
{{ title }}
+ + + + + + + + + + {% for entry in data %} + + + + + + {% endfor %} + +
指令描述Tip
{{ entry.command }}{{ entry.description }}{{ entry.tip }}
+
+
+ + From 01fceaa4fefe50a9c880221aece17a7c83968551 Mon Sep 17 00:00:00 2001 From: Mualamx Date: Fri, 10 Oct 2025 10:58:46 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=86=9C=E5=9C=BA?= =?UTF-8?q?=E5=B8=81=E6=8D=A2=E7=82=B9=E5=88=B8=E3=80=81=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E7=82=B9=E5=88=B8=EF=BC=8C?= =?UTF-8?q?=E5=81=B7=E5=81=B7=E5=8A=A0=E5=90=8E=E9=97=A8=E6=94=B9=E5=86=9C?= =?UTF-8?q?=E5=9C=BA=E5=B8=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 6 +++++ command.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ config.py | 1 + farm/farm.py | 22 ++++++++++++++++ 4 files changed, 102 insertions(+) diff --git a/__init__.py b/__init__.py index 77ba75b..9c139ae 100644 --- a/__init__.py +++ b/__init__.py @@ -58,6 +58,12 @@ __plugin_meta__ = PluginMetadata( help="金币兑换农场币的倍数 默认值为: 2倍", default_value="2", ), + RegisterConfig( + key="点券兑换倍数", + value="2000", + help="农场币兑换点券的倍数 比例为2000:1", + default_value="2000", + ), RegisterConfig( key="手续费", value="0.2", diff --git a/command.py b/command.py index 229f673..32c4117 100644 --- a/command.py +++ b/command.py @@ -92,6 +92,9 @@ diuse_farm = on_alconna( Subcommand("change-name", Args["name?", str], help_text="更改农场名"), Subcommand("sign-in", help_text="农场签到"), Subcommand("admin-up", Args["num?", int], help_text="农场下阶段"), + Subcommand("point-to-vipPoint", Args["num?", int], help_text="农场币换点券"), + Subcommand("my-vipPoint", help_text="我的点券"), + Subcommand("mx-change", Args["num?", int], help_text="mx管理员变更农场币"), ), priority=5, block=True, @@ -606,3 +609,73 @@ async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): return await g_pDBService.userSoil.nextPhase(uid, num.result) + + +diuse_farm.shortcut( + "农场币换点券(.*?)", + command="我的农场", + arguments=["point-to-vipPoint"], + prefix=True, +) + + +@diuse_farm.assign("point-to-vipPoint") +async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): + if num.result <= 0: + await MessageUtils.build_message("请在指令后跟需要购买点券的数量").finish( + reply_to=True + ) + + uid = str(session.user.id) + + if not await g_pToolManager.isRegisteredByUid(uid): + return + + result = await g_pFarmManager.pointToVipPointByUid(uid, num.result) + await MessageUtils.build_message(result).send(reply_to=True) + + +diuse_farm.shortcut( + "我的点券", + command="我的农场", + arguments=["my-vipPoint"], + prefix=True, +) + + +@diuse_farm.assign("my-vipPoint") +async def _(session: Uninfo): + uid = str(session.user.id) + vipPoint = await g_pDBService.user.getUserVipPointByUid(uid) + + if not await g_pToolManager.isRegisteredByUid(uid): + return + + await MessageUtils.build_message( + g_sTranslation["basic"]["vipPoint"].format(vipPoint=vipPoint) + ).send(reply_to=True) + + +diuse_farm.shortcut( + "mx管理员变更农场币(.*?)", + command="我的农场", + arguments=["mx-change"], + prefix=True, +) + + +@diuse_farm.assign("mx-change") +async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): + if num.result <= 0: + await MessageUtils.build_message("请在指令后跟需要农场币的数量").finish( + reply_to=True + ) + + uid = str(session.user.id) + + if not await g_pToolManager.isRegisteredByUid(uid): + return + + await g_pDBService.user.updateUserPointByUid(uid, int(num.result)) + message = f"伟大的米线大人把你的农场币变更为: {num.result} 农场币" + await MessageUtils.build_message(message).send(reply_to=True) diff --git a/config.py b/config.py index c878887..cbd3030 100644 --- a/config.py +++ b/config.py @@ -34,6 +34,7 @@ g_sTranslation = { "basic": { "notFarm": "尚未开通农场,快at我发送 开通农场 开通吧 🌱🚜", "point": "你的当前农场币为: {point} 🌾💰", + "vipPoint": "你的当前点券为: {vipPoint} 🌾💰", }, "register": { "success": "✅ 农场开通成功!\n💼 初始资金:{point}农场币 🥳🎉", diff --git a/farm/farm.py b/farm/farm.py index f88e110..6183416 100644 --- a/farm/farm.py +++ b/farm/farm.py @@ -1106,5 +1106,27 @@ class CFarmManager: text=g_sTranslation["soilInfo"][soilLevelText], ) + @classmethod + async def pointToVipPointByUid(cls, uid: str, num: int) -> str: + if num <= 0: + return "点券兑换数量必须大于0" + + pro = float(Config.get_config("zhenxun_plugin_farm", "点券兑换倍数")) + pro *= float(num) + + point = await g_pDBService.user.getUserPointByUid(uid) + if point < pro: + return f"你的农场币不足,当前农场币为{point},兑换还需要{pro - point}农场币" + + point -= pro + await g_pDBService.user.updateUserPointByUid(uid, int(point)) + + p = await g_pDBService.user.getUserVipPointByUid(uid) + number = float(num) + p + + await g_pDBService.user.updateUserVipPointByUid(uid, int(number)) + + return f"兑换{num}点券成功,当前点券:{number},当前农场币:{point}" + g_pFarmManager = CFarmManager() From eb937dd309704fd4150b7ac20336f9c86de90f15 Mon Sep 17 00:00:00 2001 From: Mualamx Date: Fri, 10 Oct 2025 13:32:45 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=86=9C=E5=9C=BA?= =?UTF-8?q?=E5=B8=81=E6=8D=A2=E7=82=B9=E5=88=B8=E3=80=81=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E7=82=B9=E5=88=B8=EF=BC=8C?= =?UTF-8?q?=E5=81=B7=E5=81=B7=E5=8A=A0=E5=90=8E=E9=97=A8=E6=94=B9=E5=86=9C?= =?UTF-8?q?=E5=9C=BA=E5=B8=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- farm/farm.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/farm/farm.py b/farm/farm.py index 0b340ae..c2236f0 100644 --- a/farm/farm.py +++ b/farm/farm.py @@ -1150,11 +1150,15 @@ class CFarmManager: @classmethod async def pointToVipPointByUid(cls, uid: str, num: int) -> str: + """农场币兑换点券 + num:用户传参,即将兑换的点券 + pro:兑换倍数;兑换倍数乘以num即为需要消耗的农场币 + """ if num <= 0: return "点券兑换数量必须大于0" - pro = float(Config.get_config("zhenxun_plugin_farm", "点券兑换倍数")) - pro *= float(num) + pro = int(Config.get_config("zhenxun_plugin_farm", "点券兑换倍数")) + pro *= num point = await g_pDBService.user.getUserPointByUid(uid) if point < pro: @@ -1164,7 +1168,7 @@ class CFarmManager: await g_pDBService.user.updateUserPointByUid(uid, int(point)) p = await g_pDBService.user.getUserVipPointByUid(uid) - number = float(num) + p + number = num + p await g_pDBService.user.updateUserVipPointByUid(uid, int(number)) From 4ab21b7f7bf344ed48f76b900113fdb9fae6451d Mon Sep 17 00:00:00 2001 From: Mualamx Date: Sun, 12 Oct 2025 03:35:14 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=F0=9F=94=A5=20=E5=88=A0=E9=99=A4=E5=90=8E?= =?UTF-8?q?=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- command.py | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/command.py b/command.py index 3bb43d2..5cd3886 100644 --- a/command.py +++ b/command.py @@ -95,8 +95,7 @@ diuse_farm = on_alconna( Subcommand("sign-in", help_text="农场签到"), Subcommand("admin-up", Args["num?", int], help_text="农场下阶段"), Subcommand("point-to-vipPoint", Args["num?", int], help_text="农场币换点券"), - Subcommand("my-vipPoint", help_text="我的点券"), - Subcommand("mx-change", Args["num?", int], help_text="mx管理员变更农场币"), + Subcommand("my-vipPoint", help_text="我的点券") ), priority=5, block=True, @@ -696,26 +695,3 @@ async def _(session: Uninfo): ).send(reply_to=True) -diuse_farm.shortcut( - "mx管理员变更农场币(.*?)", - command="我的农场", - arguments=["mx-change"], - prefix=True, -) - - -@diuse_farm.assign("mx-change") -async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): - if num.result <= 0: - await MessageUtils.build_message("请在指令后跟需要农场币的数量").finish( - reply_to=True - ) - - uid = str(session.user.id) - - if not await g_pToolManager.isRegisteredByUid(uid): - return - - await g_pDBService.user.updateUserPointByUid(uid, int(num.result)) - message = f"伟大的米线大人把你的农场币变更为: {num.result} 农场币" - await MessageUtils.build_message(message).send(reply_to=True) From 34d4f698dd13c7f07701afc1841574249429135f Mon Sep 17 00:00:00 2001 From: Mualamx Date: Sun, 12 Oct 2025 05:15:24 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E2=9C=A8=20=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=AD=97=E6=AE=B5=EF=BC=88=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E4=B8=BA=E7=82=B9=E5=88=B8=E4=BD=9C=E7=89=A9=EF=BC=8C=E7=82=B9?= =?UTF-8?q?=E5=88=B8=E4=BD=9C=E7=89=A9=E5=8D=95=E4=BB=B7=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=82=B9=E5=88=B8=E8=B4=AD=E4=B9=B0=E7=A7=8D?= =?UTF-8?q?=E5=AD=90=EF=BC=9B=E6=88=91=E7=9A=84=E7=A7=8D=E5=AD=90=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0=E7=82=B9=E5=88=B8?= =?UTF-8?q?=E5=8D=95=E4=BB=B7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- command.py | 4 +--- config.py | 2 ++ farm/shop.py | 34 +++++++++++++++++++++++----------- resource/db/plant.db | Bin 36864 -> 36864 bytes 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/command.py b/command.py index 5cd3886..01c077e 100644 --- a/command.py +++ b/command.py @@ -95,7 +95,7 @@ diuse_farm = on_alconna( Subcommand("sign-in", help_text="农场签到"), Subcommand("admin-up", Args["num?", int], help_text="农场下阶段"), Subcommand("point-to-vipPoint", Args["num?", int], help_text="农场币换点券"), - Subcommand("my-vipPoint", help_text="我的点券") + Subcommand("my-vipPoint", help_text="我的点券"), ), priority=5, block=True, @@ -693,5 +693,3 @@ async def _(session: Uninfo): await MessageUtils.build_message( g_sTranslation["basic"]["vipPoint"].format(vipPoint=vipPoint) ).send(reply_to=True) - - diff --git a/config.py b/config.py index 19f837c..091c386 100644 --- a/config.py +++ b/config.py @@ -46,7 +46,9 @@ g_sTranslation = { "notNum": "❗️ 请输入购买数量!", "noLevel": "🔒 你的等级不够哦,努努力吧 💪", "noPoint": "💰 你的农场币不够哦~ 快速速氪金吧!💸", + "noVipPoint": "💰 你的点券不够哦~ 快速速氪金吧!💸", "success": "✅ 成功购买{name},花费{total}农场币,剩余{point}农场币 🌾", + "vipSuccess": "✅ 成功购买{name},花费{total}点券,剩余{point}点券 🌾", "errorSql": "❌ 购买失败,执行数据库错误!🛑", "error": "❌ 购买出错!请检查需购买的种子名称!🔍", }, diff --git a/farm/shop.py b/farm/shop.py index 812b1e2..e1a8b00 100644 --- a/farm/shop.py +++ b/farm/shop.py @@ -1,6 +1,5 @@ import math -from zhenxun.services.log import logger from zhenxun.utils.image_utils import ImageTemplate from ..config import g_sResourcePath, g_sTranslation @@ -33,7 +32,8 @@ class CShopManager: columnName = [ "-", "种子名称", - "种子单价", + "农场币", + "点券", "解锁等级", "果实单价", "收获经验", @@ -77,7 +77,8 @@ class CShopManager: [ icon, plant["name"], # 种子名称 - plant["buy"], # 种子单价 + plant["buy"], # 农场币种子单价 + plant["vipBuy"], # 点券种子单价 plant["level"], # 解锁等级 plant["price"], # 果实单价 plant["experience"], # 收获经验 @@ -125,21 +126,32 @@ class CShopManager: if level[0] < int(plantInfo["level"]): return g_sTranslation["buySeed"]["noLevel"] - point = await g_pDBService.user.getUserPointByUid(uid) - total = int(plantInfo["buy"]) * num - + """ logger.debug( f"用户:{uid}购买{name},数量为{num}。用户农场币为{point},购买需要{total}" ) - - if point < total: - return g_sTranslation["buySeed"]["noPoint"] + """ + if plantInfo["isVip"] == 1: + vipPoint = await g_pDBService.user.getUserVipPointByUid(uid) + total = int(plantInfo["vipBuy"]) * num + if vipPoint < total: + return g_sTranslation["buySeed"]["noVipPoint"] + await g_pDBService.user.updateUserVipPointByUid(uid, vipPoint - total) else: + point = await g_pDBService.user.getUserPointByUid(uid) + total = int(plantInfo["buy"]) * num + if point < total: + return g_sTranslation["buySeed"]["noPoint"] await g_pDBService.user.updateUserPointByUid(uid, point - total) - if not await g_pDBService.userSeed.addUserSeedByUid(uid, name, num): - return g_sTranslation["buySeed"]["errorSql"] + if not await g_pDBService.userSeed.addUserSeedByUid(uid, name, num): + return g_sTranslation["buySeed"]["errorSql"] + if plantInfo["isVip"] == 1: + return g_sTranslation["buySeed"]["vipSuccess"].format( + name=name, total=total, point=vipPoint - total + ) + else: return g_sTranslation["buySeed"]["success"].format( name=name, total=total, point=point - total ) diff --git a/resource/db/plant.db b/resource/db/plant.db index a198f3175d201bd5802bd9dfa619bac092faba6a..7597ade2d05f8feebdd464ff5e3175c52302f4ea 100644 GIT binary patch literal 36864 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 delta 5577 zcmeI0Yiv{J8OME&W54J4a!%q)oSR7~yX0~b5=`P;?AUP#NgmF4>f3{JtQK@yK zD&43)Pv{YPMw7Bq$mjv`6NWm4r|DIpfJj+ScKW(|X%m-9Q^Z7G%4%DXsA=Csg0C*=!7L=vuRO^M-XD?N4=vezDa{YO1saTIgD(>aUwkWYvN8 z(KLMyL$7hWN1eh^hAE^s#B6hdO2stGy4{Z!5L-nBv)4lx@(xBj8sKeAK$jy=f)PKH zB}Dv8)Ckvw0ij+Hj5myf#s*`O;cdgPVX48Ue^-B0zf^D0-P8^1mg#K#E&h3aIiJei z;)b|JP9!(TGo+sAv_I4C)Rt@hrMax>(acS_lW;zvH6c$uuKuBVt=i7M&pyX4WlhXG z%pqnGlSWi;K*w8(O{!FehTu9L2@NyOJ+mj6ND@VF^yxc@+R(&1feaSxJbz<9JC07t{39@K|JjKY5*vd)eT;wCRGU9O{--5Vj z4sv=*IjJeaoU2p3#8ZgzQxLD5jr>VU8L2ElmQu@zJ0H0%wUoFeWoc7r7{{ zlvL&*ccejEEAlH4_gIkcrolRxagL?wFc*_qWoOiMJFqJWHLs;Ri7PS0hcld{QpB(~ zql~x&C;*iMoSXpn}s-Ve}ArHNz5VB}NdZ4nh+;nUentLpRII2XlQcaRVjF7Z1Vd@rQpHK!E1Y92^5`g z)hjx$2~8+K8|{*^^YALgE><_M=p5G~K!3eRu@)J5_i5UuRWz;P@Ka@IaZYVy+&JKg zQ>Q}XzA`p(8iqgpo~_eBEqZaa7K37LH@=GC!M{n;bb9;RAjCQ1H;D;Mvh@E2=b&@&yS$EWG5q zp9}w$FJV@^Bo2%3i6cUnI3SjbK_MWvh?(LYu~C>5#>ADvo1#UyAo9W;u?B9}5#gRN z4AwvpMpv&s$pl<*35u_YyTqFR@%4+h@6cZFR~PM97cEQwuP@qm_a+B>QYDUwPm50B zpTa9br!d?2H{*|teq*lTW5dga^@dsczvxfspU`LOKGeOSTduS6@9=|sJ+J3}$@OzJ z97C>>UQ(*Pqdl)})n;q{syVKCOd}@zB4KZWNBwX06?M0|ko}ZBd0|&6%lUT67e08h zggI__Bj5P&W?|@!3f~-_<0ifU@-3NnBF}KRiFXIui}eohpxZ+R^OB>Gt$rHNLhm_d zlX>4kb;(>0ncs_EZRgx7GH)BkuS0y^R^-HD4_n<6%FMHW}VCtkZw0-=SCQj_5M^mw6BOdu}E96WO4>tKFd$G)FYq zP*M5RZ>v|ZpRir5is@(Us?$TeR#`h9GBL4LRIyw})kdsYv{BpN57(O%_A0TyYvW8s zGPEnrbZ@Ox`M`!}Tb3dN+Qxu`>WVg4Ix^$_(@FJp`Cx!8|IIvi%`h=gCn-xsKW(UU zgw3-x%JjC`<2v%w=R+N#)83k)5JXJb2X&Idl+9{QkJI=ICJ%mZ@)@dQS6R|iQds(D zyP2*`)lHe39P8$^sb&!qpC9Amtv#u6qJTuBZJTv-N}R}_N29&|Or_oKvBfnAicJu1ODBJ2!jMMn(=SoeqmE0&Q^pU#9TQ60{*u?wS zJ>7yLLwHmIjdr-!ZezU2NPin;gROo;oXBs8@xf7NV4GgC;^D6K4_I?;)+su}UH8+0 zMT%XIUZ@^EP9LCeDfRcQ(YiTB)5yLFi=+0fn@po=P-^VCSiHr4h_!2#EyESy;Nsjb zQvt5mK(5#d@OO)I9=rnFk^oy0ouQK^HAr>So+p?~sIbIxI(BBAY8XvS38SXbrDEiZ zhuF3~@bz14`NLAEf2N-N`|ei{W8&d^kLU{ZX1n5OWXuZp7u&5dR4M6H;yzIa#m_y# z+WWPs?P2hfBjBX(CM&*_a9De1#fwU)-IiY#vus$n2g60%pcH)RRH%F#jI6^KU%>na DsjL?; From f62008209f6eb2f24392a6dd9df647cc1ee03a5c Mon Sep 17 00:00:00 2001 From: Mualamx Date: Sun, 12 Oct 2025 06:07:16 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=F0=9F=8E=A8=20'=E5=86=9C=E5=9C=BA=E5=B8=81?= =?UTF-8?q?=E6=8D=A2=E7=82=B9=E5=88=B8'=E6=94=B9=E4=B8=BA'=E7=82=B9?= =?UTF-8?q?=E5=88=B8=E5=85=91=E6=8D=A2'=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=85=91=E6=8D=A2=E7=82=B9=E5=88=B8=E9=98=88=E5=80=BC=E8=B5=A0?= =?UTF-8?q?=E9=80=81=E8=A7=84=E5=88=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- command.py | 4 ++-- farm/farm.py | 41 ++++++++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/command.py b/command.py index 01c077e..9e83925 100644 --- a/command.py +++ b/command.py @@ -94,7 +94,7 @@ diuse_farm = on_alconna( Subcommand("change-name", Args["name?", str], help_text="更改农场名"), Subcommand("sign-in", help_text="农场签到"), Subcommand("admin-up", Args["num?", int], help_text="农场下阶段"), - Subcommand("point-to-vipPoint", Args["num?", int], help_text="农场币换点券"), + Subcommand("point-to-vipPoint", Args["num?", int], help_text="点券兑换"), Subcommand("my-vipPoint", help_text="我的点券"), ), priority=5, @@ -651,7 +651,7 @@ async def _(session: Uninfo, num: Query[int] = AlconnaQuery("num", 0)): diuse_farm.shortcut( - "农场币换点券(.*?)", + "点券兑换(.*?)", command="我的农场", arguments=["point-to-vipPoint"], prefix=True, diff --git a/farm/farm.py b/farm/farm.py index c2236f0..b8adf95 100644 --- a/farm/farm.py +++ b/farm/farm.py @@ -1150,12 +1150,25 @@ class CFarmManager: @classmethod async def pointToVipPointByUid(cls, uid: str, num: int) -> str: - """农场币兑换点券 + """点券兑换 num:用户传参,即将兑换的点券 pro:兑换倍数;兑换倍数乘以num即为需要消耗的农场币 + Args: + uid (str): 用户Uid + num (int): 兑换点券数量 + Returns: + str: 返回结果 + 兑换比例在配置文件中配置 + 目前配置文件中默认是20倍 + 100点券需要20000农场币 + 赠送点券规则: + 小于2000点券:0 + 2000-5000点券:100 + 5000-50000点券:280 + 大于50000点券:3000 """ - if num <= 0: - return "点券兑换数量必须大于0" + if num < 100: + return "点券兑换数量必须大于等于100" pro = int(Config.get_config("zhenxun_plugin_farm", "点券兑换倍数")) pro *= num @@ -1164,15 +1177,25 @@ class CFarmManager: if point < pro: return f"你的农场币不足,当前农场币为{point},兑换还需要{pro - point}农场币" + p = await g_pDBService.user.getUserVipPointByUid(uid) + + giftPoints: int + if num < 2000: + giftPoints = 0 + elif num < 5000: + giftPoints = 100 + elif num < 50000: + giftPoints = 280 + else: + giftPoints = 3000 + + number = num + p + giftPoints + await g_pDBService.user.updateUserVipPointByUid(uid, int(number)) + point -= pro await g_pDBService.user.updateUserPointByUid(uid, int(point)) - p = await g_pDBService.user.getUserVipPointByUid(uid) - number = num + p - - await g_pDBService.user.updateUserVipPointByUid(uid, int(number)) - - return f"兑换{num}点券成功,当前点券:{number},当前农场币:{point}" + return f"兑换{num}点券成功,当前点券:{number},赠送点券:{giftPoints},当前农场币:{point}" g_pFarmManager = CFarmManager()