sans com
This commit is contained in:
@@ -1414,10 +1414,6 @@ async def handle_say_command(message: Message, bot):
|
|||||||
logging.error(f"Erreur lors de l'envoi du message: {e}")
|
logging.error(f"Erreur lors de l'envoi du message: {e}")
|
||||||
|
|
||||||
async def handle_transfer_command(message: Message, bot):
|
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):
|
if not has_staff_role(message.author.roles):
|
||||||
await send_access_denied(message.channel)
|
await send_access_denied(message.channel)
|
||||||
return
|
return
|
||||||
@@ -1453,7 +1449,6 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
asyncio.create_task(delete_after_delay(msg))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Récupérer le canal de destination
|
|
||||||
target_channel = None
|
target_channel = None
|
||||||
if message.channel_mentions:
|
if message.channel_mentions:
|
||||||
target_channel = message.channel_mentions[0]
|
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))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Vérifier que le canal de destination est compatible
|
|
||||||
if not isinstance(target_channel, (TextChannel, ForumChannel, Thread)):
|
if not isinstance(target_channel, (TextChannel, ForumChannel, Thread)):
|
||||||
embed = discord.Embed(
|
embed = discord.Embed(
|
||||||
title="❌ Erreur",
|
title="❌ Erreur",
|
||||||
@@ -1485,14 +1479,11 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
asyncio.create_task(delete_after_delay(msg))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Récupérer le message à transférer
|
|
||||||
message_id = None
|
message_id = None
|
||||||
source_channel = message.channel
|
source_channel = message.channel
|
||||||
|
|
||||||
# Vérifier si c'est un lien Discord
|
|
||||||
if 'discord.com/channels/' in parts[2]:
|
if 'discord.com/channels/' in parts[2]:
|
||||||
try:
|
try:
|
||||||
# Format: https://discord.com/channels/guild_id/channel_id/message_id
|
|
||||||
link_parts = parts[2].split('/')
|
link_parts = parts[2].split('/')
|
||||||
source_channel_id = int(link_parts[-2])
|
source_channel_id = int(link_parts[-2])
|
||||||
message_id = int(link_parts[-1])
|
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))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
# C'est un ID de message
|
|
||||||
try:
|
try:
|
||||||
message_id = int(parts[2])
|
message_id = int(parts[2])
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@@ -1530,7 +1520,6 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
asyncio.create_task(delete_after_delay(msg))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Récupérer le message original
|
|
||||||
try:
|
try:
|
||||||
original_message = await source_channel.fetch_message(message_id)
|
original_message = await source_channel.fetch_message(message_id)
|
||||||
except discord.NotFound:
|
except discord.NotFound:
|
||||||
@@ -1552,15 +1541,12 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
asyncio.create_task(delete_after_delay(msg))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Raison du transfert (optionnel)
|
|
||||||
reason = parts[3] if len(parts) > 3 else "Message posté dans le mauvais canal"
|
reason = parts[3] if len(parts) > 3 else "Message posté dans le mauvais canal"
|
||||||
|
|
||||||
# Préparer le contenu du message
|
|
||||||
content = original_message.content
|
content = original_message.content
|
||||||
embeds = original_message.embeds
|
embeds = original_message.embeds
|
||||||
files_to_send = []
|
files_to_send = []
|
||||||
|
|
||||||
# Télécharger les pièces jointes
|
|
||||||
for attachment in original_message.attachments:
|
for attachment in original_message.attachments:
|
||||||
try:
|
try:
|
||||||
file_data = await attachment.read()
|
file_data = await attachment.read()
|
||||||
@@ -1571,16 +1557,12 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Erreur lors du téléchargement de la pièce jointe: {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
|
transferred_message = None
|
||||||
|
|
||||||
if isinstance(target_channel, ForumChannel):
|
if isinstance(target_channel, ForumChannel):
|
||||||
# Pour un forum : créer un nouveau post (thread)
|
|
||||||
try:
|
try:
|
||||||
# Générer un titre pour le post avec le nom de l'auteur original
|
|
||||||
post_title = f"{original_message.author.display_name} - "
|
post_title = f"{original_message.author.display_name} - "
|
||||||
if content and len(content) > 0:
|
if content and len(content) > 0:
|
||||||
# Utiliser le contenu pour le reste du titre
|
|
||||||
remaining_length = 100 - len(post_title)
|
remaining_length = 100 - len(post_title)
|
||||||
post_title += content[:remaining_length]
|
post_title += content[:remaining_length]
|
||||||
else:
|
else:
|
||||||
@@ -1589,15 +1571,12 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
if len(post_title) > 100:
|
if len(post_title) > 100:
|
||||||
post_title = post_title[:97] + "..."
|
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"**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 += f"*Ce message a été transféré par un membre du staff depuis {source_channel.mention}*\n"
|
||||||
transfer_notice += "─" * 50 + "\n\n"
|
transfer_notice += "─" * 50 + "\n\n"
|
||||||
|
|
||||||
# Combiner le message informatif avec le contenu original
|
|
||||||
full_content = transfer_notice + (content or "")
|
full_content = transfer_notice + (content or "")
|
||||||
|
|
||||||
# Créer le post dans le forum
|
|
||||||
thread = await target_channel.create_thread(
|
thread = await target_channel.create_thread(
|
||||||
name=post_title,
|
name=post_title,
|
||||||
content=full_content,
|
content=full_content,
|
||||||
@@ -1605,7 +1584,7 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
files=files_to_send,
|
files=files_to_send,
|
||||||
reason=f"Transfert depuis {source_channel.name} par {message.author.name}"
|
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:
|
except discord.HTTPException as e:
|
||||||
logging.error(f"Erreur lors de la création du post dans le forum: {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
|
return
|
||||||
|
|
||||||
else:
|
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()
|
webhooks = await target_channel.webhooks()
|
||||||
webhook = None
|
webhook = None
|
||||||
|
|
||||||
# Chercher un webhook existant créé par le bot
|
|
||||||
for wh in webhooks:
|
for wh in webhooks:
|
||||||
if wh.user == bot.user:
|
if wh.user == bot.user:
|
||||||
webhook = wh
|
webhook = wh
|
||||||
break
|
break
|
||||||
|
|
||||||
# Créer un webhook si nécessaire
|
|
||||||
if not webhook:
|
if not webhook:
|
||||||
try:
|
try:
|
||||||
webhook = await target_channel.create_webhook(name="Mamie Henriette - Transfert")
|
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))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Envoyer le message via le webhook
|
|
||||||
try:
|
try:
|
||||||
transferred_message = await webhook.send(
|
transferred_message = await webhook.send(
|
||||||
content=content,
|
content=content,
|
||||||
@@ -1653,7 +1627,7 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
embeds=embeds[:10] if embeds else [],
|
embeds=embeds[:10] if embeds else [],
|
||||||
files=files_to_send,
|
files=files_to_send,
|
||||||
allowed_mentions=discord.AllowedMentions.none(),
|
allowed_mentions=discord.AllowedMentions.none(),
|
||||||
wait=True # Attendre pour récupérer le message envoyé
|
wait=True
|
||||||
)
|
)
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
logging.error(f"Erreur lors du transfert du message: {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))
|
asyncio.create_task(delete_after_delay(msg))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Supprimer le message original
|
|
||||||
try:
|
try:
|
||||||
await original_message.delete()
|
await original_message.delete()
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
logging.warning(f"Impossible de supprimer le message original (ID: {message_id})")
|
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}"
|
transfer_details = f"De {source_channel.name} vers {target_channel.name}"
|
||||||
if isinstance(target_channel, ForumChannel):
|
if isinstance(target_channel, ForumChannel):
|
||||||
transfer_details += " (forum)"
|
transfer_details += " (forum)"
|
||||||
@@ -1689,7 +1661,6 @@ async def handle_transfer_command(message: Message, bot):
|
|||||||
db.session.add(transfer_event)
|
db.session.add(transfer_event)
|
||||||
_commit_with_retry()
|
_commit_with_retry()
|
||||||
|
|
||||||
# Envoyer un message de confirmation dans le canal source
|
|
||||||
local_now = _to_local(datetime.now(timezone.utc))
|
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}"
|
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)
|
confirmation_msg = await source_channel.send(embed=embed)
|
||||||
asyncio.create_task(delete_after_delay(confirmation_msg))
|
asyncio.create_task(delete_after_delay(confirmation_msg))
|
||||||
|
|
||||||
# Logger dans le canal de modération
|
|
||||||
log_embed = discord.Embed(
|
log_embed = discord.Embed(
|
||||||
title="📨 Transfert de message",
|
title="📨 Transfert de message",
|
||||||
description=f"Un message de **{original_message.author.name}** a été transféré",
|
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="📥 Vers", value=f"{target_channel.name} ({type(target_channel).__name__})", inline=True)
|
||||||
log_embed.add_field(name="📝 Raison", value=reason, inline=False)
|
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
|
preview = content[:100] + "..." if content and len(content) > 100 else content
|
||||||
if preview:
|
if preview:
|
||||||
log_embed.add_field(name="💬 Aperçu du message", value=preview, inline=False)
|
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)
|
await send_to_moderation_log_channel(bot, log_embed)
|
||||||
|
|
||||||
# Supprimer la commande de transfert
|
|
||||||
await safe_delete_message(message)
|
await safe_delete_message(message)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user