mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
使用道具可以附带额外信息供函数使用
This commit is contained in:
parent
d39dfbe62f
commit
55b2a86397
@ -299,6 +299,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能
|
|||||||
### 2022/11/13
|
### 2022/11/13
|
||||||
|
|
||||||
* 更新天气api
|
* 更新天气api
|
||||||
|
* 使用道具可以附带额外信息供函数使用
|
||||||
|
|
||||||
### 2022/11/12
|
### 2022/11/12
|
||||||
|
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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}")
|
||||||
|
|||||||
@ -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 # 单次使用最大次数
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user