首次提交
This commit is contained in:
771
danding_bot/plugins/onmyoji_gacha/__init__.py
Normal file
771
danding_bot/plugins/onmyoji_gacha/__init__.py
Normal file
@@ -0,0 +1,771 @@
|
||||
import os
|
||||
from nonebot import on_command, on_startswith
|
||||
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, MessageEvent, Message
|
||||
from nonebot.adapters.onebot.v11.message import MessageSegment
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.rule import Rule
|
||||
from pathlib import Path
|
||||
|
||||
from .config import Config
|
||||
from .gacha import GachaSystem
|
||||
from .utils import format_user_mention, get_image_path
|
||||
from .api_utils import process_ssr_sp_reward, process_achievement_reward
|
||||
from . import web_api
|
||||
|
||||
# 创建Config实例
|
||||
config = Config()
|
||||
|
||||
# 允许的群聊ID和用户ID
|
||||
ALLOWED_GROUP_ID = config.ALLOWED_GROUP_ID
|
||||
ALLOWED_USER_ID = config.ALLOWED_USER_ID
|
||||
GACHA_COMMANDS = config.GACHA_COMMANDS
|
||||
STATS_COMMANDS = config.STATS_COMMANDS
|
||||
DAILY_STATS_COMMANDS = config.DAILY_STATS_COMMANDS
|
||||
TRIPLE_GACHA_COMMANDS = config.TRIPLE_GACHA_COMMANDS
|
||||
ACHIEVEMENT_COMMANDS = config.ACHIEVEMENT_COMMANDS
|
||||
INTRO_COMMANDS = config.INTRO_COMMANDS
|
||||
DAILY_LIMIT = config.DAILY_LIMIT
|
||||
|
||||
gacha_system = GachaSystem()
|
||||
|
||||
# 检查是否允许使用功能的规则
|
||||
def check_permission() -> Rule:
|
||||
async def _checker(event: MessageEvent) -> bool:
|
||||
# 允许特定用户在任何场景下使用
|
||||
if event.user_id == ALLOWED_USER_ID:
|
||||
return True
|
||||
|
||||
# 在允许的群聊中任何人都可以使用
|
||||
if isinstance(event, GroupMessageEvent) and event.group_id == ALLOWED_GROUP_ID:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
return Rule(_checker)
|
||||
|
||||
# 注册抽卡命令,添加权限检查规则
|
||||
gacha_matcher = on_command("抽卡", aliases=set(GACHA_COMMANDS), priority=10, rule=check_permission())
|
||||
|
||||
@gacha_matcher.handle()
|
||||
async def handle_gacha(bot: Bot, event: MessageEvent, state: T_State):
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card if isinstance(event, GroupMessageEvent) else event.sender.nickname
|
||||
|
||||
# 执行抽卡
|
||||
result = gacha_system.draw(user_id)
|
||||
|
||||
if not result["success"]:
|
||||
await gacha_matcher.finish(format_user_mention(user_id, user_name) + " ❌ " + result["message"])
|
||||
|
||||
# 成功抽卡,格式化消息
|
||||
rarity = result["rarity"]
|
||||
name = result["name"]
|
||||
image_url = result["image_url"]
|
||||
draws_left = result["draws_left"]
|
||||
unlocked_achievements = result.get("unlocked_achievements", [])
|
||||
|
||||
# 构建消息
|
||||
msg = Message()
|
||||
|
||||
# 根据稀有度设置不同的消息样式
|
||||
if rarity == "SSR":
|
||||
msg.append(f"🌟✨ 恭喜 {format_user_mention(user_id, user_name)} ✨🌟\n")
|
||||
msg.append(f"🎊 抽到了 SSR 式神:{name} 🎊\n")
|
||||
msg.append(f"💫 真是太幸运了!💫")
|
||||
elif rarity == "SP":
|
||||
msg.append(f"🌈🎆 恭喜 {format_user_mention(user_id, user_name)} 🎆🌈\n")
|
||||
msg.append(f"🎉 抽到了 SP 式神:{name} 🎉\n")
|
||||
msg.append(f"🔥 这是传说中的SP!🔥")
|
||||
elif rarity == "SR":
|
||||
msg.append(f"⭐ 恭喜 {format_user_mention(user_id, user_name)} ⭐\n")
|
||||
msg.append(f"✨ 抽到了 SR 式神:{name} ✨")
|
||||
else: # R
|
||||
msg.append(f"🍀 {format_user_mention(user_id, user_name)} 🍀\n")
|
||||
msg.append(f"📜 抽到了 R 式神:{name}")
|
||||
|
||||
# 添加图片
|
||||
if image_url and os.path.exists(image_url):
|
||||
msg.append(MessageSegment.image(f"file:///{get_image_path(image_url)}"))
|
||||
|
||||
# 添加成就通知
|
||||
if unlocked_achievements:
|
||||
msg.append("\n\n🏆 恭喜解锁新成就!\n")
|
||||
has_manual_rewards = False
|
||||
|
||||
for achievement_id in unlocked_achievements:
|
||||
# 尝试自动发放成就奖励
|
||||
auto_success, reward_msg = await process_achievement_reward(user_id, achievement_id)
|
||||
|
||||
# 检查是否是重复奖励
|
||||
if "_repeat_" in achievement_id:
|
||||
base_achievement_id = achievement_id.split("_repeat_")[0]
|
||||
achievement_config = config.ACHIEVEMENTS.get(base_achievement_id)
|
||||
if achievement_config:
|
||||
achievement_name = achievement_config["name"]
|
||||
# 使用重复奖励或默认为天卡
|
||||
reward = achievement_config.get("repeat_reward", "天卡")
|
||||
status = "✅ 已自动发放" if auto_success else "⚠️ 需手动领取"
|
||||
msg.append(f"🎖️ {achievement_name} 重复奖励 (奖励:{reward}) {status}\n")
|
||||
else:
|
||||
msg.append(f"🎖️ {achievement_id}\n")
|
||||
else:
|
||||
achievement_config = config.ACHIEVEMENTS.get(achievement_id)
|
||||
if achievement_config:
|
||||
achievement_name = achievement_config["name"]
|
||||
reward = achievement_config["reward"]
|
||||
status = "✅ 已自动发放" if auto_success else "⚠️ 需手动领取"
|
||||
msg.append(f"🎖️ {achievement_name} (奖励:{reward}) {status}\n")
|
||||
else:
|
||||
msg.append(f"🎖️ {achievement_id}\n")
|
||||
|
||||
# 记录是否有需要手动领取的奖励
|
||||
if not auto_success:
|
||||
has_manual_rewards = True
|
||||
|
||||
# 如果有未自动发放的奖励,提示联系管理员
|
||||
if has_manual_rewards:
|
||||
msg.append("💰 未自动发放的奖励请联系管理员\n")
|
||||
|
||||
# 添加成就进度提示
|
||||
achievement_data = gacha_system.get_user_achievements(user_id)
|
||||
if achievement_data["success"]:
|
||||
progress = achievement_data["progress"]
|
||||
consecutive_days = progress.get("consecutive_days", 0)
|
||||
no_ssr_streak = progress.get("no_ssr_streak", 0)
|
||||
|
||||
msg.append("\n📈 成就进度:\n")
|
||||
|
||||
# 连续抽卡天数进度
|
||||
if consecutive_days > 0:
|
||||
if consecutive_days < 30:
|
||||
msg.append(f"📅 勤勤恳恳Ⅰ:{consecutive_days}/30天 🎯\n")
|
||||
elif consecutive_days < 60:
|
||||
msg.append(f"📅 勤勤恳恳Ⅱ:{consecutive_days}/60天 🎯\n")
|
||||
elif consecutive_days < 90:
|
||||
msg.append(f"📅 勤勤恳恳Ⅲ:{consecutive_days}/90天 🎯\n")
|
||||
elif consecutive_days < 120:
|
||||
msg.append(f"📅 勤勤恳恳Ⅳ:{consecutive_days}/120天 ⭐\n")
|
||||
elif consecutive_days < 150:
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ:{consecutive_days}/150天 ⭐\n")
|
||||
else:
|
||||
next_reward_days = 30 - (consecutive_days % 30)
|
||||
if next_reward_days == 30:
|
||||
next_reward_days = 0
|
||||
if next_reward_days > 0:
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ (满级):{consecutive_days}天,距离下次奖励{next_reward_days}天 🎁\n")
|
||||
else:
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ (满级):{consecutive_days}天,可获得奖励!🎉\n")
|
||||
|
||||
# 无SSR/SP连击进度
|
||||
if no_ssr_streak > 0:
|
||||
if no_ssr_streak < 60:
|
||||
msg.append(f"💔 非酋进度:{no_ssr_streak}/60次 😭\n")
|
||||
elif no_ssr_streak < 120:
|
||||
msg.append(f"💔 顶级非酋:{no_ssr_streak}/120次 😱\n")
|
||||
elif no_ssr_streak < 180:
|
||||
msg.append(f"💔 月见黑:{no_ssr_streak}/180次 🌙\n")
|
||||
else:
|
||||
msg.append(f"💔 已达月见黑级别:{no_ssr_streak}次 🌚\n")
|
||||
|
||||
# 添加剩余次数和概率信息
|
||||
msg.append(f"\n📊 今日剩余抽卡次数:{draws_left}/{DAILY_LIMIT}\n")
|
||||
msg.append(gacha_system.get_probability_text())
|
||||
|
||||
# 如果抽到了SSR或SP,处理奖励发放
|
||||
if rarity in ["SSR", "SP"]:
|
||||
# 尝试自动发放奖励
|
||||
auto_success, reward_msg = await process_ssr_sp_reward(user_id)
|
||||
msg.append(f"\n\n{reward_msg}")
|
||||
|
||||
# 通知管理员好友
|
||||
admin_id = 2185330092
|
||||
notify_msg = Message()
|
||||
if auto_success:
|
||||
notify_msg.append(f"用户 {user_name}({user_id}) 抽中了{rarity}稀有度式神: {name}! 已自动发放奖励!")
|
||||
else:
|
||||
notify_msg.append(f"用户 {user_name}({user_id}) 抽中了{rarity}稀有度式神: {name}! 需要手动发放奖励!")
|
||||
await bot.send_private_msg(user_id=admin_id, message=notify_msg)
|
||||
else:
|
||||
msg.append(f"\n\n抽中SSR或SP时,可获得蛋定助手天卡一张哦~~")
|
||||
|
||||
await gacha_matcher.finish(msg)
|
||||
|
||||
async def notify_admin(bot: Bot, message: str):
|
||||
"""通知管理员"""
|
||||
admin_id = 2185330092
|
||||
try:
|
||||
await bot.send_private_msg(user_id=admin_id, message=message)
|
||||
except Exception as e:
|
||||
pass # 忽略通知失败的错误
|
||||
|
||||
# 注册查询命令,添加权限检查规则
|
||||
stats_matcher = on_command("我的抽卡", aliases=set(STATS_COMMANDS), priority=5, rule=check_permission())
|
||||
|
||||
# 注册今日统计命令
|
||||
daily_stats_matcher = on_command("今日抽卡", aliases=set(DAILY_STATS_COMMANDS), priority=5, rule=check_permission())
|
||||
|
||||
# 注册三连抽命令
|
||||
triple_gacha_matcher = on_command("三连抽", aliases=set(TRIPLE_GACHA_COMMANDS), priority=5, rule=check_permission())
|
||||
|
||||
# 注册成就查询命令
|
||||
achievement_matcher = on_command("查询成就", aliases=set(ACHIEVEMENT_COMMANDS), priority=5, rule=check_permission())
|
||||
|
||||
@stats_matcher.handle()
|
||||
async def handle_stats(bot: Bot, event: MessageEvent, state: T_State):
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card if isinstance(event, GroupMessageEvent) else event.sender.nickname
|
||||
|
||||
# 获取用户统计
|
||||
stats = gacha_system.get_user_stats(user_id)
|
||||
|
||||
if not stats["success"]:
|
||||
await stats_matcher.finish(format_user_mention(user_id, user_name) + " " + stats["message"])
|
||||
|
||||
# 构建消息
|
||||
msg = Message()
|
||||
msg.append(f"📊 {format_user_mention(user_id, user_name)} 的抽卡统计:\n\n")
|
||||
msg.append(f"🎲 总抽卡次数:{stats['total_draws']}次\n\n")
|
||||
|
||||
# 稀有度统计
|
||||
msg.append("🎯 稀有度分布:\n")
|
||||
msg.append(f"📜 R:{stats['R_count']}张 ({stats['R_count']/stats['total_draws']*100:.1f}%)\n")
|
||||
msg.append(f"⭐ SR:{stats['SR_count']}张 ({stats['SR_count']/stats['total_draws']*100:.1f}%)\n")
|
||||
msg.append(f"🌟 SSR:{stats['SSR_count']}张 ({stats['SSR_count']/stats['total_draws']*100:.1f}%)\n")
|
||||
msg.append(f"🌈 SP:{stats['SP_count']}张 ({stats['SP_count']/stats['total_draws']*100:.1f}%)\n")
|
||||
|
||||
# 添加最近抽卡记录
|
||||
if stats["recent_draws"]:
|
||||
msg.append("\n🕐 最近抽卡记录:\n")
|
||||
for draw in reversed(stats["recent_draws"]):
|
||||
# 根据稀有度添加emoji
|
||||
if draw['rarity'] == "SSR":
|
||||
emoji = "🌟"
|
||||
elif draw['rarity'] == "SP":
|
||||
emoji = "🌈"
|
||||
elif draw['rarity'] == "SR":
|
||||
emoji = "⭐"
|
||||
else:
|
||||
emoji = "📜"
|
||||
|
||||
msg.append(f"{emoji} {draw['rarity']} - {draw['name']} ({draw['date']})\n")
|
||||
|
||||
await stats_matcher.finish(msg)
|
||||
|
||||
@triple_gacha_matcher.handle()
|
||||
async def handle_triple_gacha(bot: Bot, event: MessageEvent, state: T_State):
|
||||
"""处理三连抽命令"""
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card or event.sender.nickname or "未知用户"
|
||||
|
||||
# 执行三连抽
|
||||
result = gacha_system.triple_draw(user_id)
|
||||
|
||||
if not result["success"]:
|
||||
await triple_gacha_matcher.finish(f"❌ {result['message']}")
|
||||
|
||||
# 构建三连抽结果消息
|
||||
msg = Message()
|
||||
msg.append(f"🎯 {format_user_mention(user_id, user_name)} 的三连抽结果:\n\n")
|
||||
|
||||
# 显示每次抽卡结果
|
||||
for i, draw_result in enumerate(result["results"], 1):
|
||||
rarity = draw_result["rarity"]
|
||||
name = draw_result["name"]
|
||||
|
||||
# 根据稀有度添加emoji
|
||||
if rarity == "SSR":
|
||||
msg.append(f"🌟 第{i}抽:SSR - {name}\n")
|
||||
elif rarity == "SP":
|
||||
msg.append(f"🌈 第{i}抽:SP - {name}\n")
|
||||
elif rarity == "SR":
|
||||
msg.append(f"⭐ 第{i}抽:SR - {name}\n")
|
||||
else: # R
|
||||
msg.append(f"📜 第{i}抽:R - {name}\n")
|
||||
|
||||
# 统计结果
|
||||
ssr_count = sum(1 for r in result["results"] if r["rarity"] in ["SSR", "SP"])
|
||||
sr_count = sum(1 for r in result["results"] if r["rarity"] == "SR")
|
||||
r_count = sum(1 for r in result["results"] if r["rarity"] == "R")
|
||||
|
||||
msg.append(f"\n📈 本次三连抽统计:\n")
|
||||
if ssr_count > 0:
|
||||
msg.append(f"🎊 SSR/SP:{ssr_count}张\n")
|
||||
if sr_count > 0:
|
||||
msg.append(f"✨ SR:{sr_count}张\n")
|
||||
if r_count > 0:
|
||||
msg.append(f"📜 R:{r_count}张\n")
|
||||
|
||||
# 添加成就通知
|
||||
unlocked_achievements = result.get("unlocked_achievements", [])
|
||||
if unlocked_achievements:
|
||||
msg.append("\n🏆 恭喜解锁新成就!\n")
|
||||
has_manual_rewards = False
|
||||
|
||||
for achievement_id in unlocked_achievements:
|
||||
# 尝试自动发放成就奖励
|
||||
auto_success, reward_msg = await process_achievement_reward(user_id, achievement_id)
|
||||
|
||||
# 检查是否是重复奖励
|
||||
if "_repeat_" in achievement_id:
|
||||
base_achievement_id = achievement_id.split("_repeat_")[0]
|
||||
achievement_config = config.ACHIEVEMENTS.get(base_achievement_id)
|
||||
if achievement_config:
|
||||
achievement_name = achievement_config["name"]
|
||||
# 使用重复奖励或默认为天卡
|
||||
reward = achievement_config.get("repeat_reward", "天卡")
|
||||
status = "✅ 已自动发放" if auto_success else "⚠️ 需手动领取"
|
||||
msg.append(f"🎖️ {achievement_name} 重复奖励 (奖励:{reward}) {status}\n")
|
||||
else:
|
||||
msg.append(f"🎖️ {achievement_id}\n")
|
||||
else:
|
||||
achievement_config = config.ACHIEVEMENTS.get(achievement_id)
|
||||
if achievement_config:
|
||||
achievement_name = achievement_config["name"]
|
||||
reward = achievement_config["reward"]
|
||||
status = "✅ 已自动发放" if auto_success else "⚠️ 需手动领取"
|
||||
msg.append(f"🎖️ {achievement_name} (奖励:{reward}) {status}\n")
|
||||
else:
|
||||
msg.append(f"🎖️ {achievement_id}\n")
|
||||
|
||||
# 记录是否有需要手动领取的奖励
|
||||
if not auto_success:
|
||||
has_manual_rewards = True
|
||||
|
||||
# 如果有未自动发放的奖励,提示联系管理员
|
||||
if has_manual_rewards:
|
||||
msg.append("💰 未自动发放的奖励请联系管理员\n")
|
||||
|
||||
# 添加成就进度提示
|
||||
achievement_data = gacha_system.get_user_achievements(user_id)
|
||||
if achievement_data["success"]:
|
||||
progress = achievement_data["progress"]
|
||||
consecutive_days = progress.get("consecutive_days", 0)
|
||||
no_ssr_streak = progress.get("no_ssr_streak", 0)
|
||||
|
||||
msg.append("\n📈 成就进度:\n")
|
||||
|
||||
# 连续抽卡天数进度
|
||||
if consecutive_days > 0:
|
||||
if consecutive_days < 30:
|
||||
msg.append(f"📅 勤勤恳恳Ⅰ:{consecutive_days}/30天 🎯\n")
|
||||
elif consecutive_days < 60:
|
||||
msg.append(f"📅 勤勤恳恳Ⅱ:{consecutive_days}/60天 🎯\n")
|
||||
elif consecutive_days < 90:
|
||||
msg.append(f"📅 勤勤恳恳Ⅲ:{consecutive_days}/90天 🎯\n")
|
||||
elif consecutive_days < 120:
|
||||
msg.append(f"📅 勤勤恳恳Ⅳ:{consecutive_days}/120天 ⭐\n")
|
||||
elif consecutive_days < 150:
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ:{consecutive_days}/150天 ⭐\n")
|
||||
else:
|
||||
next_reward_days = 30 - (consecutive_days % 30)
|
||||
if next_reward_days == 30:
|
||||
next_reward_days = 0
|
||||
if next_reward_days > 0:
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ (满级):{consecutive_days}天,距离下次奖励{next_reward_days}天 🎁\n")
|
||||
else:
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ (满级):{consecutive_days}天,可获得奖励!🎉\n")
|
||||
|
||||
# 无SSR/SP连击进度
|
||||
if no_ssr_streak > 0:
|
||||
if no_ssr_streak < 60:
|
||||
msg.append(f"💔 非酋进度:{no_ssr_streak}/60次 😭\n")
|
||||
elif no_ssr_streak < 120:
|
||||
msg.append(f"💔 顶级非酋:{no_ssr_streak}/120次 😱\n")
|
||||
elif no_ssr_streak < 180:
|
||||
msg.append(f"💔 月见黑:{no_ssr_streak}/180次 🌙\n")
|
||||
else:
|
||||
msg.append(f"💔 已达月见黑级别:{no_ssr_streak}次 🌚\n")
|
||||
|
||||
# 添加剩余次数
|
||||
draws_left = result["draws_left"]
|
||||
msg.append(f"\n📊 今日剩余抽卡次数:{draws_left}/{DAILY_LIMIT}")
|
||||
|
||||
# 如果抽到SSR/SP,处理奖励发放
|
||||
if ssr_count > 0:
|
||||
# 为每张SSR/SP处理奖励
|
||||
auto_rewards = 0
|
||||
manual_rewards = 0
|
||||
|
||||
# 这里简化处理,只处理一次奖励(因为每次抽卡都是独立的)
|
||||
# 如果需要为每张SSR/SP都发放奖励,可以循环处理
|
||||
auto_success, reward_msg = await process_ssr_sp_reward(user_id)
|
||||
if auto_success:
|
||||
auto_rewards += 1
|
||||
else:
|
||||
manual_rewards += 1
|
||||
|
||||
msg.append(f"\n\n{reward_msg}")
|
||||
|
||||
# 通知管理员
|
||||
admin_msg = f"🎉 用户 {user_name}({user_id}) 在三连抽中抽到了 {ssr_count} 张 SSR/SP!"
|
||||
if auto_rewards > 0:
|
||||
admin_msg += f" 已自动发放 {auto_rewards} 张奖励!"
|
||||
if manual_rewards > 0:
|
||||
admin_msg += f" 需要手动发放 {manual_rewards} 张奖励!"
|
||||
await notify_admin(bot, admin_msg)
|
||||
|
||||
await triple_gacha_matcher.finish(msg)
|
||||
|
||||
@achievement_matcher.handle()
|
||||
async def handle_achievement(bot: Bot, event: MessageEvent, state: T_State):
|
||||
"""处理成就查询命令"""
|
||||
user_id = str(event.user_id)
|
||||
user_name = event.sender.card or event.sender.nickname or "未知用户"
|
||||
|
||||
# 获取用户成就信息
|
||||
result = gacha_system.get_user_achievements(user_id)
|
||||
|
||||
if not result["success"]:
|
||||
await achievement_matcher.finish(f"❌ {result['message']}")
|
||||
|
||||
# 构建成就消息
|
||||
msg = Message()
|
||||
msg.append(f"🏆 {format_user_mention(user_id, user_name)} 的成就信息:\n\n")
|
||||
|
||||
# 显示已解锁成就
|
||||
unlocked = result["achievements"]
|
||||
if unlocked:
|
||||
msg.append("🎖️ 已解锁成就:\n")
|
||||
for achievement in unlocked:
|
||||
# 检查是否是重复奖励
|
||||
if "_repeat_" in achievement:
|
||||
base_achievement_id = achievement.split("_repeat_")[0]
|
||||
achievement_config = config.ACHIEVEMENTS.get(base_achievement_id)
|
||||
if achievement_config:
|
||||
achievement_name = achievement_config["name"]
|
||||
reward = achievement_config.get("repeat_reward", "天卡")
|
||||
msg.append(f"✅ {achievement_name} 重复奖励 (奖励:{reward})\n")
|
||||
else:
|
||||
msg.append(f"✅ {achievement}\n")
|
||||
else:
|
||||
achievement_config = config.ACHIEVEMENTS.get(achievement)
|
||||
if achievement_config:
|
||||
achievement_name = achievement_config["name"]
|
||||
reward = achievement_config["reward"]
|
||||
msg.append(f"✅ {achievement_name} (奖励:{reward})\n")
|
||||
else:
|
||||
msg.append(f"✅ {achievement}\n")
|
||||
msg.append("\n💰 获取奖励请联系管理员\n\n")
|
||||
|
||||
# 显示成就进度
|
||||
progress = result["progress"]
|
||||
msg.append("📊 成就进度:\n")
|
||||
|
||||
# 连续抽卡天数 - 勤勤恳恳系列成就
|
||||
consecutive_days = progress.get("consecutive_days", 0)
|
||||
if consecutive_days > 0:
|
||||
# 判断当前应该显示哪个等级的进度
|
||||
if consecutive_days < 30:
|
||||
msg.append(f"📅 勤勤恳恳Ⅰ:{consecutive_days}/30 天 (奖励:天卡)\n")
|
||||
elif consecutive_days < 60:
|
||||
msg.append(f"📅 勤勤恳恳Ⅱ:{consecutive_days}/60 天 (奖励:天卡)\n")
|
||||
elif consecutive_days < 90:
|
||||
msg.append(f"📅 勤勤恳恳Ⅲ:{consecutive_days}/90 天 (奖励:天卡)\n")
|
||||
elif consecutive_days < 120:
|
||||
msg.append(f"📅 勤勤恳恳Ⅳ:{consecutive_days}/120 天 (奖励:周卡)\n")
|
||||
elif consecutive_days < 150:
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ:{consecutive_days}/150 天 (奖励:周卡)\n")
|
||||
else:
|
||||
# 已达到最高等级,显示下次奖励进度
|
||||
next_reward_days = 30 - (consecutive_days % 30)
|
||||
if next_reward_days == 30:
|
||||
next_reward_days = 0
|
||||
msg.append(f"📅 勤勤恳恳Ⅴ (已满级):{consecutive_days} 天\n")
|
||||
if next_reward_days > 0:
|
||||
msg.append(f"🎁 距离下次奖励:{next_reward_days} 天 (奖励:天卡)\n")
|
||||
else:
|
||||
msg.append(f"🎁 可获得奖励!请联系管理员 (奖励:天卡)\n")
|
||||
|
||||
# 无SSR/SP连击数
|
||||
no_ssr_streak = progress.get("no_ssr_streak", 0)
|
||||
if no_ssr_streak > 0:
|
||||
msg.append(f"💔 无SSR/SP连击:{no_ssr_streak} 次\n")
|
||||
|
||||
# 显示各个非酋成就的进度
|
||||
if no_ssr_streak < 60:
|
||||
msg.append(f" 🎯 非酋成就:{no_ssr_streak}/60 (奖励:天卡)\n")
|
||||
elif no_ssr_streak < 120:
|
||||
msg.append(f" 🎯 顶级非酋成就:{no_ssr_streak}/120 (奖励:周卡)\n")
|
||||
elif no_ssr_streak < 180:
|
||||
msg.append(f" 🎯 月见黑成就:{no_ssr_streak}/180 (奖励:月卡)\n")
|
||||
else:
|
||||
msg.append(f" 🌙 已达到月见黑级别!\n")
|
||||
|
||||
# 如果没有任何进度,显示提示
|
||||
if consecutive_days == 0 and no_ssr_streak == 0:
|
||||
msg.append("🌱 还没有任何成就进度,快去抽卡吧!")
|
||||
|
||||
await achievement_matcher.finish(msg)
|
||||
|
||||
# 注册查询抽卡指令,支持@用户查询功能
|
||||
query_matcher = on_command("查询抽卡", aliases={"查询抽奖"}, priority=5, rule=check_permission())
|
||||
|
||||
@query_matcher.handle()
|
||||
async def handle_query(bot: Bot, event: MessageEvent, state: T_State):
|
||||
# 获取消息中的@用户
|
||||
message = event.get_message()
|
||||
at_segment = None
|
||||
|
||||
for segment in message:
|
||||
if segment.type == "at":
|
||||
at_segment = segment
|
||||
break
|
||||
|
||||
# 确定查询的用户ID
|
||||
if at_segment:
|
||||
# 查询被@的用户
|
||||
target_user_id = str(at_segment.data.get("qq", ""))
|
||||
# 获取被@用户的信息
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
try:
|
||||
group_id = event.group_id
|
||||
user_info = await bot.get_group_member_info(group_id=group_id, user_id=int(target_user_id))
|
||||
target_user_name = user_info.get("card") or user_info.get("nickname", "用户")
|
||||
except:
|
||||
target_user_name = "用户"
|
||||
else:
|
||||
target_user_name = "用户"
|
||||
else:
|
||||
# 查询自己
|
||||
target_user_id = str(event.user_id)
|
||||
target_user_name = event.sender.card if isinstance(event, GroupMessageEvent) else event.sender.nickname
|
||||
|
||||
# 获取用户统计
|
||||
stats = gacha_system.get_user_stats(target_user_id)
|
||||
|
||||
# 构建响应消息
|
||||
msg = Message()
|
||||
|
||||
# 如果查询的是他人
|
||||
if target_user_id != str(event.user_id):
|
||||
msg.append(format_user_mention(str(event.user_id), event.sender.card if isinstance(event, GroupMessageEvent) else event.sender.nickname))
|
||||
msg.append(f" 查询了 ")
|
||||
msg.append(format_user_mention(target_user_id, target_user_name))
|
||||
msg.append(f" 的抽卡记录\n\n")
|
||||
else:
|
||||
msg.append(format_user_mention(target_user_id, target_user_name) + "\n")
|
||||
|
||||
if not stats["success"]:
|
||||
msg.append(f"该用户还没有抽卡记录哦!")
|
||||
await query_matcher.finish(msg)
|
||||
|
||||
# 构建统计信息
|
||||
msg.append(f"总抽卡次数:{stats['total_draws']}\n")
|
||||
msg.append(f"R卡数量:{stats['R_count']}\n")
|
||||
msg.append(f"SR卡数量:{stats['SR_count']}\n")
|
||||
msg.append(f"SSR卡数量:{stats['SSR_count']}\n")
|
||||
msg.append(f"SP卡数量:{stats['SP_count']}\n")
|
||||
|
||||
# 计算每种稀有度的比例
|
||||
if stats['total_draws'] > 0:
|
||||
msg.append("\n稀有度比例:\n")
|
||||
msg.append(f"R: {stats['R_count']/stats['total_draws']*100:.2f}%\n")
|
||||
msg.append(f"SR: {stats['SR_count']/stats['total_draws']*100:.2f}%\n")
|
||||
msg.append(f"SSR: {stats['SSR_count']/stats['total_draws']*100:.2f}%\n")
|
||||
msg.append(f"SP: {stats['SP_count']/stats['total_draws']*100:.2f}%\n")
|
||||
|
||||
# 添加最近抽卡记录
|
||||
if stats["recent_draws"]:
|
||||
msg.append("\n最近5次抽卡记录:\n")
|
||||
for draw in reversed(stats["recent_draws"]):
|
||||
msg.append(f"{draw['date']}: {draw['rarity']} - {draw['name']}\n")
|
||||
|
||||
await query_matcher.finish(msg)
|
||||
|
||||
# 自定义排行榜权限检查(仅检查白名单,不检查抽卡次数)
|
||||
def check_rank_permission() -> Rule:
|
||||
async def _checker(event: MessageEvent) -> bool:
|
||||
# 允许特定用户在任何场景下使用
|
||||
if event.user_id == ALLOWED_USER_ID:
|
||||
return True
|
||||
|
||||
# 在允许的群聊中任何人都可以使用
|
||||
if isinstance(event, GroupMessageEvent) and event.group_id == ALLOWED_GROUP_ID:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
return Rule(_checker)
|
||||
|
||||
|
||||
rank_matcher = on_startswith(("抽卡排行","抽卡榜"), priority=1, rule=check_rank_permission())
|
||||
|
||||
@rank_matcher.handle()
|
||||
async def handle_rank(bot: Bot, event: MessageEvent, state: T_State):
|
||||
# 获取排行榜数据
|
||||
rank_data = gacha_system.get_rank_list()
|
||||
|
||||
if not rank_data:
|
||||
await rank_matcher.finish("暂无抽卡排行榜数据")
|
||||
|
||||
# 构建消息
|
||||
msg = Message("✨┈┈┈┈┈ 抽卡排行榜 ┈┈┈┈┈✨\n")
|
||||
msg.append("🏆 SSR/SP稀有度式神排行榜 🏆\n")
|
||||
msg.append("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n")
|
||||
|
||||
for i, (user_id, data) in enumerate(rank_data[:10], 1):
|
||||
# 获取用户昵称
|
||||
user_name = "未知用户"
|
||||
try:
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
# 群聊场景获取群名片或昵称
|
||||
user_info = await bot.get_group_member_info(group_id=event.group_id, user_id=int(user_id))
|
||||
user_name = user_info.get("card") or user_info.get("nickname", "未知用户")
|
||||
else:
|
||||
# 私聊场景获取昵称
|
||||
user_info = await bot.get_stranger_info(user_id=int(user_id))
|
||||
user_name = user_info.get("nickname", "未知用户")
|
||||
except Exception as e:
|
||||
# 如果获取失败,尝试从事件中获取发送者信息
|
||||
if str(user_id) == str(event.user_id):
|
||||
user_name = event.sender.card if isinstance(event, GroupMessageEvent) else event.sender.nickname
|
||||
|
||||
# 美化输出格式
|
||||
rank_icon = "🥇" if i == 1 else "🥈" if i == 2 else "🥉" if i == 3 else f"{i}."
|
||||
ssr_icon = "🌟"
|
||||
sp_icon = "💫"
|
||||
total = data['SSR_count'] + data['SP_count']
|
||||
|
||||
msg.append(f"{rank_icon} {user_name}\n")
|
||||
msg.append(f" {ssr_icon}SSR: {data['SSR_count']}次 {sp_icon}SP: {data['SP_count']}次\n")
|
||||
msg.append(f" 🔮总计: {total}次\n")
|
||||
msg.append("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n")
|
||||
|
||||
await rank_matcher.finish(msg)
|
||||
|
||||
|
||||
|
||||
@daily_stats_matcher.handle()
|
||||
async def handle_daily_stats(bot: Bot, event: MessageEvent, state: T_State):
|
||||
"""处理今日抽卡统计命令"""
|
||||
result = gacha_system.get_daily_stats()
|
||||
|
||||
if not result["success"]:
|
||||
await daily_stats_matcher.finish(f"❌ {result['message']}")
|
||||
|
||||
stats = result["stats"]
|
||||
date = result["date"]
|
||||
|
||||
# 构建统计消息
|
||||
msg = Message()
|
||||
msg.append(f"📊 今日抽卡统计 ({date})\n\n")
|
||||
msg.append(f"👥 参与人数:{stats['total_users']}人\n")
|
||||
msg.append(f"🎲 总抽卡次数:{stats['total_draws']}次\n\n")
|
||||
|
||||
# 稀有度分布
|
||||
msg.append("🎯 稀有度分布:\n")
|
||||
if stats['total_draws'] > 0:
|
||||
msg.append(f"📜 R:{stats['rarity_stats']['R']}张 ({stats['rarity_stats']['R']/stats['total_draws']*100:.1f}%)\n")
|
||||
msg.append(f"⭐ SR:{stats['rarity_stats']['SR']}张 ({stats['rarity_stats']['SR']/stats['total_draws']*100:.1f}%)\n")
|
||||
msg.append(f"🌟 SSR:{stats['rarity_stats']['SSR']}张 ({stats['rarity_stats']['SSR']/stats['total_draws']*100:.1f}%)\n")
|
||||
msg.append(f"🌈 SP:{stats['rarity_stats']['SP']}张 ({stats['rarity_stats']['SP']/stats['total_draws']*100:.1f}%)\n\n")
|
||||
else:
|
||||
msg.append("暂无数据\n\n")
|
||||
|
||||
# SSR/SP排行榜
|
||||
if stats['top_users']:
|
||||
msg.append("🏆 今日SSR/SP排行榜:\n")
|
||||
for i, user_data in enumerate(stats['top_users'][:5], 1):
|
||||
user_id = user_data['user_id']
|
||||
ssr_count = user_data['ssr_count']
|
||||
|
||||
# 尝试获取用户昵称
|
||||
try:
|
||||
user_info = await bot.get_stranger_info(user_id=int(user_id))
|
||||
user_name = user_info.get('nickname', f'用户{user_id}')
|
||||
except:
|
||||
user_name = f'用户{user_id}'
|
||||
|
||||
if i == 1:
|
||||
msg.append(f"🥇 {user_name}:{ssr_count}张\n")
|
||||
elif i == 2:
|
||||
msg.append(f"🥈 {user_name}:{ssr_count}张\n")
|
||||
elif i == 3:
|
||||
msg.append(f"🥉 {user_name}:{ssr_count}张\n")
|
||||
else:
|
||||
msg.append(f"🏅 {user_name}:{ssr_count}张\n")
|
||||
else:
|
||||
msg.append("🏆 今日还没有人抽到SSR/SP哦~")
|
||||
|
||||
await daily_stats_matcher.finish(msg)
|
||||
|
||||
# 抽卡介绍命令
|
||||
intro_matcher = on_command("抽卡介绍", aliases=set(INTRO_COMMANDS), priority=5, rule=check_permission())
|
||||
|
||||
@intro_matcher.handle()
|
||||
async def handle_intro(bot: Bot, event: MessageEvent, state: T_State):
|
||||
"""处理抽卡介绍命令"""
|
||||
|
||||
# 构建介绍消息
|
||||
msg = "🎮 阴阳师抽卡系统介绍 🎮\n\n"
|
||||
|
||||
# 抽卡机制
|
||||
msg += "📋 抽卡机制:\n"
|
||||
msg += f"• 每日限制:{DAILY_LIMIT}次免费抽卡\n"
|
||||
msg += "• 稀有度概率:\n"
|
||||
for rarity, prob in config.RARITY_PROBABILITY.items():
|
||||
msg += f" - {rarity}: {prob}%\n"
|
||||
msg += "\n"
|
||||
|
||||
# 可用指令
|
||||
msg += "🎯 可用指令:\n"
|
||||
msg += f"• 抽卡:{', '.join(GACHA_COMMANDS[:3])}\n"
|
||||
msg += f"• 三连抽:{', '.join(TRIPLE_GACHA_COMMANDS)}\n"
|
||||
msg += f"• 个人统计:{', '.join(STATS_COMMANDS[:2])}\n"
|
||||
msg += f"• 今日统计:{', '.join(DAILY_STATS_COMMANDS[:2])}\n"
|
||||
msg += f"• 查询成就:{', '.join(ACHIEVEMENT_COMMANDS)}\n"
|
||||
msg += "• 查询抽卡/查询抽奖:查询自己的或@他人的抽卡数据\n"
|
||||
msg += "• 抽卡排行/抽卡榜:查看SSR/SP排行榜\n"
|
||||
msg += "\n"
|
||||
|
||||
# 成就系统
|
||||
msg += "🏆 成就系统:\n"
|
||||
msg += "\n📅 勤勤恳恳系列(连续抽卡):\n"
|
||||
consecutive_achievements = [
|
||||
("勤勤恳恳Ⅰ", "30天", "天卡"),
|
||||
("勤勤恳恳Ⅱ", "60天", "天卡"),
|
||||
("勤勤恳恳Ⅲ", "90天", "天卡"),
|
||||
("勤勤恳恳Ⅳ", "120天", "周卡"),
|
||||
("勤勤恳恳Ⅴ", "150天", "周卡")
|
||||
]
|
||||
|
||||
for name, days, reward in consecutive_achievements:
|
||||
msg += f"• {name}:连续{days} → {reward} 💎\n"
|
||||
msg += " ※ 达到最高等级后每30天可重复获得天卡奖励\n\n"
|
||||
|
||||
msg += "😭 非酋系列(无SSR/SP连击):\n"
|
||||
no_ssr_achievements = [
|
||||
("非酋", "60次", "天卡"),
|
||||
("顶级非酋", "120次", "周卡"),
|
||||
("月见黑", "180次", "月卡")
|
||||
]
|
||||
|
||||
for name, count, reward in no_ssr_achievements:
|
||||
msg += f"• {name}:连续{count}未中SSR/SP → {reward} 💎\n"
|
||||
msg += "\n"
|
||||
|
||||
# 奖励说明
|
||||
msg += "🎁 奖励说明:\n"
|
||||
msg += "• 天卡:蛋定助手天卡奖励\n"
|
||||
msg += "• 周卡:蛋定助手周卡奖励\n"
|
||||
msg += "• 月卡:蛋定助手月卡奖励\n"
|
||||
msg += "\n"
|
||||
|
||||
# 联系管理员
|
||||
msg += "📞 重要提醒:\n"
|
||||
msg += "🔸 所有奖励需要联系管理员获取 🔸\n"
|
||||
msg += "请在获得成就后主动联系管理员领取奖励哦~ 😊\n\n"
|
||||
|
||||
# 祝福语
|
||||
msg += "🍀 祝您抽卡愉快,欧气满满! ✨"
|
||||
|
||||
await intro_matcher.finish(msg)
|
||||
|
||||
# 导入 Web API 模块,使其路由能够注册到 NoneBot 的 FastAPI 应用
|
||||
from . import web_api
|
||||
|
||||
# 注册 Web 路由
|
||||
try:
|
||||
web_api.register_web_routes()
|
||||
except Exception as e:
|
||||
print(f"❌ 注册 onmyoji_gacha Web 路由失败: {e}")
|
||||
Reference in New Issue
Block a user