Replaces display-name prefix parsing ([RTF]/[RTFC]/[RTFR]) with Discord role-based clan detection (TEAI/TEAF/TEAC/TEACO). - config: new CLAN_CONFIG with 4 TEA clans, CLAN_ROLE_IDS, CLAN_MIGRATION - helpers: get_user_clan() replaced by get_clan_from_member() - DatabaseManager: adds clan column on startup, auto-migrates existing records from old username prefixes, filters leaderboard by clan column - pb_handler: detects clan from roles on submission, passes it to DB - leaderboard_handler: reads clan from DB column instead of username - top10: new commands !teai*/!teaf*/!teac*/!teaco* (removes !rtf*) - guide: updated command list and bot title Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
74 lines
3.1 KiB
Python
74 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
import os
|
|
import discord
|
|
from discord.ext import commands
|
|
from config import AUTHORIZED_CHANNEL_ID, BOSS_CONFIG, CLAN_CONFIG
|
|
from utils.helpers import normalize_difficulty, get_difficulty_display_name, format_damage_display, format_date_only
|
|
|
|
db_manager = None
|
|
|
|
def set_db_manager(db):
|
|
global db_manager
|
|
db_manager = db
|
|
|
|
async def show_leaderboard(ctx, boss_type, difficulty=None, clan=None):
|
|
"""Fonction générique pour afficher les classements"""
|
|
if ctx.channel.id != AUTHORIZED_CHANNEL_ID:
|
|
return
|
|
|
|
try:
|
|
# Normaliser la difficulté si spécifiée
|
|
if difficulty:
|
|
difficulty = normalize_difficulty(difficulty)
|
|
if difficulty not in BOSS_CONFIG[boss_type]['difficulties']:
|
|
difficulties = " | ".join(BOSS_CONFIG[boss_type]['difficulties'])
|
|
await ctx.send(f"⚠️ Invalid difficulty. Available: {difficulties}")
|
|
return
|
|
|
|
boss_info = BOSS_CONFIG[boss_type]
|
|
leaderboard = db_manager.get_leaderboard(boss_type, difficulty, 10, clan)
|
|
|
|
if not leaderboard:
|
|
clan_text = f" for clan {clan}" if clan else ""
|
|
difficulty_text = f" {get_difficulty_display_name(difficulty)}" if difficulty else ""
|
|
await ctx.send(f"⚠️ No{difficulty_text} {boss_info['name']} records found{clan_text} yet!")
|
|
return
|
|
|
|
# Titre avec clan et difficulté si spécifiés
|
|
difficulty_name = get_difficulty_display_name(difficulty) if difficulty else ""
|
|
title = f"🏆 {difficulty_name} {boss_info['name']} Leaderboard - Top 10"
|
|
|
|
if clan:
|
|
clan_info = CLAN_CONFIG.get(clan, {'name': clan, 'emoji': '🏛️'})
|
|
title = f"{clan_info['emoji']} {clan_info['name']} - {difficulty_name} {boss_info['name']} Top 10"
|
|
|
|
embed = discord.Embed(
|
|
title=title,
|
|
color=boss_info['color'] if not clan else CLAN_CONFIG.get(clan, {'color': boss_info['color']})['color']
|
|
)
|
|
|
|
medals = ["🥇", "🥈", "🥉"] + ["🏅"] * 7
|
|
|
|
for i, (username, damage, date, row_clan) in enumerate(leaderboard):
|
|
date_text = ""
|
|
if date:
|
|
formatted_date = format_date_only(date)
|
|
if formatted_date:
|
|
date_text = f" • {formatted_date}"
|
|
|
|
# Afficher l'emoji du clan si le leaderboard est global (pas filtré par clan)
|
|
display_name = username
|
|
if not clan and row_clan:
|
|
clan_emoji = CLAN_CONFIG.get(row_clan, {'emoji': '🏛️'})['emoji']
|
|
display_name = f"{clan_emoji} {username}"
|
|
|
|
embed.add_field(
|
|
name=f"{medals[i]} #{i+1} {display_name}",
|
|
value=f"**{format_damage_display(damage)} damage**{date_text}",
|
|
inline=False
|
|
)
|
|
|
|
await ctx.send(embed=embed)
|
|
|
|
except Exception as e:
|
|
await ctx.send(f"⚠️ Error: {e}")
|