${msg.username}
-${msg.content}
- -diff --git a/Commands/close.js b/Commands/close.js index 3922671..a412414 100644 --- a/Commands/close.js +++ b/Commands/close.js @@ -179,7 +179,6 @@ async function collectReviewComment(interaction, ticketUserId) { const comment = commentCollection.first()?.content; return comment && comment.toLowerCase() !== "no" ? comment : "No Comment Provided"; } - async function handleCloseTicket(interaction, reason, ticket, TicketData) { const { getChannel } = interaction.client; @@ -200,7 +199,49 @@ async function handleCloseTicket(interaction, reason, ticket, TicketData) { } try { + // Fetch all messages from the channel + let allMessages = []; + let lastId = null; + + while (true) { + const options = { limit: 100 }; + if (lastId) { + options.before = lastId; + } + + const messages = await interaction.channel.messages.fetch(options); + if (messages.size === 0) break; + + allMessages = [...allMessages, ...messages.values()]; + lastId = messages.last().id; + + if (messages.size < 100) break; + } + + // Sort messages by timestamp + allMessages.sort((a, b) => a.createdTimestamp - b.createdTimestamp); + + // Create transcript data + const transcriptData = allMessages.map(msg => ({ + content: msg.content || "No content", + username: msg.author.username, + userId: msg.author.id, + avatar: msg.author.displayAvatarURL(), + timestamp: msg.createdAt.toISOString(), + attachments: Array.from(msg.attachments.values()).map(att => ({ + url: att.url, + name: att.name + })), + embeds: msg.embeds.map(embed => ({ + title: embed.title, + description: embed.description, + fields: embed.fields + })) + })); + + // Update ticket status tickets.tickets[TicketData].open = false; + tickets.tickets[TicketData].messages = transcriptData; fs.writeFileSync("./Data/TicketData.json", JSON.stringify(tickets, null, 4)); const transcriptEmbed = new Discord.EmbedBuilder() @@ -210,25 +251,34 @@ async function handleCloseTicket(interaction, reason, ticket, TicketData) { .setDescription( `> **Ticket:** ${interaction.channel.name} (\`${interaction.channel.id}\`)\n` + `> **User:** ${tUser?.tag || "Unknown User"} (\`${tUser?.id || ticket.user}\`)\n` + - `> **Closed by:** <@${interaction.user.id}>` + `> **Closed by:** <@${interaction.user.id}>\n` + + `> **Message Count:** ${transcriptData.length}` ) .addFields({ name: "Reason", value: `\`\`\`${reason}\`\`\``, inline: true }); - let msgs = await interaction.channel.messages.fetch({ limit: 100 }); - let html = createTranscriptHTML(ticket, msgs); + const html = createTranscriptHTML( + { + id: interaction.channel.id, + messages: transcriptData, + name: interaction.channel.name + }, + reason + ); const fileName = `${interaction.channel.id}-transcript.html`; fs.writeFileSync(`./Data/Transcripts/${fileName}`, html); await transcriptChannel.send({ embeds: [transcriptEmbed], - files: [`./Data/Transcripts/${fileName}`], - spoiler: true, + files: [{ + attachment: `./Data/Transcripts/${fileName}`, + name: fileName, + spoiler: true + }] }); - if (interaction.channel.type === Discord.ChannelType.GuildText) { - await interaction.channel.delete(); - } else if (interaction.channel.type === Discord.ChannelType.PrivateThread) { + if (interaction.channel.type === Discord.ChannelType.GuildText || + interaction.channel.type === Discord.ChannelType.PrivateThread) { await interaction.channel.delete(); } } catch (err) { @@ -238,10 +288,12 @@ async function handleCloseTicket(interaction, reason, ticket, TicketData) { } function createTranscriptHTML(ticket, reason) { - const messages = ticket.messages || []; return ` +
+ +Server Name: Emerald Services
-Ticket: ${ticket.id}
-Messages: ${messages.length} Messages
-Channel: ${ticket.name}
+Ticket ID: ${ticket.id}
+Message Count: ${ticket.messages.length}
+Close Reason: ${reason}
+