使用道具可以附带额外信息供函数使用

This commit is contained in:
HibiKier 2022-11-13 04:12:56 +08:00
parent d39dfbe62f
commit 55b2a86397
4 changed files with 57 additions and 29 deletions

View File

@ -299,6 +299,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能
### 2022/11/13 ### 2022/11/13
* 更新天气api * 更新天气api
* 使用道具可以附带额外信息供函数使用
### 2022/11/12 ### 2022/11/12

View File

@ -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 models.user_shop_gold_log import UserShopGoldLog
from services.log import logger from services.log import logger
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message 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.decorator.shop import NotMeetUseConditionsException
from utils.utils import is_number from utils.utils import is_number
@ -18,12 +20,16 @@ __plugin_usage__ = """
usage usage
普通的使用道具 普通的使用道具
指令 指令
使用道具 [序号或道具名称] ?[数量]=1 使用道具 [序号或道具名称] ?[数量]=1 ?[其他信息]
示例使用道具好感度双倍加持卡 使用道具好感度双倍加持卡
示例使用道具1 使用第一个道具
示例使用道具1 10 使用10个第一个道具
示例使用道具1 1 来点色图 使用第一个道具并附带信息
* 序号以 我的道具 为准 * * 序号以 我的道具 为准 *
""".strip() """.strip()
__plugin_des__ = "商店 - 使用道具" __plugin_des__ = "商店 - 使用道具"
__plugin_cmd__ = ["使用道具 [序号或道具名称]"] __plugin_cmd__ = ["使用道具 [序号或道具名称]"]
__plugin_type__ = ('商店',) __plugin_type__ = ("商店",)
__plugin_version__ = 0.1 __plugin_version__ = 0.1
__plugin_author__ = "HibiKier" __plugin_author__ = "HibiKier"
__plugin_settings__ = { __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() @use_props.handle()
async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()): async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
msg = arg.extract_plain_text().strip() msg = arg.extract_plain_text()
num = 1 num = 1
msg_sp = msg.split() text = ""
if len(msg_sp) > 1 and is_number(msg_sp[-1]) and int(msg_sp[-1]) > 0: prop_n = None
num = int(msg.split()[-1]) index = None
msg = " ".join(msg.split()[:-1]) 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) property_ = await BagUser.get_property(event.user_id, event.group_id, True)
if property_: if property_:
name = None name = None
if is_number(msg): if prop_n and is_number(prop_n):
if 0 < int(msg) <= len(property_): if 0 < int(prop_n) <= len(property_):
name = list(property_.keys())[int(msg) - 1] name = list(property_.keys())[int(prop_n) - 1]
else: else:
await use_props.finish("仔细看看自己的道具仓库有没有这个道具?", at_sender=True) await use_props.finish("仔细看看自己的道具仓库有没有这个道具?", at_sender=True)
else: else:
if msg not in property_.keys(): if prop_n not in property_.keys():
await use_props.finish("道具名称错误!", at_sender=True) await use_props.finish("道具名称错误!", at_sender=True)
name = msg name = prop_n
_user_prop_count = property_[name] _user_prop_count = property_[name]
if num > _user_prop_count: if num > _user_prop_count:
await use_props.finish(f"道具数量不足,无法使用{num}次!") await use_props.finish(f"道具数量不足,无法使用{num}次!")
if num > (n := func_manager.get_max_num_limit(name)): if num > (n := func_manager.get_max_num_limit(name)):
await use_props.finish(f"该道具单次只能使用 {n} 个!") await use_props.finish(f"该道具单次只能使用 {n} 个!")
model, kwargs = build_params(bot, event, name, num) model, kwargs = build_params(bot, event, name, num, text)
try: try:
await func_manager.run_handle(type_="before_handle", param=model, **kwargs) await func_manager.run_handle(type_="before_handle", param=model, **kwargs)
except NotMeetUseConditionsException as e: except NotMeetUseConditionsException as e:
await use_props.finish(e.get_info(), at_sender=True) await use_props.finish(e.get_info(), at_sender=True)
async with db.transaction(): async with db.transaction():
if await BagUser.delete_property( if await BagUser.delete_property(event.user_id, event.group_id, name, num):
event.user_id, event.group_id, name, num
):
if func_manager.check_send_success_message(name): if func_manager.check_send_success_message(name):
await use_props.send(f"使用道具 {name} {num} 次成功!", at_sender=True) 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) await use_props.send(msg, at_sender=True)
logger.info( logger.info(
f"USER {event.user_id} GROUP {event.group_id} 使用道具 {name} {num} 次成功" 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: else:
await use_props.send(f"使用道具 {name} {num} 次失败!", at_sender=True) await use_props.send(f"使用道具 {name} {num} 次失败!", at_sender=True)
logger.info( logger.info(

View File

@ -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 services.log import logger
from nonebot.adapters.onebot.v11 import Bot from nonebot.adapters.onebot.v11 import Bot
from pydantic import create_model from pydantic import create_model
@ -140,7 +140,7 @@ class GoodsUseFuncManager:
return self._data[goods_name]["kwargs"] return self._data[goods_name]["kwargs"]
return {} 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"]( return self._data[goods_name]["model"](
**{ **{
"goods_name": goods_name, "goods_name": goods_name,
@ -149,6 +149,8 @@ class GoodsUseFuncManager:
"user_id": event.user_id, "user_id": event.user_id,
"group_id": event.group_id, "group_id": event.group_id,
"num": num, "num": num,
"message": event.message,
"text": text
} }
) )
@ -157,7 +159,7 @@ func_manager = GoodsUseFuncManager()
def build_params( 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]]: ) -> Tuple[ShopParam, Dict[str, Any]]:
""" """
说明: 说明:
@ -167,11 +169,12 @@ def build_params(
:param event: event :param event: event
:param goods_name: 商品名称 :param goods_name: 商品名称
:param num: 数量 :param num: 数量
:param text: 其他信息
:return: :return:
""" """
_kwargs = func_manager.get_kwargs(goods_name) _kwargs = func_manager.get_kwargs(goods_name)
return ( return (
func_manager.init_model(goods_name, bot, event, num), func_manager.init_model(goods_name, bot, event, num, text),
{ {
**_kwargs, **_kwargs,
"_bot": bot, "_bot": bot,
@ -179,13 +182,15 @@ def build_params(
"group_id": event.group_id, "group_id": event.group_id,
"user_id": event.user_id, "user_id": event.user_id,
"num": num, "num": num,
"text": text,
"message": event.message,
"goods_name": goods_name, "goods_name": goods_name,
}, },
) )
async def effect( 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]]: ) -> Optional[Union[str, MessageSegment]]:
""" """
商品生效 商品生效
@ -193,13 +198,15 @@ async def effect(
:param event: GroupMessageEvent :param event: GroupMessageEvent
:param goods_name: 商品名称 :param goods_name: 商品名称
:param num: 使用数量 :param num: 使用数量
:param text: 其他信息
:param message: Message
:return: 使用是否成功 :return: 使用是否成功
""" """
# 优先使用注册的商品插件 # 优先使用注册的商品插件
# try: # try:
if func_manager.exists(goods_name): if func_manager.exists(goods_name):
_kwargs = func_manager.get_kwargs(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) return await func_manager.use(model, **kwargs)
# except Exception as e: # except Exception as e:
# logger.error(f"use 商品生效函数effect 发生错误 {type(e)}{e}") # logger.error(f"use 商品生效函数effect 发生错误 {type(e)}{e}")

View File

@ -1,5 +1,5 @@
from nonebot.adapters.onebot.v11 import Bot, MessageEvent from nonebot.adapters.onebot.v11 import Message, MessageEvent
from pydantic import BaseModel, create_model from pydantic import BaseModel
from typing import Any from typing import Any
@ -10,5 +10,7 @@ class ShopParam(BaseModel):
bot: Any bot: Any
event: MessageEvent event: MessageEvent
num: int # 道具单次使用数量 num: int # 道具单次使用数量
message: Message
text: str
send_success_msg: bool = True # 是否发送使用成功信息 send_success_msg: bool = True # 是否发送使用成功信息
max_num_limit: int = 1 # 单次使用最大次数 max_num_limit: int = 1 # 单次使用最大次数