Skip to content

Commit b570101

Browse files
committed
feat: adds attachment support to forwarded content.
1 parent 7bb8e67 commit b570101

File tree

3 files changed

+61
-10
lines changed

3 files changed

+61
-10
lines changed

bot.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,8 @@ def __init__(self, original_message, forwarded_content):
10181018
self.author = original_message.author
10191019
self.content = forwarded_content
10201020
self.attachments = []
1021+
for snap in getattr(original_message, "message_snapshots", []):
1022+
self.attachments.extend(getattr(snap, "attachments", []))
10211023
self.stickers = []
10221024
self.created_at = original_message.created_at
10231025
self.embeds = []

core/thread.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
ConfirmThreadCreationView,
3636
DummyParam,
3737
extract_forwarded_content,
38+
extract_forwarded_attachments,
3839
)
3940

4041
logger = getLogger(__name__)
@@ -1950,6 +1951,11 @@ async def send(
19501951
embed.color = 0x5865F2 # Discord blurple for system messages
19511952

19521953
ext = [(a.url, a.filename, False) for a in message.attachments]
1954+
1955+
# Add forwarded message attachments
1956+
forwarded_attachments = extract_forwarded_attachments(message)
1957+
for url, filename in forwarded_attachments:
1958+
ext.append((url, filename, False))
19531959

19541960
images = []
19551961
attachments = []

core/utils.py

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"ConfirmThreadCreationView",
4747
"DummyParam",
4848
"extract_forwarded_content",
49+
"extract_forwarded_attachments",
4950
]
5051

5152

@@ -640,6 +641,36 @@ def __init__(self):
640641
self.value = None
641642

642643

644+
def extract_forwarded_attachments(message) -> typing.List[typing.Tuple[str, str]]:
645+
"""
646+
Extract attachment URLs from forwarded messages.
647+
648+
Parameters
649+
----------
650+
message : discord.Message
651+
The message to extract attachments from.
652+
653+
Returns
654+
-------
655+
List[Tuple[str, str]]
656+
List of (url, filename) tuples for attachments.
657+
"""
658+
import discord
659+
attachments = []
660+
try:
661+
if getattr(message, "message_snapshots", None):
662+
for snap in message.message_snapshots:
663+
if getattr(snap, "attachments", None):
664+
for a in snap.attachments:
665+
url = getattr(a, "url", None)
666+
filename = getattr(a, "filename", "Unknown")
667+
if url:
668+
attachments.append((url.split('?')[0], filename))
669+
except Exception:
670+
pass
671+
return attachments
672+
673+
643674
def extract_forwarded_content(message) -> typing.Optional[str]:
644675
"""
645676
Extract forwarded message content from Discord forwarded messages.
@@ -687,12 +718,18 @@ def extract_forwarded_content(message) -> typing.Optional[str]:
687718
break # One embed preview is usually enough
688719

689720
if getattr(snap, "attachments", None):
690-
attachment_info = ", ".join(
691-
[getattr(a, "filename", "Unknown") for a in snap.attachments[:3]]
692-
)
721+
attachment_links = []
722+
for a in snap.attachments[:3]:
723+
filename = getattr(a, "filename", "Unknown")
724+
url = getattr(a, "url", None)
725+
if url:
726+
url = url.split('?')[0]
727+
attachment_links.append(f"[{filename}]({url})")
728+
else:
729+
attachment_links.append(filename)
693730
if len(snap.attachments) > 3:
694-
attachment_info += f" (+{len(snap.attachments) - 3} more)"
695-
formatted_part += f"[Attachments: {attachment_info}]\n"
731+
attachment_links.append(f"(+{len(snap.attachments) - 3} more)")
732+
formatted_part += f"📎 {', '.join(attachment_links)}\n"
696733
forwarded_parts.append(formatted_part)
697734

698735
if forwarded_parts:
@@ -725,12 +762,18 @@ def extract_forwarded_content(message) -> typing.Optional[str]:
725762
embed_desc = embed_desc[:297] + "..."
726763
return f"**{ref_author_name}:** {embed_desc}"
727764
elif getattr(ref_msg, "attachments", None):
728-
attachment_info = ", ".join(
729-
[getattr(a, "filename", "Unknown") for a in ref_msg.attachments[:3]]
730-
)
765+
attachment_links = []
766+
for a in ref_msg.attachments[:3]:
767+
filename = getattr(a, "filename", "Unknown")
768+
url = getattr(a, "url", None)
769+
if url:
770+
url = url.split('?')[0]
771+
attachment_links.append(f"[{filename}]({url})")
772+
else:
773+
attachment_links.append(filename)
731774
if len(ref_msg.attachments) > 3:
732-
attachment_info += f" (+{len(ref_msg.attachments) - 3} more)"
733-
return f"**{ref_author_name}:** [Attachments: {attachment_info}]"
775+
attachment_links.append(f"(+{len(ref_msg.attachments) - 3} more)")
776+
return f"**{ref_author_name}:** 📎 {', '.join(attachment_links)}"
734777
except Exception as e:
735778
# Log and continue; failing to extract a reference preview shouldn't break flow
736779
logger.debug("Failed to extract reference preview: %s", e)

0 commit comments

Comments
 (0)