This commit is contained in:
2026-02-14 18:28:03 +01:00
parent 5709b1c0a3
commit 830ce61796
+2 -34
View File
@@ -1414,10 +1414,6 @@ async def handle_say_command(message: Message, bot):
logging.error(f"Erreur lors de l'envoi du message: {e}")
async def handle_transfer_command(message: Message, bot):
"""
Commande pour transférer un message d'un canal à un autre en préservant l'identité de l'auteur original.
Syntaxe: !transfert #canal_destination <message_id ou lien> [raison]
"""
if not has_staff_role(message.author.roles):
await send_access_denied(message.channel)
return
@@ -1453,7 +1449,6 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
# Récupérer le canal de destination
target_channel = None
if message.channel_mentions:
target_channel = message.channel_mentions[0]
@@ -1474,7 +1469,6 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
# Vérifier que le canal de destination est compatible
if not isinstance(target_channel, (TextChannel, ForumChannel, Thread)):
embed = discord.Embed(
title="❌ Erreur",
@@ -1485,14 +1479,11 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
# Récupérer le message à transférer
message_id = None
source_channel = message.channel
# Vérifier si c'est un lien Discord
if 'discord.com/channels/' in parts[2]:
try:
# Format: https://discord.com/channels/guild_id/channel_id/message_id
link_parts = parts[2].split('/')
source_channel_id = int(link_parts[-2])
message_id = int(link_parts[-1])
@@ -1517,7 +1508,6 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
else:
# C'est un ID de message
try:
message_id = int(parts[2])
except ValueError:
@@ -1530,7 +1520,6 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
# Récupérer le message original
try:
original_message = await source_channel.fetch_message(message_id)
except discord.NotFound:
@@ -1552,15 +1541,12 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
# Raison du transfert (optionnel)
reason = parts[3] if len(parts) > 3 else "Message posté dans le mauvais canal"
# Préparer le contenu du message
content = original_message.content
embeds = original_message.embeds
files_to_send = []
# Télécharger les pièces jointes
for attachment in original_message.attachments:
try:
file_data = await attachment.read()
@@ -1571,16 +1557,12 @@ async def handle_transfer_command(message: Message, bot):
except Exception as e:
logging.error(f"Erreur lors du téléchargement de la pièce jointe: {e}")
# Gestion différente selon le type de canal
transferred_message = None
if isinstance(target_channel, ForumChannel):
# Pour un forum : créer un nouveau post (thread)
try:
# Générer un titre pour le post avec le nom de l'auteur original
post_title = f"{original_message.author.display_name} - "
if content and len(content) > 0:
# Utiliser le contenu pour le reste du titre
remaining_length = 100 - len(post_title)
post_title += content[:remaining_length]
else:
@@ -1589,15 +1571,12 @@ async def handle_transfer_command(message: Message, bot):
if len(post_title) > 100:
post_title = post_title[:97] + "..."
# Ajouter un message informatif au début du contenu
transfer_notice = f"**Message original de {original_message.author.mention}**\n"
transfer_notice += f"*Ce message a été transféré par un membre du staff depuis {source_channel.mention}*\n"
transfer_notice += "" * 50 + "\n\n"
# Combiner le message informatif avec le contenu original
full_content = transfer_notice + (content or "")
# Créer le post dans le forum
thread = await target_channel.create_thread(
name=post_title,
content=full_content,
@@ -1605,7 +1584,7 @@ async def handle_transfer_command(message: Message, bot):
files=files_to_send,
reason=f"Transfert depuis {source_channel.name} par {message.author.name}"
)
transferred_message = thread.message # Le message initial du thread
transferred_message = thread.message
except discord.HTTPException as e:
logging.error(f"Erreur lors de la création du post dans le forum: {e}")
@@ -1619,18 +1598,14 @@ async def handle_transfer_command(message: Message, bot):
return
else:
# Pour un canal textuel ou thread : utiliser un webhook
# Créer un webhook pour envoyer le message en tant que l'auteur original
webhooks = await target_channel.webhooks()
webhook = None
# Chercher un webhook existant créé par le bot
for wh in webhooks:
if wh.user == bot.user:
webhook = wh
break
# Créer un webhook si nécessaire
if not webhook:
try:
webhook = await target_channel.create_webhook(name="Mamie Henriette - Transfert")
@@ -1644,7 +1619,6 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
# Envoyer le message via le webhook
try:
transferred_message = await webhook.send(
content=content,
@@ -1653,7 +1627,7 @@ async def handle_transfer_command(message: Message, bot):
embeds=embeds[:10] if embeds else [],
files=files_to_send,
allowed_mentions=discord.AllowedMentions.none(),
wait=True # Attendre pour récupérer le message envoyé
wait=True
)
except discord.HTTPException as e:
logging.error(f"Erreur lors du transfert du message: {e}")
@@ -1666,13 +1640,11 @@ async def handle_transfer_command(message: Message, bot):
asyncio.create_task(delete_after_delay(msg))
return
# Supprimer le message original
try:
await original_message.delete()
except discord.Forbidden:
logging.warning(f"Impossible de supprimer le message original (ID: {message_id})")
# Enregistrer l'événement de transfert dans la base de données
transfer_details = f"De {source_channel.name} vers {target_channel.name}"
if isinstance(target_channel, ForumChannel):
transfer_details += " (forum)"
@@ -1689,7 +1661,6 @@ async def handle_transfer_command(message: Message, bot):
db.session.add(transfer_event)
_commit_with_retry()
# Envoyer un message de confirmation dans le canal source
local_now = _to_local(datetime.now(timezone.utc))
destination_info = target_channel.mention if isinstance(target_channel, (TextChannel, Thread)) else f"le forum {target_channel.name}"
@@ -1711,7 +1682,6 @@ async def handle_transfer_command(message: Message, bot):
confirmation_msg = await source_channel.send(embed=embed)
asyncio.create_task(delete_after_delay(confirmation_msg))
# Logger dans le canal de modération
log_embed = discord.Embed(
title="📨 Transfert de message",
description=f"Un message de **{original_message.author.name}** a été transféré",
@@ -1725,7 +1695,6 @@ async def handle_transfer_command(message: Message, bot):
log_embed.add_field(name="📥 Vers", value=f"{target_channel.name} ({type(target_channel).__name__})", inline=True)
log_embed.add_field(name="📝 Raison", value=reason, inline=False)
# Ajouter un aperçu du contenu
preview = content[:100] + "..." if content and len(content) > 100 else content
if preview:
log_embed.add_field(name="💬 Aperçu du message", value=preview, inline=False)
@@ -1734,6 +1703,5 @@ async def handle_transfer_command(message: Message, bot):
await send_to_moderation_log_channel(bot, log_embed)
# Supprimer la commande de transfert
await safe_delete_message(message)