diff --git a/README.md b/README.md index 5ab48aad..ebf87ee3 100644 --- a/README.md +++ b/README.md @@ -292,6 +292,8 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 * 我的道具改为图片形式 * 商品添加图标与是否为被动道具(被动道具无法被主动使用) * 商品添加使用前方法和使用后方法(类似hook),使用方法具体查看文档或签到商品文件中注册的例子 +* 新增用户使用道具,花费金币(包括插件)及用途记录 +* 更细致的金币使用依赖注入 * 色图插件p站反向代理失效 [@pull/1139](https://github.com/HibiKier/zhenxun_bot/pull/1139) ### 2022/10/9 diff --git a/basic_plugins/hooks/auth_hook.py b/basic_plugins/hooks/auth_hook.py index c34d0fd2..82f5ab0b 100755 --- a/basic_plugins/hooks/auth_hook.py +++ b/basic_plugins/hooks/auth_hook.py @@ -3,6 +3,7 @@ from nonebot.message import run_preprocessor, run_postprocessor, IgnoredExceptio from models.friend_user import FriendUser from models.group_member_info import GroupInfoUser from models.bag_user import BagUser +from models.user_shop_gold_log import UserShopGoldLog from utils.manager import ( plugins2settings_manager, admin_manager, @@ -59,6 +60,7 @@ async def _(matcher: Matcher, bot: Bot, event: Event, state: T_State): if await BagUser.get_gold(event.user_id, event.group_id) < cost_gold: await send_msg(f"金币不足..该功能需要{cost_gold}金币..", bot, event) raise IgnoredException(f"{module} 金币限制...") + await UserShopGoldLog.add_shop_log(event.user_id, event.group_id, 2, matcher.plugin_name, cost_gold, 1) # 当插件不阻塞超级用户时,超级用户提前扣除金币 if ( str(event.user_id) in bot.config.superusers diff --git a/basic_plugins/shop/buy.py b/basic_plugins/shop/buy.py index 8a7ab9af..99592d1c 100644 --- a/basic_plugins/shop/buy.py +++ b/basic_plugins/shop/buy.py @@ -1,6 +1,6 @@ from nonebot import on_command -from models.shop_log import ShopLog +from models.user_shop_gold_log import UserShopGoldLog from services.log import logger from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message from nonebot.params import CommandArg @@ -93,7 +93,7 @@ async def _(event: GroupMessageEvent, arg: Message = CommandArg()): f"USER {event.user_id} GROUP {event.group_id} " f"花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!" ) - await ShopLog.add_shop_log( + await UserShopGoldLog.add_shop_log( event.user_id, event.group_id, 0, diff --git a/basic_plugins/shop/use/__init__.py b/basic_plugins/shop/use/__init__.py index 0b0e2712..f13ddc0e 100644 --- a/basic_plugins/shop/use/__init__.py +++ b/basic_plugins/shop/use/__init__.py @@ -1,6 +1,6 @@ from nonebot import on_command -from models.shop_log import ShopLog +from models.user_shop_gold_log import UserShopGoldLog from services.log import logger from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message from nonebot.params import CommandArg @@ -78,7 +78,7 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()): logger.info( f"USER {event.user_id} GROUP {event.group_id} 使用道具 {name} {num} 次成功" ) - await ShopLog.add_shop_log(event.user_id, event.group_id, 1, name, num) + await UserShopGoldLog.add_shop_log(event.user_id, event.group_id, 1, name, num) else: await use_props.send(f"使用道具 {name} {num} 次失败!", at_sender=True) logger.info( diff --git a/models/shop_log.py b/models/user_shop_gold_log.py similarity index 86% rename from models/shop_log.py rename to models/user_shop_gold_log.py index 65b0041e..76868fcb 100644 --- a/models/shop_log.py +++ b/models/user_shop_gold_log.py @@ -3,13 +3,13 @@ from datetime import datetime from services.db_context import db -class ShopLog(db.Model): - __tablename__ = "shop_log" +class UserShopGoldLog(db.Model): + __tablename__ = "user_shop_gold_log" id = db.Column(db.Integer(), primary_key=True) user_qq = db.Column(db.BigInteger(), nullable=False) group_id = db.Column(db.BigInteger(), nullable=False) - type = db.Column(db.Integer(), nullable=False) # 0: 购买,1: 使用 - goods_name = db.Column(db.String(), default=100) + type = db.Column(db.Integer(), nullable=False) # 0: 购买,1: 使用,2: 插件 + name = db.Column(db.String()) spend_gold = db.Column(db.Integer(), nullable=False) num = db.Column(db.Integer(), nullable=False) create_time = db.Column(db.DateTime(timezone=True), nullable=False) @@ -20,7 +20,7 @@ class ShopLog(db.Model): user_qq: int, group_id: int, type_: int, - goods_name: str, + name: str, num: int, spend_gold: int = 0, ): @@ -31,7 +31,7 @@ class ShopLog(db.Model): :param user_qq: qq号 :param group_id: 所在群号 :param type_: 类型 - :param goods_name: 商品名称 + :param name: 商品名称 :param num: 数量 :param spend_gold: 花费金币 """ @@ -39,14 +39,14 @@ class ShopLog(db.Model): user_qq=user_qq, group_id=group_id, type=type_, - goods_name=goods_name, + name=name, num=num, spend_gold=spend_gold, create_time=datetime.now(), ) @classmethod - async def get_user_log(cls, user_qq: int, group_id: int) -> "ShopLog": + async def get_user_log(cls, user_qq: int, group_id: int) -> "UserShopGoldLog": """ 说明: 获取用户日志 diff --git a/utils/decorator/shop.py b/utils/decorator/shop.py index 6b92ca99..5105e4c2 100644 --- a/utils/decorator/shop.py +++ b/utils/decorator/shop.py @@ -2,9 +2,6 @@ from typing import Callable, Union, Tuple, Optional from nonebot.adapters.onebot.v11 import MessageSegment, Message from nonebot.plugin import require -require("use") -require("shop_handle") - class ShopRegister(dict): def __init__(self, *args, **kwargs): @@ -94,6 +91,8 @@ class ShopRegister(dict): return lambda func: add_register_item(func) async def load_register(self): + require("use") + require("shop_handle") from basic_plugins.shop.use.data_source import register_use, func_manager from basic_plugins.shop.shop_handle.data_source import register_goods # 统一进行注册 diff --git a/utils/depends/__init__.py b/utils/depends/__init__.py index e69de29b..e1857809 100644 --- a/utils/depends/__init__.py +++ b/utils/depends/__init__.py @@ -0,0 +1,24 @@ +from nonebot.adapters.onebot.v11 import GroupMessageEvent +from nonebot.internal.matcher import Matcher +from nonebot.internal.params import Depends +from models.user_shop_gold_log import UserShopGoldLog +from models.bag_user import BagUser +from utils.message_builder import at + + +def cost_gold(gold: int): + """ + 说明: + 插件方法调用使用金币 + 参数: + :param gold: 金币数量 + """ + async def dependency(matcher: Matcher, event: GroupMessageEvent): + if (await BagUser.get_gold(event.user_id, event.group_id)) < gold: + await matcher.finish(at(event.user_id) + f"金币不足..该功能需要{gold}金币..") + await BagUser.spend_gold(event.user_id, event.group_id, gold) + await UserShopGoldLog.add_shop_log(event.user_id, event.group_id, 2, matcher.plugin_name, gold, 1) + + return Depends(dependency) + +