@fantinodavide/discord-html-transcripts
Version:
A nicely formatted html transcript generator for discord.js.
178 lines • 6.17 kB
JavaScript
;
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