nonebot-plugin-fishing2 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nonebot_plugin_fishing2/__init__.py +302 -0
- nonebot_plugin_fishing2/config.py +201 -0
- {nonebot_plugin_fishing → nonebot_plugin_fishing2}/data_source.py +310 -20
- nonebot_plugin_fishing2/migrations/68463f3e5f33_.py +35 -0
- {nonebot_plugin_fishing2-0.0.1.dist-info → nonebot_plugin_fishing2-0.0.3.dist-info}/METADATA +2 -2
- nonebot_plugin_fishing2-0.0.3.dist-info/RECORD +14 -0
- {nonebot_plugin_fishing2-0.0.1.dist-info → nonebot_plugin_fishing2-0.0.3.dist-info}/WHEEL +1 -1
- nonebot_plugin_fishing2-0.0.3.dist-info/top_level.txt +1 -0
- nonebot_plugin_fishing/__init__.py +0 -165
- nonebot_plugin_fishing/config.py +0 -95
- nonebot_plugin_fishing/migrations/1be1c9b715a9_add_achievements.py +0 -39
- nonebot_plugin_fishing2-0.0.1.dist-info/RECORD +0 -14
- nonebot_plugin_fishing2-0.0.1.dist-info/top_level.txt +0 -1
- {nonebot_plugin_fishing → nonebot_plugin_fishing2}/migrations/7609e6d106dd_init_db.py +0 -0
- {nonebot_plugin_fishing → nonebot_plugin_fishing2}/migrations/c5ab992c9af3_add_achievements.py +0 -0
- {nonebot_plugin_fishing → nonebot_plugin_fishing2}/migrations/e9015df43907_add_special_fishes_field.py +0 -0
- {nonebot_plugin_fishing → nonebot_plugin_fishing2}/migrations/f70bdeaec7a4_add_specialfishes_table.py +0 -0
- {nonebot_plugin_fishing → nonebot_plugin_fishing2}/model.py +0 -0
- {nonebot_plugin_fishing2-0.0.1.dist-info → nonebot_plugin_fishing2-0.0.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,302 @@
|
|
1
|
+
from nonebot import on_command, require
|
2
|
+
|
3
|
+
require("nonebot_plugin_orm") # noqa
|
4
|
+
|
5
|
+
from nonebot import logger
|
6
|
+
from nonebot.plugin import PluginMetadata
|
7
|
+
from nonebot.adapters import Event, Message
|
8
|
+
from nonebot.params import CommandArg
|
9
|
+
from nonebot.permission import SUPERUSER
|
10
|
+
from nonebot.matcher import Matcher
|
11
|
+
|
12
|
+
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, PrivateMessageEvent, Message, MessageSegment, ActionFailed
|
13
|
+
|
14
|
+
import asyncio
|
15
|
+
|
16
|
+
from typing import Union
|
17
|
+
|
18
|
+
from .config import Config, config
|
19
|
+
from .data_source import (
|
20
|
+
fish_list,
|
21
|
+
get_info,
|
22
|
+
can_fishing,
|
23
|
+
can_free_fish,
|
24
|
+
get_fish,
|
25
|
+
get_stats,
|
26
|
+
get_backpack,
|
27
|
+
sell_fish,
|
28
|
+
get_balance,
|
29
|
+
free_fish,
|
30
|
+
lottery,
|
31
|
+
give,
|
32
|
+
check_achievement,
|
33
|
+
get_achievements,
|
34
|
+
get_board,
|
35
|
+
check_tools,
|
36
|
+
remove_tools,
|
37
|
+
get_shop,
|
38
|
+
buy_fish
|
39
|
+
)
|
40
|
+
|
41
|
+
fishing_coin_name = config.fishing_coin_name
|
42
|
+
|
43
|
+
__plugin_meta__ = PluginMetadata(
|
44
|
+
name="更好的电子钓鱼",
|
45
|
+
description="赛博钓鱼……但是加强版本",
|
46
|
+
usage=f'''钓鱼帮助
|
47
|
+
▶ 查询 [物品]:查询某个物品的信息
|
48
|
+
▶ 钓鱼 [鱼竿] [鱼饵]:
|
49
|
+
▷ 有 {config.fishing_limit}s 的冷却,时间随上一条鱼稀有度而增加
|
50
|
+
▷ 加参数可以使用鱼饵或鱼竿,同类物品同时只能使用一种
|
51
|
+
▷ 频繁钓鱼会触怒河神
|
52
|
+
▶ 出售 <物品> <数量>:出售物品获得{fishing_coin_name}
|
53
|
+
▶ 购买 <物品> <份数>:购买渔具店的物品
|
54
|
+
▶ 放生 <鱼名>:给一条鱼取名并放生
|
55
|
+
▶ 商店:看看渔具店都有些啥
|
56
|
+
▶ 祈愿:向神祈愿,随机获取/损失{fishing_coin_name}
|
57
|
+
▶ 背包:查看背包中的{fishing_coin_name}与物品
|
58
|
+
▶ 成就:查看拥有的成就
|
59
|
+
▶ 钓鱼排行榜:查看{fishing_coin_name}排行榜
|
60
|
+
''',
|
61
|
+
type="application",
|
62
|
+
homepage="https://github.com/FDCraft/nonebot-plugin-fishing2",
|
63
|
+
config=Config,
|
64
|
+
supported_adapters=None,
|
65
|
+
extra={
|
66
|
+
'author': 'Polaris_Light',
|
67
|
+
'version': '0.0.3',
|
68
|
+
'priority': 5
|
69
|
+
}
|
70
|
+
)
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
block_user_list = []
|
75
|
+
punish_user_dict = {}
|
76
|
+
|
77
|
+
fishing_help = on_command("fishing_help", aliases={"钓鱼帮助"}, priority=3,block=True)
|
78
|
+
fishing_lookup = on_command("fishing_lookup", aliases={"查看", "查询"}, priority=3,block=True)
|
79
|
+
fishing = on_command("fishing", aliases={"钓鱼"}, priority=5)
|
80
|
+
backpack = on_command("backpack", aliases={"背包", "钓鱼背包"}, priority=5)
|
81
|
+
shop = on_command("shop", aliases={"商店"}, priority=5)
|
82
|
+
buy = on_command("buy", aliases={"购买"}, priority=5)
|
83
|
+
sell = on_command("sell", aliases={"卖鱼", "出售", "售卖"}, priority=5)
|
84
|
+
free_fish_cmd = on_command("free_fish", aliases={"放生", "钓鱼放生"}, priority=5)
|
85
|
+
lottery_cmd = on_command("lottery", aliases={"祈愿"}, priority=5)
|
86
|
+
achievement_cmd = on_command("achievement", aliases={"成就", "钓鱼成就"}, priority=5)
|
87
|
+
give_cmd = on_command("give", aliases={"赐予"}, permission=SUPERUSER, priority=5)
|
88
|
+
board_cmd = on_command("board", aliases={"排行榜", "钓鱼排行榜"}, priority=5)
|
89
|
+
|
90
|
+
|
91
|
+
@fishing_help.handle()
|
92
|
+
async def _():
|
93
|
+
await fishing_help.finish(__plugin_meta__.usage)
|
94
|
+
|
95
|
+
@shop.handle()
|
96
|
+
async def _(bot: Bot, event: Union[GroupMessageEvent, PrivateMessageEvent]):
|
97
|
+
messages = get_shop()
|
98
|
+
await forward_send(bot, event, messages)
|
99
|
+
return None
|
100
|
+
|
101
|
+
@fishing_lookup.handle()
|
102
|
+
async def _(bot: Bot, event: Union[GroupMessageEvent, PrivateMessageEvent], arg: Message = CommandArg()):
|
103
|
+
arg = arg.extract_plain_text()
|
104
|
+
if not arg or arg == "":
|
105
|
+
await fishing_lookup.finish("请输入要查询的物品\n可查询物品:" + "、".join(fish_list))
|
106
|
+
await forward_send(bot, event, get_info(arg))
|
107
|
+
return None
|
108
|
+
|
109
|
+
|
110
|
+
@fishing.handle()
|
111
|
+
async def _(bot:Bot, event: Event, matcher: Matcher, arg: Message = CommandArg()):
|
112
|
+
user_id = event.get_user_id()
|
113
|
+
if user_id in block_user_list:
|
114
|
+
await fishing.finish()
|
115
|
+
|
116
|
+
use_tools = False
|
117
|
+
tools = arg.extract_plain_text().split()[:2]
|
118
|
+
logger.debug(f"PLDEBUG0: {tools}")
|
119
|
+
if tools and tools != [] and tools != [""]:
|
120
|
+
use_tools = True
|
121
|
+
check_result = await check_tools(user_id, tools)
|
122
|
+
if check_result:
|
123
|
+
await fishing.finish(MessageSegment.at(user_id) + " " + check_result)
|
124
|
+
|
125
|
+
await punish(bot, event, matcher, user_id)
|
126
|
+
block_user_list.append(user_id)
|
127
|
+
try:
|
128
|
+
if use_tools:
|
129
|
+
await remove_tools(user_id, tools)
|
130
|
+
await fishing.send(MessageSegment.at(user_id) + "\n你使用了" + "、".join(tools) + "\n正在钓鱼…")
|
131
|
+
result = await get_fish(user_id, tools)
|
132
|
+
else:
|
133
|
+
await fishing.send(MessageSegment.at(user_id) + " 正在钓鱼…")
|
134
|
+
result = await get_fish(user_id)
|
135
|
+
achievements = await check_achievement(user_id)
|
136
|
+
if achievements is not None:
|
137
|
+
for achievement in achievements:
|
138
|
+
await fishing.send(achievement)
|
139
|
+
except Exception as e:
|
140
|
+
logger.error(e)
|
141
|
+
finally:
|
142
|
+
block_user_list.remove(user_id)
|
143
|
+
punish_user_dict.pop(user_id, None)
|
144
|
+
await fishing.finish(MessageSegment.at(user_id) + " " + result)
|
145
|
+
|
146
|
+
|
147
|
+
@backpack.handle()
|
148
|
+
async def _(event: Event):
|
149
|
+
user_id = event.get_user_id()
|
150
|
+
await backpack.finish(MessageSegment.at(user_id) + " \n" + await get_stats(user_id) + "\n" + await get_balance(user_id) + "\n" + await get_backpack(user_id))
|
151
|
+
|
152
|
+
@buy.handle()
|
153
|
+
async def _(event: Event, arg: Message = CommandArg()):
|
154
|
+
fish_info = arg.extract_plain_text()
|
155
|
+
user_id = event.get_user_id()
|
156
|
+
if fish_info == "":
|
157
|
+
await buy.finish(MessageSegment.at(user_id) + " " + "请输入要买入物品的名字和份数 (份数为1时可省略), 如 /购买 钛金鱼竿 1")
|
158
|
+
if len(fish_info.split()) == 1:
|
159
|
+
result = await buy_fish(user_id, fish_info)
|
160
|
+
else:
|
161
|
+
fish_name, fish_quantity = fish_info.split()
|
162
|
+
result = await buy_fish(user_id, fish_name, int(fish_quantity))
|
163
|
+
achievements = await check_achievement(user_id)
|
164
|
+
if achievements is not None:
|
165
|
+
for achievement in achievements:
|
166
|
+
await fishing.send(achievement)
|
167
|
+
await buy.finish(MessageSegment.at(user_id) + " " + result)
|
168
|
+
|
169
|
+
|
170
|
+
@sell.handle()
|
171
|
+
async def _(event: Event, arg: Message = CommandArg()):
|
172
|
+
fish_info = arg.extract_plain_text()
|
173
|
+
user_id = event.get_user_id()
|
174
|
+
if fish_info == "":
|
175
|
+
await sell.finish(MessageSegment.at(user_id) + " " + "请输入要卖出的鱼的名字和数量 (数量为1时可省略), 如 /卖鱼 小鱼 1")
|
176
|
+
if len(fish_info.split()) == 1:
|
177
|
+
await sell.finish(MessageSegment.at(user_id) + " " + await sell_fish(user_id, fish_info))
|
178
|
+
else:
|
179
|
+
fish_name, fish_quantity = fish_info.split()
|
180
|
+
await sell.finish(MessageSegment.at(user_id) + " " + await sell_fish(user_id, fish_name, int(fish_quantity)))
|
181
|
+
|
182
|
+
|
183
|
+
@free_fish_cmd.handle()
|
184
|
+
async def _(event: Event, arg: Message = CommandArg()):
|
185
|
+
if not can_free_fish():
|
186
|
+
await free_fish_cmd.finish("未开启此功能, 请联系机器人管理员")
|
187
|
+
fish_name = arg.extract_plain_text()
|
188
|
+
user_id = event.get_user_id()
|
189
|
+
if fish_name == "":
|
190
|
+
await free_fish_cmd.finish(MessageSegment.at(user_id) + " " + "请输入要放生的鱼的名字, 如 /放生 测试鱼")
|
191
|
+
await free_fish_cmd.finish(MessageSegment.at(user_id) + " " + await free_fish(user_id, fish_name))
|
192
|
+
|
193
|
+
|
194
|
+
@lottery_cmd.handle()
|
195
|
+
async def _(bot: Bot, event: Event, matcher: Matcher):
|
196
|
+
user_id = event.get_user_id()
|
197
|
+
try:
|
198
|
+
await punish(bot, event, matcher, user_id)
|
199
|
+
result = await lottery(user_id)
|
200
|
+
except:
|
201
|
+
pass
|
202
|
+
finally:
|
203
|
+
punish_user_dict.pop(user_id, None)
|
204
|
+
await lottery_cmd.finish(MessageSegment.at(user_id) + " " + result)
|
205
|
+
|
206
|
+
|
207
|
+
@achievement_cmd.handle()
|
208
|
+
async def _(event: Event):
|
209
|
+
user_id = event.get_user_id()
|
210
|
+
await achievement_cmd.finish(MessageSegment.at(user_id) + " " + await get_achievements(user_id))
|
211
|
+
|
212
|
+
|
213
|
+
@give_cmd.handle()
|
214
|
+
async def _(arg: Message = CommandArg()):
|
215
|
+
args = arg.extract_plain_text().split()
|
216
|
+
if len(args) < 2 or len(args) > 3:
|
217
|
+
await give_cmd.finish("请输入用户的 id 和鱼的名字和数量 (数量为1时可省略), 如 /give 114514 开发鱼 1")
|
218
|
+
else:
|
219
|
+
print(f"PLDEBUG1: {args}")
|
220
|
+
quantity = int(args[2]) if len(args) == 3 else 1
|
221
|
+
result = await give(args[0], args[1], quantity)
|
222
|
+
achievements = await check_achievement(args[0])
|
223
|
+
if achievements is not None:
|
224
|
+
for achievement in achievements:
|
225
|
+
await fishing.send(achievement)
|
226
|
+
await give_cmd.finish(result)
|
227
|
+
|
228
|
+
|
229
|
+
@board_cmd.handle()
|
230
|
+
async def _(bot: Bot, event: GroupMessageEvent):
|
231
|
+
group_id = event.group_id
|
232
|
+
top_users_list = await get_board()
|
233
|
+
msg = '钓鱼富豪排行榜:'
|
234
|
+
for index, user in enumerate(top_users_list):
|
235
|
+
try:
|
236
|
+
user_info = await bot.get_group_member_info(group_id=group_id, user_id=user[0])
|
237
|
+
username = user_info['card'] if user_info['card'] is not None and user_info['card'] != '' else user_info['nickname']
|
238
|
+
except ActionFailed:
|
239
|
+
username = "[神秘富豪]"
|
240
|
+
|
241
|
+
msg += f'\n{index + 1}. {username}: {user[1]} {fishing_coin_name}'
|
242
|
+
|
243
|
+
await board_cmd.finish(msg)
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
async def punish(bot: Bot, event: Event, matcher: Matcher, user_id: int):
|
248
|
+
global punish_user_dict
|
249
|
+
|
250
|
+
if not await can_fishing(user_id):
|
251
|
+
try:
|
252
|
+
punish_user_dict[user_id] += 1
|
253
|
+
except KeyError:
|
254
|
+
punish_user_dict[user_id] = 1
|
255
|
+
|
256
|
+
if punish_user_dict[user_id] < config.punish_limit - 1 :
|
257
|
+
await matcher.finish(MessageSegment.at(user_id) + " " + "河累了,休息一下吧")
|
258
|
+
elif punish_user_dict[user_id] == config.punish_limit - 1:
|
259
|
+
await matcher.finish(MessageSegment.at(user_id) + " " + "河神快要不耐烦了")
|
260
|
+
elif punish_user_dict[user_id] == config.punish_limit:
|
261
|
+
groud_id = event.group_id if isinstance(event, GroupMessageEvent) else None
|
262
|
+
try:
|
263
|
+
await bot.set_group_ban(group_id=groud_id, user_id=user_id, duration=1800)
|
264
|
+
except ActionFailed:
|
265
|
+
pass
|
266
|
+
await matcher.finish(MessageSegment.at(user_id) + " " + "河神生气了,降下了惩罚")
|
267
|
+
else:
|
268
|
+
await matcher.finish()
|
269
|
+
|
270
|
+
|
271
|
+
async def forward_send(bot: Bot, event: Union[GroupMessageEvent, PrivateMessageEvent], messages: list[MessageSegment]) -> None:
|
272
|
+
if isinstance(event, GroupMessageEvent):
|
273
|
+
await bot.send_group_forward_msg(
|
274
|
+
group_id=event.group_id,
|
275
|
+
messages=[
|
276
|
+
{
|
277
|
+
"type": "node",
|
278
|
+
"data": {
|
279
|
+
"name": "花花",
|
280
|
+
"uin": bot.self_id,
|
281
|
+
"content": msg,
|
282
|
+
},
|
283
|
+
}
|
284
|
+
for msg in messages
|
285
|
+
],
|
286
|
+
)
|
287
|
+
else:
|
288
|
+
await bot.send_private_forward_msg(
|
289
|
+
user_id=event.user_id,
|
290
|
+
messages=[
|
291
|
+
{
|
292
|
+
"type": "node",
|
293
|
+
"data": {
|
294
|
+
"name": "花花",
|
295
|
+
"uin": bot.self_id,
|
296
|
+
"content": msg,
|
297
|
+
},
|
298
|
+
}
|
299
|
+
for msg in messages
|
300
|
+
],
|
301
|
+
)
|
302
|
+
|
@@ -0,0 +1,201 @@
|
|
1
|
+
from pydantic import BaseModel
|
2
|
+
from typing import List, Dict
|
3
|
+
|
4
|
+
try:
|
5
|
+
# pydantic v2
|
6
|
+
from nonebot import get_plugin_config
|
7
|
+
except ImportError:
|
8
|
+
# pydantic v1
|
9
|
+
from nonebot import get_driver
|
10
|
+
|
11
|
+
|
12
|
+
class Config(BaseModel):
|
13
|
+
fishes: List[Dict] = [
|
14
|
+
{
|
15
|
+
"type": "fish",
|
16
|
+
"name": "小鱼",
|
17
|
+
"price": 10,
|
18
|
+
"props": [
|
19
|
+
{
|
20
|
+
"type": "rm_fish",
|
21
|
+
"key": "小鱼"
|
22
|
+
}
|
23
|
+
],
|
24
|
+
"description": "一条小鱼。把它当做鱼饵可以防止钓到小鱼。",
|
25
|
+
"can_catch": True,
|
26
|
+
"frequency": 2,
|
27
|
+
"weight": 1000,
|
28
|
+
"can_buy": True,
|
29
|
+
"amount": 1,
|
30
|
+
"can_sell": True
|
31
|
+
},
|
32
|
+
{
|
33
|
+
"type": "item",
|
34
|
+
"name": "尚方宝剑",
|
35
|
+
"price": 20,
|
36
|
+
"props": [],
|
37
|
+
"description": "假的。",
|
38
|
+
"can_catch": True,
|
39
|
+
"frequency": 2,
|
40
|
+
"weight": 500,
|
41
|
+
"can_buy": False,
|
42
|
+
"can_sell": True,
|
43
|
+
},
|
44
|
+
{
|
45
|
+
"type": "fish",
|
46
|
+
"name": "小杂鱼~♡",
|
47
|
+
"price": 100,
|
48
|
+
"props": [],
|
49
|
+
"description": "杂鱼,杂鱼~",
|
50
|
+
"can_catch": True,
|
51
|
+
"frequency": 10,
|
52
|
+
"weight": 100,
|
53
|
+
"can_buy": False,
|
54
|
+
"can_sell": True
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"type": "fish",
|
58
|
+
"name": "烤激光鱼",
|
59
|
+
"price": 1000,
|
60
|
+
"props": [],
|
61
|
+
"description": "河里为什么会有烤鱼?",
|
62
|
+
"can_catch": True,
|
63
|
+
"frequency": 20,
|
64
|
+
"weight": 20,
|
65
|
+
"can_buy": False,
|
66
|
+
"can_sell": True
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"type": "fish",
|
70
|
+
"name": "琪露诺",
|
71
|
+
"price": 1000,
|
72
|
+
"props": [],
|
73
|
+
"description": "邪恶的冰之精灵,是个笨蛋。",
|
74
|
+
"can_catch": True,
|
75
|
+
"frequency": 60,
|
76
|
+
"weight": 20,
|
77
|
+
"can_buy": False,
|
78
|
+
"can_sell": True
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"type": "fish",
|
82
|
+
"name": "大傻",
|
83
|
+
"price": 2000,
|
84
|
+
"props": [],
|
85
|
+
"description": "非常能吃大米。",
|
86
|
+
"can_catch": True,
|
87
|
+
"frequency": 30,
|
88
|
+
"weight": 10,
|
89
|
+
"can_buy": False,
|
90
|
+
"can_sell": True
|
91
|
+
},
|
92
|
+
{
|
93
|
+
"type": "fish",
|
94
|
+
"name": "帕秋莉",
|
95
|
+
"price": 8000,
|
96
|
+
"props": [],
|
97
|
+
"description": "Neet姬,非常难在图书馆外见到她。",
|
98
|
+
"can_catch": True,
|
99
|
+
"frequency": 120,
|
100
|
+
"weight": 0,
|
101
|
+
"can_buy": False,
|
102
|
+
"can_sell": True
|
103
|
+
},
|
104
|
+
{
|
105
|
+
"type": "item",
|
106
|
+
"name": "钛金鱼竿",
|
107
|
+
"price": 5,
|
108
|
+
"props": [
|
109
|
+
{
|
110
|
+
"type": "rare_fish",
|
111
|
+
"value": 10
|
112
|
+
}
|
113
|
+
],
|
114
|
+
"description": "更坚韧的鱼竿,显著提升钓上大鱼的概率。",
|
115
|
+
"can_catch": False,
|
116
|
+
"can_buy": True,
|
117
|
+
"amount": 30,
|
118
|
+
"can_sell": False
|
119
|
+
},
|
120
|
+
{
|
121
|
+
"type": "fish",
|
122
|
+
"name": "大米",
|
123
|
+
"price": 2000,
|
124
|
+
"props": [
|
125
|
+
{
|
126
|
+
"type": "fish",
|
127
|
+
"key": "大傻",
|
128
|
+
"value": 10000
|
129
|
+
}
|
130
|
+
],
|
131
|
+
"description": "Fufu 最爱吃的大米!这是管理员物品。",
|
132
|
+
"can_catch": False,
|
133
|
+
"can_buy": False,
|
134
|
+
"can_sell": False
|
135
|
+
}
|
136
|
+
]
|
137
|
+
|
138
|
+
punish_limit: int = 3
|
139
|
+
|
140
|
+
fishing_limit: int = 60
|
141
|
+
|
142
|
+
fishing_coin_name: str = "绿宝石" # It means Fishing Coin.
|
143
|
+
|
144
|
+
special_fish_enabled: bool = True
|
145
|
+
|
146
|
+
special_fish_price: int = 200
|
147
|
+
|
148
|
+
special_fish_probability: float = 0.01
|
149
|
+
|
150
|
+
fishing_achievement: List[Dict] = [
|
151
|
+
{
|
152
|
+
"type": "fishing_frequency",
|
153
|
+
"name": "腥味十足的生意",
|
154
|
+
"data": 1,
|
155
|
+
"description": "钓到一条鱼。"
|
156
|
+
},
|
157
|
+
{
|
158
|
+
"type": "fishing_frequency",
|
159
|
+
"name": "还是钓鱼大佬",
|
160
|
+
"data": 100,
|
161
|
+
"description": "累计钓鱼一百次。"
|
162
|
+
},
|
163
|
+
{
|
164
|
+
"type": "fish_type",
|
165
|
+
"name": "那是鱼吗?",
|
166
|
+
"data": "小杂鱼~♡",
|
167
|
+
"description": "获得#####。[原文如此]"
|
168
|
+
},
|
169
|
+
{
|
170
|
+
"type": "fish_type",
|
171
|
+
"name": "那一晚, 激光鱼和便携式烤炉都喝醉了",
|
172
|
+
"data": "烤激光鱼",
|
173
|
+
"description": "获得烤激光鱼。"
|
174
|
+
},
|
175
|
+
{
|
176
|
+
"type": "fish_type",
|
177
|
+
"name": "你怎么把 Fufu 钓上来了",
|
178
|
+
"data": "大傻",
|
179
|
+
"description": "获得大傻"
|
180
|
+
},
|
181
|
+
{
|
182
|
+
"type": "fish_type",
|
183
|
+
"name": "⑨",
|
184
|
+
"data": "琪露诺",
|
185
|
+
"description": "发现了湖边的冰之精灵"
|
186
|
+
},
|
187
|
+
{
|
188
|
+
"type": "fish_type",
|
189
|
+
"name": "不动的大图书馆",
|
190
|
+
"data": "帕秋莉",
|
191
|
+
"description": "Neet 姬好不容易出门一次,就被你钓上来了?"
|
192
|
+
}
|
193
|
+
]
|
194
|
+
|
195
|
+
|
196
|
+
try:
|
197
|
+
# pydantic v2
|
198
|
+
config = get_plugin_config(Config)
|
199
|
+
except:
|
200
|
+
# pydantic v1
|
201
|
+
config = Config.parse_obj(get_driver().config)
|