migration vers new components V2, et ajout de diverse fonctions !

This commit is contained in:
Mathis 2026-05-16 18:05:04 +02:00
parent 3590cb748f
commit ba9e297cb8
14 changed files with 851 additions and 371 deletions

View file

@ -5,6 +5,7 @@ import aiohttp
import io
import os
import logging
import asyncio
from PIL import Image, ImageDraw, ImageFont
kuby_logger = logging.getLogger("KubyBot")
@ -132,7 +133,7 @@ class Welcome(commands.Cog):
kuby_logger.debug(f"🔍 [Welcome] Config récupérée: DM={bool(welcome_dm_text)}, Channel={welcome_channel}")
# 1. Gestion du DM
if welcome_dm_text:
if welcome_dm_text and not member.bot:
kuby_logger.info(f"✉️ [Welcome] Tentative d'envoi de DM à {member.name}")
try:
formatted_message = welcome_dm_text.format(
@ -149,6 +150,8 @@ class Welcome(commands.Cog):
except disnake.HTTPException as e:
if e.code == 40003: # Rate limited (Opening DMs too fast)
kuby_logger.warning(f"⏳ [Welcome] Limite de débit Discord atteinte pour les DMs : {member.name} n'a pas reçu son message.")
elif e.code == 50007: # Cannot send messages to this user
kuby_logger.warning(f"🚫 [Welcome] Impossible d'envoyer le DM à {member.name} (DMs fermés ou utilisateur non joignable)")
else:
kuby_logger.error(f"❌ [Welcome] Erreur HTTP lors de l'envoi du DM à {member.name}: {e}")
except Exception as e:
@ -169,18 +172,33 @@ class Welcome(commands.Cog):
banner_background=banner_background
)
if img:
# Attendre un peu que le Cog d'invitations traite le join
await asyncio.sleep(1)
invites_cog = self.bot.get_cog("Invites")
inviter_text = ""
if invites_cog:
inviter_id = invites_cog.get_inviter_info(member.guild.id, member.id)
if inviter_id:
inviter = member.guild.get_member(inviter_id) or await self.bot.fetch_user(inviter_id)
total, current = invites_cog.get_invite_stats(member.guild.id, inviter_id)
inviter_text = f"\n\n**Invité par :** {inviter.mention} ({current} invitations)"
# Utiliser le message personnalisé ou un message par défaut
channel_description = welcome_channel_message.format(
channel_description = (welcome_channel_message.format(
username=member.name,
servername=member.guild.name,
member_count=member.guild.member_count
) if welcome_channel_message else "Bienvenue dans le serveur !\nSi vous cherchez des RolePlay de qualité,\nVous êtes au bon endroit. <a:sip:1316891821858619452>"
) if welcome_channel_message else "Bienvenue dans le serveur !\nSi vous cherchez des RolePlay de qualité,\nVous êtes au bon endroit. <a:sip:1316891821858619452>") + inviter_text
embed = disnake.Embed(title=f"Merci d'accueillir {member} 🤝",
description=channel_description,
color=disnake.Color.dark_purple())
embed.set_image(url="attachment://welcome.png")
await channel.send(content=member.mention, embed=embed, file=disnake.File(img, filename="welcome.png"))
components = [
disnake.ui.Container(
disnake.ui.TextDisplay(f"Merci d'accueillir {member} 🤝"),
disnake.ui.Separator(divider=True),
disnake.ui.TextDisplay(channel_description),
disnake.ui.MediaGallery(disnake.MediaGalleryItem(url="attachment://welcome.png"))
)
]
await channel.send(content=member.mention, components=components, file=disnake.File(img, filename="welcome.png"))
async def save_banner_attachment(self, attachment: disnake.Attachment, guild_id: int) -> str:
"""Sauvegarde l'attachment et retourne le chemin du fichier"""
@ -243,6 +261,36 @@ class Welcome(commands.Cog):
bg_used = "background_template.png" if not banner_path else (banner_path.split('/')[-1])
await interaction.response.send_message(f"✅ Configuration de bienvenida enregistrée !\nFond utilisé: {bg_used}", ephemeral=True)
@commands.slash_command(name="invitations", description="Affiche vos statistiques d'invitations")
async def invitations_stats(self, interaction: disnake.ApplicationCommandInteraction, user: disnake.Member = None):
user = user or interaction.author
await self._send_invitation_stats(interaction, user)
@commands.user_command(name="Stats Invitations")
async def invitations_user(self, interaction: disnake.UserCommandInteraction, user: disnake.Member):
await self._send_invitation_stats(interaction, user)
async def _send_invitation_stats(self, interaction, user):
invites_cog = self.bot.get_cog("Invites")
if not invites_cog:
return await interaction.response.send_message("❌ Le module d'invitations est désactivé.", ephemeral=True)
total, current = invites_cog.get_invite_stats(interaction.guild.id, user.id)
components = [
disnake.ui.Container(
disnake.ui.Section(
f"Statistiques d'invitations - {user.display_name}",
accessory=disnake.ui.Thumbnail(user.display_avatar.url)
),
disnake.ui.Separator(divider=True),
disnake.ui.TextDisplay(f"➜ Total d'invitations : **{total}**"),
disnake.ui.TextDisplay(f"➜ Membres présents : **{current}**")
)
]
await interaction.response.send_message(components=components)
def setup(bot):
bot.add_cog(Welcome(bot))