implement forwarded messages

This commit is contained in:
rambros 2026-02-21 20:20:22 +05:30
parent 7442f3c0a0
commit 39dfb789e5
2 changed files with 41 additions and 8 deletions

View file

@ -193,7 +193,28 @@ class MigrationEngine:
# Process attachments
files = []
for att in msg.attachments:
attachments_to_process = list(msg.attachments)
# Check if this message is forwarded
# Discord flags: forwarded (is bit 28 / 0x10000000)
is_forwarded = False
if hasattr(msg.flags, 'forwarded'):
is_forwarded = msg.flags.forwarded
# If forwarded, the content and attachments might be in message_snapshots (discord.py 2.5+)
content = msg.content
if is_forwarded:
logger.debug(f"Detected forwarded message: ID={msg.id}, Flags={msg.flags.value}")
if hasattr(msg, 'message_snapshots') and msg.message_snapshots:
# For now we handle the first snapshot
snapshot = msg.message_snapshots[0]
if not content:
content = snapshot.content
# Add snapshot attachments to the list to process
attachments_to_process.extend(snapshot.attachments)
logger.debug(f"Found forwarded snapshot content: {content[:50]}... and {len(snapshot.attachments)} attachments")
for att in attachments_to_process:
try:
att_data = await self.discord_reader.download_attachment(att)
files.append({"filename": att.filename, "data": att_data})
@ -210,10 +231,11 @@ class MigrationEngine:
channel_id=target_channel_id,
author_name=msg.author.display_name,
author_avatar_url=str(msg.author.display_avatar.url),
content=msg.content,
content=content,
timestamp=msg.created_at.strftime("%Y-%m-%d %H:%M:%S"),
files=files if files else None,
reply_to_message_id=reply_to_fluxer_id
reply_to_message_id=reply_to_fluxer_id,
is_forwarded=is_forwarded
)
if fluxer_msg_id:

View file

@ -124,7 +124,7 @@ class FluxerWriter:
assert self.client is not None
return await self.client.get_guild_channels(self.community_id)
async def send_message(self, channel_id: str, author_name: str, content: str, timestamp: str, author_avatar_url: Optional[str] = None, files: Optional[List[Dict[str, Any]]] = None, reply_to_message_id: Optional[str] = None) -> Optional[str]:
async def send_message(self, channel_id: str, author_name: str, content: str, timestamp: str, author_avatar_url: Optional[str] = None, files: Optional[List[Dict[str, Any]]] = None, reply_to_message_id: Optional[str] = None, is_forwarded: bool = False) -> Optional[str]:
"""
Sends a message to the target channel.
Uses a webhook to mimic the original author if possible.
@ -145,7 +145,14 @@ class FluxerWriter:
# Prepare content with subtext timestamp
# -# is Fluxer/Discord's subtext markdown: small, muted grey text
prefix = f"-# {timestamp}\n"
final_content = prefix + content if content else prefix
if is_forwarded:
prefix += "-# -->*forwarded*\n"
display_content = content
if is_forwarded and content:
display_content = f">>> {content}"
final_content = prefix + display_content if display_content else prefix
try:
# Current limitation: fluxer.py execute_webhook doesn't support 'files' or 'message_reference' yet.
@ -161,8 +168,12 @@ class FluxerWriter:
else:
# Use bot direct message (supports files and message_reference)
# We add the author name to the prefix since bot name won't match
bot_prefix = f"-# {timestamp} · {author_name}\n"
bot_content = bot_prefix + content if content else bot_prefix
bot_prefix = f"-# {timestamp}\n"
if is_forwarded:
bot_prefix += "-# -->*forwarded*\n"
bot_prefix += f"-# · {author_name}\n"
final_bot_content = bot_prefix + display_content if display_content else bot_prefix
message_reference = None
if reply_to_message_id:
@ -170,7 +181,7 @@ class FluxerWriter:
msg_data = await self.client.send_message(
channel_id=channel_id,
content=bot_content,
content=final_bot_content,
files=files,
message_reference=message_reference
)