UNPKG

@fantinodavide/discord-html-transcripts

Version:

A nicely formatted html transcript generator for discord.js.

178 lines 6.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseV2Components = parseV2Components; exports.hasV2Components = hasV2Components; const discord_js_1 = require("discord.js"); /** * Parse Discord V2 components from message data * @param rawComponents - Raw component data from Discord API * @returns Parsed V2 components */ function parseV2Components(rawComponents) { const components = []; for (const rawComponent of rawComponents) { const parsedComponent = parseV2Component(rawComponent); if (parsedComponent) { components.push(parsedComponent); } } return components; } /** * Parse a single V2 component from raw Discord data * @param rawComponent - Raw component data or Discord.js component object * @returns Parsed V2 component or null if unsupported */ function parseV2Component(rawComponent) { // Handle Discord.js component objects if (rawComponent.data) { const componentType = rawComponent.data.type; switch (componentType) { case discord_js_1.ComponentType.Container: // ContainerComponent (Discord.js type 17) return parseDiscordJsContainer(rawComponent); case discord_js_1.ComponentType.TextDisplay: // TextDisplayComponent (Discord.js type 10) return parseDiscordJsTextDisplay(rawComponent); case discord_js_1.ComponentType.Separator: // SeparatorComponent return parseDiscordJsSeparator(rawComponent); // case ComponentType.ActionRow: // ActionRow - handle as container // return parseDiscordJsActionRow(rawComponent); default: console.warn(`Unknown Discord.js V2 component type: ${componentType}`); return null; } } // Handle raw component data (legacy) const componentType = rawComponent.type; switch (componentType) { case 11: // Section return parseSection(rawComponent); case 12: // Container return parseContainer(rawComponent); case 13: // Separator return parseSeparator(rawComponent); case 14: // TextDisplay return parseTextDisplay(rawComponent); case 15: // Thumbnail return parseThumbnail(rawComponent); case 16: // MediaGallery return parseMediaGallery(rawComponent); default: console.warn(`Unknown V2 component type: ${componentType}`); return null; } } function parseSection(rawComponent) { const accessory = rawComponent.accessory ? parseV2Component(rawComponent.accessory) : undefined; return { type: 11, text: rawComponent.text ? { content: rawComponent.text.content || '', style: rawComponent.text.style || 'paragraph' } : undefined, accessory: accessory || undefined, }; } function parseContainer(rawComponent) { return { type: 12, children: rawComponent.children ? rawComponent.children.map(parseV2Component).filter(Boolean) : [], accent_color: rawComponent.accent_color, }; } function parseSeparator(rawComponent) { return { type: 13, spacing: rawComponent.spacing || 'medium', }; } function parseTextDisplay(rawComponent) { return { type: 14, content: rawComponent.content || '', style: rawComponent.style || 'paragraph', }; } function parseThumbnail(rawComponent) { return { type: 15, url: rawComponent.url || '', alt_text: rawComponent.alt_text, }; } function parseMediaGallery(rawComponent) { return { type: 16, items: rawComponent.items || [], }; } /** * Check if a message has V2 components * @param message - Discord message object * @returns true if message has V2 components */ function hasV2Components(message) { var _a, _b; // Check for V2 flag and component structure return Boolean(((_b = (_a = message.flags) === null || _a === void 0 ? void 0 : _a.has) === null || _b === void 0 ? void 0 : _b.call(_a, 1 << 15)) || // IS_COMPONENTS_V2 flag (message.components && message.components.some((comp) => { var _a; return comp.type >= 11 && comp.type <= 16 || // Raw component types ((_a = comp.data) === null || _a === void 0 ? void 0 : _a.type) === 17; } // Discord.js ContainerComponent ))); } // Discord.js component parsers function parseDiscordJsContainer(containerComponent) { const children = []; // Parse nested components if (containerComponent.components) { for (const childComponent of containerComponent.components) { const parsed = parseV2Component(childComponent); if (parsed) { children.push(parsed); } } } // Convert accent_color from number to hex const accentColor = containerComponent.data.accent_color ? `#${containerComponent.data.accent_color.toString(16).padStart(6, '0')}` : undefined; return { type: 12, // Map to our Container type children, accent_color: accentColor, }; } function parseDiscordJsTextDisplay(textComponent) { return { type: 14, content: textComponent.data.content || '', style: textComponent.data.style || 'paragraph', }; } function parseDiscordJsSeparator(separatorComponent) { return { type: 13, spacing: separatorComponent.data.spacing || 'medium', }; } // @ts-ignore function parseDiscordJsActionRow(actionRowComponent) { const children = []; // Parse nested components in the action row if (actionRowComponent.components) { for (const childComponent of actionRowComponent.components) { const parsed = parseV2Component(childComponent); if (parsed) { children.push(parsed); } } } // Treat ActionRow as a container without accent color return { type: 12, children, }; } //# sourceMappingURL=componentsV2Parser.js.map