diff --git a/README.md b/README.md index 3c7a0725..7d254eb0 100644 --- a/README.md +++ b/README.md @@ -299,6 +299,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 ### 2022/11/13 * 更新天气api +* 使用道具可以附带额外信息供函数使用 ### 2022/11/12 diff --git a/basic_plugins/shop/use/__init__.py b/basic_plugins/shop/use/__init__.py index f13ddc0e..1c3ffca0 100644 --- a/basic_plugins/shop/use/__init__.py +++ b/basic_plugins/shop/use/__init__.py @@ -1,9 +1,11 @@ -from nonebot import on_command +from typing import Any, Tuple + +from nonebot import on_command, on_regex 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 +from nonebot.params import CommandArg, RegexGroup from utils.decorator.shop import NotMeetUseConditionsException from utils.utils import is_number @@ -18,12 +20,16 @@ __plugin_usage__ = """ usage: 普通的使用道具 指令: - 使用道具 [序号或道具名称] ?[数量]=1 + 使用道具 [序号或道具名称] ?[数量]=1 ?[其他信息] + 示例:使用道具好感度双倍加持卡 使用道具好感度双倍加持卡 + 示例:使用道具1 使用第一个道具 + 示例:使用道具1 10 使用10个第一个道具 + 示例:使用道具1 1 来点色图 使用第一个道具并附带信息 * 序号以 ”我的道具“ 为准 * """.strip() __plugin_des__ = "商店 - 使用道具" __plugin_cmd__ = ["使用道具 [序号或道具名称]"] -__plugin_type__ = ('商店',) +__plugin_type__ = ("商店",) __plugin_version__ = 0.1 __plugin_author__ = "HibiKier" __plugin_settings__ = { @@ -34,51 +40,63 @@ __plugin_settings__ = { } -use_props = on_command("使用道具", priority=5, block=True, permission=GROUP) +use_props = on_command(r"使用道具", priority=5, block=True, permission=GROUP) @use_props.handle() async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()): - msg = arg.extract_plain_text().strip() + msg = arg.extract_plain_text() num = 1 - msg_sp = msg.split() - if len(msg_sp) > 1 and is_number(msg_sp[-1]) and int(msg_sp[-1]) > 0: - num = int(msg.split()[-1]) - msg = " ".join(msg.split()[:-1]) + text = "" + prop_n = None + index = None + split = msg.split() + if size := len(split): + if size == 1: + prop_n = split[0].strip() + index = 1 + if size > 1 and is_number(split[1].strip()): + prop_n = split[0].strip() + num = int(split[1].strip()) + index = 2 + else: + await use_props.finish("缺少参数,请查看帮助", at_sender=True) + if index: + text = " ".join(split[index:]) property_ = await BagUser.get_property(event.user_id, event.group_id, True) if property_: name = None - if is_number(msg): - if 0 < int(msg) <= len(property_): - name = list(property_.keys())[int(msg) - 1] + if prop_n and is_number(prop_n): + if 0 < int(prop_n) <= len(property_): + name = list(property_.keys())[int(prop_n) - 1] else: await use_props.finish("仔细看看自己的道具仓库有没有这个道具?", at_sender=True) else: - if msg not in property_.keys(): + if prop_n not in property_.keys(): await use_props.finish("道具名称错误!", at_sender=True) - name = msg + name = prop_n _user_prop_count = property_[name] if num > _user_prop_count: await use_props.finish(f"道具数量不足,无法使用{num}次!") if num > (n := func_manager.get_max_num_limit(name)): await use_props.finish(f"该道具单次只能使用 {n} 个!") - model, kwargs = build_params(bot, event, name, num) + model, kwargs = build_params(bot, event, name, num, text) try: await func_manager.run_handle(type_="before_handle", param=model, **kwargs) except NotMeetUseConditionsException as e: await use_props.finish(e.get_info(), at_sender=True) async with db.transaction(): - if await BagUser.delete_property( - event.user_id, event.group_id, name, num - ): + if await BagUser.delete_property(event.user_id, event.group_id, name, num): if func_manager.check_send_success_message(name): await use_props.send(f"使用道具 {name} {num} 次成功!", at_sender=True) - if msg := await effect(bot, event, name, num): + if msg := await effect(bot, event, name, num, text, event.message): await use_props.send(msg, at_sender=True) logger.info( f"USER {event.user_id} GROUP {event.group_id} 使用道具 {name} {num} 次成功" ) - await UserShopGoldLog.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/basic_plugins/shop/use/data_source.py b/basic_plugins/shop/use/data_source.py index 84cd055e..7b8dafbf 100644 --- a/basic_plugins/shop/use/data_source.py +++ b/basic_plugins/shop/use/data_source.py @@ -1,4 +1,4 @@ -from nonebot.adapters.onebot.v11 import GroupMessageEvent, MessageSegment +from nonebot.adapters.onebot.v11 import GroupMessageEvent, MessageSegment, Message from services.log import logger from nonebot.adapters.onebot.v11 import Bot from pydantic import create_model @@ -140,7 +140,7 @@ class GoodsUseFuncManager: return self._data[goods_name]["kwargs"] return {} - def init_model(self, goods_name: str, bot: Bot, event: GroupMessageEvent, num: int): + def init_model(self, goods_name: str, bot: Bot, event: GroupMessageEvent, num: int, text: str): return self._data[goods_name]["model"]( **{ "goods_name": goods_name, @@ -149,6 +149,8 @@ class GoodsUseFuncManager: "user_id": event.user_id, "group_id": event.group_id, "num": num, + "message": event.message, + "text": text } ) @@ -157,7 +159,7 @@ func_manager = GoodsUseFuncManager() def build_params( - bot: Bot, event: GroupMessageEvent, goods_name: str, num: int + bot: Bot, event: GroupMessageEvent, goods_name: str, num: int, text: str ) -> Tuple[ShopParam, Dict[str, Any]]: """ 说明: @@ -167,11 +169,12 @@ def build_params( :param event: event :param goods_name: 商品名称 :param num: 数量 + :param text: 其他信息 :return: """ _kwargs = func_manager.get_kwargs(goods_name) return ( - func_manager.init_model(goods_name, bot, event, num), + func_manager.init_model(goods_name, bot, event, num, text), { **_kwargs, "_bot": bot, @@ -179,13 +182,15 @@ def build_params( "group_id": event.group_id, "user_id": event.user_id, "num": num, + "text": text, + "message": event.message, "goods_name": goods_name, }, ) async def effect( - bot: Bot, event: GroupMessageEvent, goods_name: str, num: int + bot: Bot, event: GroupMessageEvent, goods_name: str, num: int, text: str, message: Message ) -> Optional[Union[str, MessageSegment]]: """ 商品生效 @@ -193,13 +198,15 @@ async def effect( :param event: GroupMessageEvent :param goods_name: 商品名称 :param num: 使用数量 + :param text: 其他信息 + :param message: Message :return: 使用是否成功 """ # 优先使用注册的商品插件 # try: if func_manager.exists(goods_name): _kwargs = func_manager.get_kwargs(goods_name) - model, kwargs = build_params(bot, event, goods_name, num) + model, kwargs = build_params(bot, event, goods_name, num, text) return await func_manager.use(model, **kwargs) # except Exception as e: # logger.error(f"use 商品生效函数effect 发生错误 {type(e)}:{e}") diff --git a/utils/models/__init__.py b/utils/models/__init__.py index c830d048..754d7df7 100644 --- a/utils/models/__init__.py +++ b/utils/models/__init__.py @@ -1,5 +1,5 @@ -from nonebot.adapters.onebot.v11 import Bot, MessageEvent -from pydantic import BaseModel, create_model +from nonebot.adapters.onebot.v11 import Message, MessageEvent +from pydantic import BaseModel from typing import Any @@ -10,5 +10,7 @@ class ShopParam(BaseModel): bot: Any event: MessageEvent num: int # 道具单次使用数量 + message: Message + text: str send_success_msg: bool = True # 是否发送使用成功信息 max_num_limit: int = 1 # 单次使用最大次数