63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
"""
|
|
抽卡命令处理模块
|
|
|
|
处理单次抽卡命令,包括:
|
|
- 参数解析(子池选择)
|
|
- 抽卡执行
|
|
- SSR/SP奖励处理
|
|
- 成就检查
|
|
- 消息发送
|
|
"""
|
|
|
|
from typing import Dict, Any
|
|
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
|
from nonebot.params import CommandArg
|
|
from nonebot.adapters.onebot.v11 import Message
|
|
import nonebot
|
|
import random
|
|
|
|
from ..config import Config
|
|
from ..utils import get_gacha_system
|
|
from .. import formatters
|
|
from ..api_utils import process_ssr_sp_reward
|
|
from ..utils import format_user_mention, build_achievement_notify, get_user_name
|
|
|
|
logger = nonebot.logger
|
|
|
|
|
|
async def handle_gacha(bot: Bot, event: MessageEvent, state: dict, args: Message = CommandArg()):
|
|
"""处理抽卡命令"""
|
|
user_id = str(event.user_id)
|
|
user_name = get_user_name(event)
|
|
|
|
# 解析子池参数
|
|
sub_pool = args.extract_plain_text().strip()
|
|
|
|
# 执行抽卡
|
|
gacha_system = get_gacha_system()
|
|
result = await gacha_system.draw(user_id, sub_pool=sub_pool if sub_pool else None)
|
|
|
|
if not result["success"]:
|
|
await event.finish(result["message"])
|
|
|
|
rarity, shikigami, image_url = result["rarity"], result["name"], result["image"]
|
|
|
|
# 发送抽卡结果
|
|
msg = formatters.format_gacha_result(rarity, shikigami, user_id, user_name, image_url)
|
|
await event.send(msg)
|
|
|
|
# SSR/SP奖励处理
|
|
if rarity in ["SSR", "SP"]:
|
|
group_id = str(event.group_id) if isinstance(event, GroupMessageEvent) else None
|
|
reward_msg = await process_ssr_sp_reward(user_id, user_name, rarity, shikigami, group_id)
|
|
if reward_msg:
|
|
await event.send(reward_msg)
|
|
|
|
# 成就检查(使用统一编排函数)
|
|
unlocked = await gacha_system.check_achievements(user_id)
|
|
if unlocked:
|
|
achievement_msg = await build_achievement_notify(user_id, unlocked)
|
|
if achievement_msg:
|
|
await event.send(achievement_msg)
|
|
|