Skip to content
This repository was archived by the owner on Oct 9, 2025. It is now read-only.

Commit c99e2ea

Browse files
committed
fix(network); Truncate replies to long messages
1 parent a523b3f commit c99e2ea

File tree

2 files changed

+29
-35
lines changed

2 files changed

+29
-35
lines changed

src/Events/messageCreate.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,14 @@ export default {
2626
if (!connected || !await checks.execute(message, db)) return;
2727

2828
message.compact_message = `**${message.author.tag}:** ${message.content}`;
29+
30+
// Add quoted reply to original message and embed
31+
const replyInDb = await messageContentModifiers.appendReply(message);
32+
2933
const embed = new EmbedBuilder()
3034
.setTimestamp()
3135
.setColor(colors('random'))
32-
.addFields([{ name: 'Message', value: message.content || '\u200B' }])
36+
.addFields({ name: 'Message', value: message.content || '\u200B' })
3337
.setAuthor({
3438
name: message.author.tag,
3539
iconURL: message.author.avatarURL() || message.author.defaultAvatarURL,
@@ -40,10 +44,6 @@ export default {
4044
iconURL: message.guild?.iconURL()?.toString(),
4145
});
4246

43-
44-
// Add quoted reply to original message and embed
45-
const replyInDb = await messageContentModifiers.appendReply(message, embed);
46-
4747
// Once reply is appended to the message, run it through the word fillter
4848
message.censored_content = censor(message.content);
4949
message.censored_compact_message = censor(message.compact_message);

src/Scripts/message/messageContentModifiers.ts

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,60 +5,60 @@ import { getDb } from '../../Utils/functions/utils';
55
import 'dotenv/config';
66

77
export default {
8-
async appendReply(message: NetworkMessage, uncenEmbed: EmbedBuilder) {
8+
async appendReply(message: NetworkMessage) {
99
const db = getDb();
1010
let messageInDb: messageData | null | undefined = null;
1111

1212
if (message.reference) {
1313
const referredMessage = await message.fetchReference().catch(() => null);
1414

1515
if (referredMessage) {
16-
messageInDb = await db?.messageData.findFirst({
16+
messageInDb = await db.messageData.findFirst({
1717
where: {
1818
channelAndMessageIds: {
1919
some: { messageId: referredMessage.id },
2020
},
2121
},
2222
});
2323

24-
let embed = referredMessage.embeds[0]?.fields[0]?.value;
25-
let compact = referredMessage.content;
24+
// content of the message being replied to
25+
let replyContent = referredMessage.embeds[0]?.fields[0]?.value || referredMessage.content;
2626

2727
// if the message is a reply to another reply, remove the older reply :D
2828
if (messageInDb?.reference) {
29-
const replaceReply = (string: string) => {
30-
return string?.split(/> .*/g).at(-1)?.trimStart() || string;
31-
};
32-
33-
// messages that are being replied to
34-
embed = replaceReply(embed);
35-
compact = replaceReply(compact);
29+
replyContent = replyContent?.split(/> .*/g).at(-1)?.trimStart() || replyContent;
3630
}
3731

38-
embed = embed?.replaceAll('\n', '\n> ');
39-
compact = compact?.replaceAll('\n', '\n> ');
32+
replyContent = replyContent?.replaceAll('\n', '\n> ');
4033

41-
message.content = `> ${embed || compact}\n${message.content}`;
42-
message.compact_message = `> ${embed || compact}\n${message.compact_message}`;
43-
uncenEmbed.setFields({ name: 'Message', value: message.content });
44-
}
34+
const maxLength = 1000; // max length of an embed field (-24 just to be safe)
35+
const prefixLength = 6; // length of "> ", "\n" and "..."
36+
const availableLength = maxLength - prefixLength - message.content.length;
37+
38+
// if it is too long, cut it off to make room for the reply
39+
if (replyContent.length > availableLength) {
40+
replyContent = replyContent.slice(0, availableLength) + '...';
41+
}
4542

43+
message.content = `> ${replyContent}\n${message.content}`;
44+
message.compact_message = `> ${replyContent}\n${message.compact_message}`;
45+
}
4646
}
4747
return messageInDb;
4848
},
4949

5050
async attachImageToEmbed(message: NetworkMessage, embed: EmbedBuilder, censoredEmbed: EmbedBuilder) {
51-
// Tenor Gifs / YouTube Thumbnails / Tenor Gifs
51+
// Tenor Gifs / Image URLs
5252
const imageURLRegex = /(?:(?:(?:[A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)(?:(?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)(?:\.jpg|\.jpeg|\.gif|\.png|\.webp)/;
5353
const URLMatch = message.content.match(imageURLRegex);
5454

5555
if (URLMatch) {
5656
embed
5757
.setImage(URLMatch[0])
58-
.setFields([{ name: 'Message', value: message.content.replace(URLMatch[0], '\u200B').trim() }]);
58+
.setFields({ name: 'Message', value: message.content.replace(URLMatch[0], '\u200B').trim() });
5959
censoredEmbed
6060
.setImage(URLMatch[0])
61-
.setFields([{ name: 'Message', value: message.censored_content.replace(URLMatch[0], '\u200B').trim() }]);
61+
.setFields({ name: 'Message', value: message.censored_content.replace(URLMatch[0], '\u200B').trim() });
6262
}
6363

6464
const tenorRegex = /https:\/\/tenor\.com\/view\/.*-(\d+)/;
@@ -72,23 +72,17 @@ export default {
7272

7373
embed
7474
.setImage(gifJSON.results[0].media[0].gif.url)
75-
.setFields([{ name: 'Message', value: message.content.replace(gifMatch[0], '\u200B').trim() }]);
75+
.setFields({ name: 'Message', value: message.content.replace(gifMatch[0], '\u200B').trim() });
7676
censoredEmbed
7777
.setImage(gifJSON.results[0].media[0].gif.url)
78-
.setFields([{ name: 'Message', value: message.censored_content.replace(gifMatch[0], '\u200B').trim() }]);
79-
}
80-
81-
else if (message.embeds[0]?.provider?.name === 'YouTube' && message.embeds[0]?.data.thumbnail) {
82-
embed.setImage(message.embeds[0].data.thumbnail.url);
83-
censoredEmbed.setImage(message.embeds[0].data.thumbnail.url);
78+
.setFields({ name: 'Message', value: message.censored_content.replace(gifMatch[0], '\u200B').trim() });
8479
}
8580

8681
// Attached Images (uploaded without url)
87-
if (message.attachments.size > 1) message.reply('Due to Discord\'s Embed limitations, only the first attachment will be sent.');
88-
8982
const attachment = message.attachments.first();
83+
if (attachment) {
84+
if (message.attachments.size > 1) message.reply('Due to Discord\'s Embed limitations, only the first attachment will be sent.');
9085

91-
if (attachment?.contentType?.includes('mp4') === false) {
9286
const newAttachment = new AttachmentBuilder(`${attachment.url}`, { name: `${attachment.name}` });
9387
embed.setImage(`attachment://${newAttachment.name}`);
9488
censoredEmbed.setImage(`attachment://${newAttachment.name}`);

0 commit comments

Comments
 (0)