UNPKG

@fantinodavide/discord-html-transcripts

Version:

A nicely formatted html transcript generator for discord.js.

184 lines 10 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DiscordMessage; const discord_components_react_1 = require("@derockdev/discord-components-react"); const react_1 = __importDefault(require("react")); const utils_1 = require("../../utils/utils"); const types_1 = require("../../types"); const attachment_1 = require("./attachment"); const components_1 = __importDefault(require("./components")); const componentsV2_1 = require("./componentsV2"); const componentsV2Parser_1 = require("./componentsV2Parser"); const content_1 = __importStar(require("./content")); const embed_1 = require("./embed"); const reply_1 = __importDefault(require("./reply")); const systemMessage_1 = __importDefault(require("./systemMessage")); function DiscordMessage({ message, context, }) { var _a; if (message.system) return react_1.default.createElement(systemMessage_1.default, { message: message }); const isCrosspost = message.reference && message.reference.guildId !== ((_a = message.guild) === null || _a === void 0 ? void 0 : _a.id); const isV2Message = (0, types_1.isComponentsV2Message)(message); // Demo: treat bot messages as V2 return (react_1.default.createElement(discord_components_react_1.DiscordMessage, { id: `m-${message.id}`, timestamp: message.createdAt.toISOString(), key: message.id, edited: message.editedAt !== null, server: isCrosspost !== null && isCrosspost !== void 0 ? isCrosspost : undefined, highlight: message.mentions.everyone, profile: message.author.id }, react_1.default.createElement(reply_1.default, { message: message, context: context }), message.interaction && (react_1.default.createElement(discord_components_react_1.DiscordCommand, { slot: "reply", profile: message.interaction.user.id, command: '/' + message.interaction.commandName })), isV2Message ? (react_1.default.createElement(ComponentsV2Message, { message: message, context: context })) : (react_1.default.createElement(ComponentsV1Message, { message: message, context: context })), message.reactions.cache.size > 0 && (react_1.default.createElement(discord_components_react_1.DiscordReactions, { slot: "reactions" }, message.reactions.cache.map((reaction, id) => (react_1.default.createElement(discord_components_react_1.DiscordReaction, { key: `${message.id}r${id}`, name: reaction.emoji.name, emoji: (0, utils_1.parseDiscordEmoji)(reaction.emoji), count: reaction.count }))))), message.hasThread && message.thread && (react_1.default.createElement(discord_components_react_1.DiscordThread, { slot: "thread", name: message.thread.name, cta: message.thread.messageCount ? `${message.thread.messageCount} Message${message.thread.messageCount > 1 ? 's' : ''}` : 'View Thread' }, message.thread.lastMessage ? (react_1.default.createElement(discord_components_react_1.DiscordThreadMessage, { profile: message.thread.lastMessage.author.id }, react_1.default.createElement(content_1.default, { content: message.thread.lastMessage.content.length > 128 ? message.thread.lastMessage.content.substring(0, 125) + '...' : message.thread.lastMessage.content, context: Object.assign(Object.assign({}, context), { type: content_1.RenderType.REPLY }) }))) : (`Thread messages not saved.`))))); } // Components V1 (traditional) message rendering function ComponentsV1Message({ message, context }) { return (react_1.default.createElement(react_1.default.Fragment, null, message.content && (react_1.default.createElement(content_1.default, { content: message.content, context: Object.assign(Object.assign({}, context), { type: message.webhookId ? content_1.RenderType.WEBHOOK : content_1.RenderType.NORMAL }) })), react_1.default.createElement(attachment_1.Attachments, { message: message, context: context }), message.embeds.map((embed, id) => (react_1.default.createElement(embed_1.DiscordEmbed, { embed: embed, context: Object.assign(Object.assign({}, context), { index: id, message }), key: id }))), message.components.length > 0 && (react_1.default.createElement(discord_components_react_1.DiscordAttachments, { slot: "components" }, message.components.map((component, id) => (react_1.default.createElement(components_1.default, { key: id, id: id, row: component }))))))); } // Components V2 message rendering function ComponentsV2Message({ message, context }) { // In Components V2, the message content and embeds are replaced by components // Parse the actual V2 components from the message data try { // Parse the actual V2 components from the message const v2Components = (0, componentsV2Parser_1.parseV2Components)(message.components); if (v2Components.length > 0) { return (react_1.default.createElement("div", { className: "discord-v2-message-content" }, react_1.default.createElement(componentsV2_1.ComponentsV2Wrapper, { components: v2Components, context: context }))); } // Fallback: create a demo V2 component to show the structure const testV2Components = createTestV2Components(message); return (react_1.default.createElement("div", { className: "discord-v2-message-content" }, react_1.default.createElement(componentsV2_1.ComponentsV2Wrapper, { components: testV2Components, context: context }))); } catch (error) { console.warn('Failed to parse V2 components:', error); // Fallback to V1 rendering return react_1.default.createElement(ComponentsV1Message, { message: message, context: context }); } } // Create test V2 components for demonstration function createTestV2Components(message) { var _a; const components = []; // Create a container with the message content if (message.content) { components.push({ type: 12, // Container children: [ { type: 14, // TextDisplay content: message.content, style: 'paragraph' } ], accent_color: '#5865f2' }); } else { // Create a default V2 component for bot messages without content components.push({ type: 12, // Container children: [ { type: 14, // TextDisplay content: '🤖 This bot message is now rendered using Discord Components V2!', style: 'paragraph' } ], accent_color: '#5865f2' }); } // Add embeds as V2 components if (message.embeds.length > 0) { for (const embed of message.embeds) { const embedChildren = []; if (embed.title) { embedChildren.push({ type: 14, // TextDisplay content: embed.title, style: 'heading2' }); } if (embed.description) { embedChildren.push({ type: 14, // TextDisplay content: embed.description, style: 'paragraph' }); } if ((_a = embed.thumbnail) === null || _a === void 0 ? void 0 : _a.url) { embedChildren.push({ type: 15, // Thumbnail url: embed.thumbnail.url, alt_text: 'Embed thumbnail' }); } if (embedChildren.length > 0) { components.push({ type: 12, // Container children: embedChildren, accent_color: embed.color ? `#${embed.color.toString(16).padStart(6, '0')}` : undefined }); } } } // Add attachments as media gallery if (message.attachments.size > 0) { const mediaItems = Array.from(message.attachments.values()) .filter(att => { var _a; return (_a = att.contentType) === null || _a === void 0 ? void 0 : _a.startsWith('image/'); }) .map(att => ({ url: att.url, altText: att.name || 'Attachment', type: 'image' })); if (mediaItems.length > 0) { components.push({ type: 16, // MediaGallery items: mediaItems }); } } return components; } //# sourceMappingURL=message.js.map