refactor: onmyoji gacha plugin overhaul (gacha-refactor)
This commit is contained in:
25
danding_bot/plugins/onmyoji_gacha/handlers/__init__.py
Normal file
25
danding_bot/plugins/onmyoji_gacha/handlers/__init__.py
Normal file
@@ -0,0 +1,25 @@
|
||||
"""
|
||||
handlers包 - 抽卡命令处理函数
|
||||
|
||||
将各handler函数集中在此包中,便于__init__.py统一导入和注册matcher。
|
||||
"""
|
||||
|
||||
from .gacha import handle_gacha
|
||||
from .triple_gacha import handle_triple_gacha
|
||||
from .stats import handle_stats
|
||||
from .query import handle_query
|
||||
from .rank import handle_rank
|
||||
from .daily_stats import handle_daily_stats
|
||||
from .achievement import handle_achievement
|
||||
from .intro import handle_intro
|
||||
|
||||
__all__ = [
|
||||
"handle_gacha",
|
||||
"handle_triple_gacha",
|
||||
"handle_stats",
|
||||
"handle_query",
|
||||
"handle_rank",
|
||||
"handle_daily_stats",
|
||||
"handle_achievement",
|
||||
"handle_intro",
|
||||
]
|
||||
38
danding_bot/plugins/onmyoji_gacha/handlers/achievement.py
Normal file
38
danding_bot/plugins/onmyoji_gacha/handlers/achievement.py
Normal file
@@ -0,0 +1,38 @@
|
||||
"""
|
||||
成就系统查询处理模块
|
||||
|
||||
处理成就系统查询命令,显示已解锁成就和进度。
|
||||
"""
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
||||
import nonebot
|
||||
|
||||
from ..utils import get_gacha_system
|
||||
from ..utils import format_user_mention
|
||||
|
||||
logger = nonebot.logger
|
||||
|
||||
|
||||
async def handle_achievement(bot: Bot, event: MessageEvent, state: dict):
|
||||
"""处理成就系统查询命令"""
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card or event.sender.nickname or "未知用户"
|
||||
|
||||
gacha_system = get_gacha_system()
|
||||
achievements = await gacha_system.get_user_achievements(user_id)
|
||||
|
||||
if not achievements:
|
||||
await event.finish("您还没有解锁任何成就哦~ 继续抽卡吧!")
|
||||
|
||||
msg = f"🏅 {format_user_mention(user_id, user_name)} 的成就:\n\n"
|
||||
|
||||
for ach in achievements:
|
||||
name = ach.get("name", "未知成就")
|
||||
desc = ach.get("description", "")
|
||||
reward = ach.get("reward", 0)
|
||||
claimed = ach.get("claimed", False)
|
||||
|
||||
status = "✅已领取" if claimed else "🎁可领取"
|
||||
msg += f"🎖️ {name}\n {desc}\n 奖励:{reward} {status}\n\n"
|
||||
|
||||
await event.send(msg.strip())
|
||||
25
danding_bot/plugins/onmyoji_gacha/handlers/daily_stats.py
Normal file
25
danding_bot/plugins/onmyoji_gacha/handlers/daily_stats.py
Normal file
@@ -0,0 +1,25 @@
|
||||
"""
|
||||
今日抽卡统计处理模块
|
||||
|
||||
处理今日抽卡统计查询命令。
|
||||
"""
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
||||
import nonebot
|
||||
|
||||
from ..utils import get_gacha_system
|
||||
from .. import formatters
|
||||
|
||||
logger = nonebot.logger
|
||||
|
||||
|
||||
async def handle_daily_stats(bot: Bot, event: MessageEvent, state: dict):
|
||||
"""处理今日抽卡统计命令"""
|
||||
gacha_system = get_gacha_system()
|
||||
daily_stats = await gacha_system.get_daily_stats()
|
||||
|
||||
if not daily_stats or daily_stats.get("today_total", 0) == 0:
|
||||
await event.finish("今日暂无抽卡记录")
|
||||
|
||||
msg = formatters.format_daily_stats(daily_stats)
|
||||
await event.send(msg)
|
||||
62
danding_bot/plugins/onmyoji_gacha/handlers/gacha.py
Normal file
62
danding_bot/plugins/onmyoji_gacha/handlers/gacha.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""
|
||||
抽卡命令处理模块
|
||||
|
||||
处理单次抽卡命令,包括:
|
||||
- 参数解析(子池选择)
|
||||
- 抽卡执行
|
||||
- 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)
|
||||
|
||||
39
danding_bot/plugins/onmyoji_gacha/handlers/intro.py
Normal file
39
danding_bot/plugins/onmyoji_gacha/handlers/intro.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""
|
||||
帮助介绍处理模块
|
||||
|
||||
显示抽卡系统的帮助信息和功能说明。
|
||||
"""
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
||||
import nonebot
|
||||
|
||||
logger = nonebot.logger
|
||||
|
||||
|
||||
async def handle_intro(bot: Bot, event: MessageEvent, state: dict):
|
||||
"""处理帮助介绍命令"""
|
||||
intro_text = """
|
||||
🎴 阴阳师抽卡系统 使用说明
|
||||
|
||||
📌 基础命令:
|
||||
• 抽卡 [子池名] - 进行一次抽卡
|
||||
• 三连抽 - 连续抽三次
|
||||
• 我的抽卡 - 查看个人抽卡统计
|
||||
• 抽卡详情 - 查看详细统计和最近记录
|
||||
• 抽卡排行 [页码] - 查看排行榜
|
||||
• 今日抽卡 - 查看今日抽卡统计
|
||||
• 成就 - 查看成就系统
|
||||
• 介绍 - 显示本帮助信息
|
||||
|
||||
📊 功能特色:
|
||||
• 多稀有度式神:R/SR/SSR/SP
|
||||
• 成就系统:连续抽卡、非酋成就等
|
||||
• SSR/SP奖励:自动发放积分奖励
|
||||
• 每日签到:首次抽卡自动签到
|
||||
|
||||
💡 提示:
|
||||
• 每日抽卡次数有限制
|
||||
• SSR/SP抽中会通知管理员
|
||||
• 成就奖励自动发放或联系管理员领取
|
||||
"""
|
||||
await event.reply(intro_text.strip())
|
||||
42
danding_bot/plugins/onmyoji_gacha/handlers/query.py
Normal file
42
danding_bot/plugins/onmyoji_gacha/handlers/query.py
Normal file
@@ -0,0 +1,42 @@
|
||||
"""
|
||||
抽卡详情查询处理模块
|
||||
|
||||
处理用户抽卡详情查询,包括最近抽卡记录和成就进度。
|
||||
"""
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
||||
import nonebot
|
||||
|
||||
from ..utils import get_gacha_system
|
||||
from .. import formatters
|
||||
|
||||
logger = nonebot.logger
|
||||
|
||||
|
||||
async def handle_query(bot: Bot, event: MessageEvent, state: dict):
|
||||
"""处理抽卡详情查询命令"""
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card or event.sender.nickname or "未知用户"
|
||||
|
||||
gacha_system = get_gacha_system()
|
||||
stats = await gacha_system.get_user_stats(user_id)
|
||||
|
||||
if not stats or stats.get("total_draws", 0) == 0:
|
||||
await event.finish("您还没有抽卡记录哦~")
|
||||
|
||||
# 获取最近抽卡记录
|
||||
recent = await gacha_system.get_recent_draws(user_id, limit=5)
|
||||
|
||||
# 发送统计详情
|
||||
msg = formatters.format_user_detail_stats(stats, user_id, user_name, recent)
|
||||
await event.send(msg)
|
||||
|
||||
# 发送成就进度
|
||||
progress = await gacha_system.get_achievement_progress(user_id)
|
||||
if progress:
|
||||
achievement_msg = formatters.format_achievement_progress(
|
||||
progress.get("consecutive_days", 0),
|
||||
progress.get("no_ssr_streak", 0),
|
||||
user_id
|
||||
)
|
||||
await event.send(achievement_msg)
|
||||
33
danding_bot/plugins/onmyoji_gacha/handlers/rank.py
Normal file
33
danding_bot/plugins/onmyoji_gacha/handlers/rank.py
Normal file
@@ -0,0 +1,33 @@
|
||||
"""
|
||||
抽卡排行榜处理模块
|
||||
|
||||
处理抽卡排行榜查询命令,支持分页显示。
|
||||
"""
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
||||
from nonebot.params import CommandArg
|
||||
from nonebot.adapters.onebot.v11 import Message
|
||||
import nonebot
|
||||
|
||||
from ..utils import get_gacha_system
|
||||
from .. import formatters
|
||||
|
||||
logger = nonebot.logger
|
||||
|
||||
|
||||
async def handle_rank(bot: Bot, event: MessageEvent, state: dict, args: Message = CommandArg()):
|
||||
"""处理抽卡排行榜命令"""
|
||||
# 解析页码
|
||||
page_text = args.extract_plain_text().strip()
|
||||
page = 1
|
||||
if page_text.isdigit():
|
||||
page = int(page_text)
|
||||
|
||||
gacha_system = get_gacha_system()
|
||||
rank_data, total_pages = await gacha_system.get_rank_list(page=page)
|
||||
|
||||
if not rank_data:
|
||||
await event.finish("暂无排行数据")
|
||||
|
||||
msg = formatters.format_rank_list(rank_data, page, total_pages)
|
||||
await event.send(msg)
|
||||
28
danding_bot/plugins/onmyoji_gacha/handlers/stats.py
Normal file
28
danding_bot/plugins/onmyoji_gacha/handlers/stats.py
Normal file
@@ -0,0 +1,28 @@
|
||||
"""
|
||||
我的抽卡统计处理模块
|
||||
|
||||
处理用户的个人抽卡统计查询命令。
|
||||
"""
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
||||
import nonebot
|
||||
|
||||
from ..utils import get_gacha_system
|
||||
from .. import formatters
|
||||
|
||||
logger = nonebot.logger
|
||||
|
||||
|
||||
async def handle_stats(bot: Bot, event: MessageEvent, state: dict):
|
||||
"""处理我的抽卡统计命令"""
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card or event.sender.nickname or "未知用户"
|
||||
|
||||
gacha_system = get_gacha_system()
|
||||
stats = await gacha_system.get_user_stats(user_id)
|
||||
|
||||
if not stats or stats.get("total_draws", 0) == 0:
|
||||
await event.finish("您还没有抽卡记录哦~")
|
||||
|
||||
msg = formatters.format_user_stats(stats, user_id, user_name)
|
||||
await event.send(msg)
|
||||
45
danding_bot/plugins/onmyoji_gacha/handlers/triple_gacha.py
Normal file
45
danding_bot/plugins/onmyoji_gacha/handlers/triple_gacha.py
Normal file
@@ -0,0 +1,45 @@
|
||||
"""
|
||||
三连抽命令处理模块
|
||||
|
||||
处理三连抽命令,包括:
|
||||
- 三次抽卡执行
|
||||
- 结果汇总
|
||||
- 成就检查
|
||||
"""
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
|
||||
import nonebot
|
||||
|
||||
from ..utils import get_gacha_system
|
||||
from .. import formatters
|
||||
from ..utils import build_achievement_notify
|
||||
|
||||
logger = nonebot.logger
|
||||
|
||||
|
||||
async def handle_triple_gacha(bot: Bot, event: MessageEvent, state: dict):
|
||||
"""处理三连抽命令"""
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card or event.sender.nickname or "未知用户"
|
||||
|
||||
gacha_system = get_gacha_system()
|
||||
results = []
|
||||
|
||||
# 执行三次抽卡
|
||||
for _ in range(3):
|
||||
result = await gacha_system.draw(user_id)
|
||||
if result["success"]:
|
||||
results.append((result["rarity"], result["name"], result["image"]))
|
||||
else:
|
||||
await event.finish(result["message"])
|
||||
|
||||
# 发送三连抽结果
|
||||
msg = formatters.format_triple_gacha_result(results, user_id, user_name)
|
||||
await event.send(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)
|
||||
Reference in New Issue
Block a user