hibikier
# 添加商品和对应使用方法
在不修改shop插件代码的情况,添加商品和对应生效方法
# 导入方法
# 导入添加商品的 export 和 注册方法的 export
from nonebot.plugin import require
# use 提供了一个方法
# use.register_use(goods_name: str, **kwargs) : 注册插件使用方法
# shop提供了三个方法
#
# 注册商品
# shop.register_goods(
# name: str, # 商品名称
# price: int, # 商品价格
# des: str, # 商品简介
# discount: Optional[float] = 1, # 商品折扣
# limit_time: Optional[int] = 0, # 商品限时
# **kwargs,
# )
# 删除商品
# shop.delete_goods(name: str, id_: int)
# 更新商品
# shop.update_goods(**kwargs)
use = require("use")
shop = require("shop_handle")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 注册商品和生效方法
注册商品方法可以通过功能
添加商品替代,在代码中一般为启动注册
# 注册商品
await shop.register_goods(
"好感度双倍加持卡Ⅰ", 30, "下次签到双倍好感度概率 + 10%(谁才是真命天子?)(同类商品将覆盖)"
)
# 定义生效方法
# 注册商品对应的使用方法
### 方式一
async def sign_card(**kwargs):
goods_name = kwargs.get('goods_name') # 所有方法中都会含有goods_name
user_id = kwargs.get('user_id') # 所有方法中都会含有user_id
group_id = kwargs.get('group_id') # 所有方法中都会含有group_id
bot = kwargs.get('_bot') # 所有方法中都会含有bot
event = kwargs.get('event') # 所有方法中都会含有event
num = kwargs.get('num') # 道具单次使用数量
prob = kwargs.get('prob') # prob为自己定义传递的值
... # 处理逻辑
# 以下两种方式是通过参数名称还赋予值,所以参数名称必须相同
### 方式二(推荐!)
# 方式一中的所有参数可以通过args方式传递,注:_bot为bot # prob为自己定义传递的值
async def sign_card(goods_name: str, user_id: int, group_id: int, num: int, bot: Bot, event: Event, prob: float):
... # 处理逻辑
### 方式三
# 使用BaseModel ShopParam
from utils.models import ShopParam
async def sign_card(shop_param: ShopParam):
goods_name = shop_param.goods_name
user_id = shop_param.user_id
group_id = shop_param.group_id
bot = shop_param._bot
event = shop_param.event
num = shop_param.num
prob = shop_param.prob # prob为自己定义传递的值
... # 处理逻辑
# 进行方法注册
use.register_use("好感度双倍加持卡Ⅰ", sign_card)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 完整代码
######################################
## 示例:在Bot启动时导入商品和对应方法 ##
#####################################
from nonebot import Driver
from nonebot.plugin import require
driver: Driver = nonebot.get_driver()
use = require("use")
shop = require("shop_handle")
@driver.on_startup
async def _():
# 生效方法 方式一
async def sign_card(**kwargs):
goods_name = kwargs.['goods_name']
user_id = kwargs['user_id']
group_id = kwargs['group_id']
prob = kwargs['prob']
print(f"USER {user_id} GROUP {group_id} 这个道具:{goods_name}使用成功了:{prob}")
# do something....
# 使用 bot 进行发送消息
# bot = kwargs.get('_bot')
# await bot.send_group_msg(group_id=group_id, message="这个道具生效了!")
return "这个道具生效了!" # 返回值将作为提示内容输出,也可以返回None,在sign_card中使用bot发送消息
# 生效方法 方式二
async def sign_card(goods_name: str, user_id: int, group_id: int, prob: float):
print(f"USER {user_id} GROUP {group_id} 这个道具:{goods_name}使用成功了:{prob}")
# do something....
return "这个道具生效了!" # 返回值将作为提示内容输出,也可以返回None,在sign_card中使用bot发送消息
# 生效方法 方式三
from utils.models import ShopParam
async def sign_card(shop_param: ShopParam):
goods_name = shop_param.goods_name
user_id = shop_param.user_id
group_id = shop_param.group_id
prob = shop_param.prob
print(f"USER {user_id} GROUP {group_id} 这个道具:{goods_name}使用成功了:{prob}")
# do something....
return "这个道具生效了!" # 返回值将作为提示内容输出,也可以返回None,在sign_card中使用bot发送消息
# 在数据库中注册商品数据
await shop.register_goods(
"好感度双倍加持卡Ⅰ", 30, "下次签到双倍好感度概率 + 10%(谁才是真命天子?)(同类商品将覆盖)"
)
# 注册商品生效方法
use.register_use("好感度双倍加持卡Ⅰ", sign_card, **{
"_max_num_limit": 10, # 设置单次使用最大数量
"send_success_msg": False # 不发送基础的使用道具提示
"prob": 0.1 # 自己传递的值,在函数中需要使用到
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58