refactor: onmyoji gacha plugin overhaul (gacha-refactor)
This commit is contained in:
@@ -1,42 +1,108 @@
|
||||
import os
|
||||
from typing import Optional
|
||||
from pathlib import Path
|
||||
|
||||
def get_image_path(file_path: str) -> str:
|
||||
"""获取图片的绝对路径"""
|
||||
return os.path.abspath(file_path)
|
||||
|
||||
def format_user_mention(user_id: str, user_name: Optional[str] = None) -> str:
|
||||
"""格式化用户@信息"""
|
||||
display_name = user_name if user_name else f"用户{user_id}"
|
||||
return f"@{display_name}"
|
||||
|
||||
|
||||
def get_luck_description(points: int) -> tuple[str, str]:
|
||||
"""根据积分返回运气描述与emoji"""
|
||||
if points <= 10:
|
||||
return "非酋", "😭"
|
||||
if points <= 30:
|
||||
return "一般", "😐"
|
||||
if points <= 60:
|
||||
return "小欧", "😊"
|
||||
if points <= 90:
|
||||
return "大欧", "🎉"
|
||||
return "欧皇", "👑"
|
||||
|
||||
|
||||
def format_sign_in_message(
|
||||
user_id: str,
|
||||
user_name: str,
|
||||
points: int,
|
||||
balance: int,
|
||||
) -> str:
|
||||
"""格式化签到成功消息"""
|
||||
luck_text, luck_emoji = get_luck_description(points)
|
||||
mention = format_user_mention(user_id, user_name)
|
||||
return (
|
||||
f"{mention} 📅 每日签到成功!\n"
|
||||
f"🎁 获得积分:{points}\n"
|
||||
f"{luck_emoji} 今日运气:{luck_text}\n"
|
||||
f"💰 当前积分:{balance}"
|
||||
)
|
||||
"""
|
||||
阴阳师抽卡插件 - 通用工具函数
|
||||
|
||||
提供常用的辅助函数:
|
||||
- 用户提及格式化
|
||||
- 图片路径处理
|
||||
"""
|
||||
|
||||
import os
|
||||
from typing import Optional
|
||||
from pathlib import Path
|
||||
|
||||
def get_image_path(file_path: str) -> str:
|
||||
"""获取图片的绝对路径"""
|
||||
return os.path.abspath(file_path)
|
||||
|
||||
def format_user_mention(user_id: str, user_name: Optional[str] = None) -> str:
|
||||
"""格式化用户@信息"""
|
||||
display_name = user_name if user_name else f"用户{user_id}"
|
||||
return f"@{display_name}"
|
||||
|
||||
|
||||
def get_luck_description(points: int) -> tuple[str, str]:
|
||||
"""根据积分返回运气描述与emoji"""
|
||||
if points <= 10:
|
||||
return "非酋", "😭"
|
||||
if points <= 30:
|
||||
return "一般", "😐"
|
||||
if points <= 60:
|
||||
return "小欧", "😊"
|
||||
if points <= 90:
|
||||
return "大欧", "🎉"
|
||||
return "欧皇", "👑"
|
||||
|
||||
|
||||
def format_sign_in_message(
|
||||
user_id: str,
|
||||
user_name: str,
|
||||
points: int,
|
||||
balance: int,
|
||||
) -> str:
|
||||
"""格式化签到成功消息"""
|
||||
luck_text, luck_emoji = get_luck_description(points)
|
||||
mention = format_user_mention(user_id, user_name)
|
||||
return (
|
||||
f"{mention} 📅 每日签到成功!\n"
|
||||
f"🎁 获得积分:{points}\n"
|
||||
f"{luck_emoji} 今日运气:{luck_text}\n"
|
||||
f"💰 当前积分:{balance}"
|
||||
)
|
||||
|
||||
|
||||
|
||||
def get_user_name(event) -> str:
|
||||
"""从消息事件中获取用户昵称,统一多处重复逻辑。
|
||||
|
||||
Args:
|
||||
event: NoneBot MessageEvent 对象
|
||||
|
||||
Returns:
|
||||
str: 用户昵称,优先使用群名片(card),其次昵称(nickname),兜底"未知用户"
|
||||
"""
|
||||
from nonebot.adapters.onebot.v11 import GroupMessageEvent
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
return event.sender.card or event.sender.nickname or "未知用户"
|
||||
return event.sender.nickname or "未知用户"
|
||||
|
||||
|
||||
async def build_achievement_notify(user_id: str, unlocked_ids: list) -> "Message | None":
|
||||
"""统一的成就通知编排:ID列表 → 详情查询 → 奖励领取 → 消息格式化。
|
||||
|
||||
供所有handler共用,消除成就通知逻辑的重复(原则#4 变化半径小 / #12 功能越多代码越短)。
|
||||
|
||||
Args:
|
||||
user_id: 用户ID
|
||||
unlocked_ids: 新解锁的成就ID列表
|
||||
|
||||
Returns:
|
||||
Message对象,无有效成就时返回None
|
||||
"""
|
||||
from .api_utils import process_achievement_reward, get_achievement_by_id
|
||||
from . import formatters
|
||||
|
||||
achievements_data = []
|
||||
for achievement_id in unlocked_ids:
|
||||
ach = get_achievement_by_id(achievement_id)
|
||||
if not ach:
|
||||
continue
|
||||
success, reward_msg = await process_achievement_reward(user_id, achievement_id)
|
||||
ach["reward_msg"] = reward_msg if success else ""
|
||||
ach["claimed"] = success
|
||||
achievements_data.append(ach)
|
||||
|
||||
if not achievements_data:
|
||||
return None
|
||||
return formatters.format_achievement_notify(achievements_data, user_id)
|
||||
|
||||
|
||||
# ---- GachaSystem 单例(P1#3: 避免每次handler调用都new实例) ----
|
||||
_gacha_system_instance = None
|
||||
|
||||
def get_gacha_system():
|
||||
"""获取全局唯一的GachaSystem实例(lazy init)。"""
|
||||
global _gacha_system_instance
|
||||
if _gacha_system_instance is None:
|
||||
from .gacha import GachaSystem
|
||||
_gacha_system_instance = GachaSystem()
|
||||
return _gacha_system_instance
|
||||
|
||||
Reference in New Issue
Block a user