discord-message-transcript 1.3.1-dev.3.35 → 1.3.2-dev.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/core/assetResolver/base64/imageToBase64.d.ts +2 -0
  2. package/dist/core/{imageToBase64.js → assetResolver/base64/imageToBase64.js} +18 -4
  3. package/dist/core/assetResolver/cdn/cdnCustomError.d.ts +16 -0
  4. package/dist/core/assetResolver/cdn/cdnCustomError.js +28 -0
  5. package/dist/core/assetResolver/cdn/cdnResolver.d.ts +3 -0
  6. package/dist/core/assetResolver/cdn/cdnResolver.js +90 -0
  7. package/dist/core/assetResolver/cdn/cloudinaryCdnResolver.d.ts +1 -0
  8. package/dist/core/assetResolver/cdn/cloudinaryCdnResolver.js +120 -0
  9. package/dist/core/assetResolver/cdn/sanitizeFileName.d.ts +1 -0
  10. package/dist/core/assetResolver/cdn/sanitizeFileName.js +17 -0
  11. package/dist/core/assetResolver/cdn/uploadCareCdnResolver.d.ts +1 -0
  12. package/dist/core/assetResolver/cdn/uploadCareCdnResolver.js +137 -0
  13. package/dist/core/assetResolver/cdn/validateCdnUrl.d.ts +1 -0
  14. package/dist/core/assetResolver/cdn/validateCdnUrl.js +8 -0
  15. package/dist/core/assetResolver/contants.d.ts +1 -0
  16. package/dist/core/assetResolver/contants.js +1 -0
  17. package/dist/core/assetResolver/index.d.ts +7 -0
  18. package/dist/core/assetResolver/index.js +22 -0
  19. package/dist/core/assetResolver/url/authorUrlResolver.d.ts +3 -0
  20. package/dist/core/assetResolver/url/authorUrlResolver.js +10 -0
  21. package/dist/core/assetResolver/url/imageUrlResolver.d.ts +4 -0
  22. package/dist/core/assetResolver/url/imageUrlResolver.js +20 -0
  23. package/dist/core/assetResolver/url/messageUrlResolver.d.ts +3 -0
  24. package/dist/core/{urlResolver.js → assetResolver/url/messageUrlResolver.js} +17 -43
  25. package/dist/core/assetResolver/url/urlResolver.d.ts +3 -0
  26. package/dist/core/assetResolver/url/urlResolver.js +24 -0
  27. package/dist/core/{componentToJson.d.ts → discordParser/componentToJson.d.ts} +1 -1
  28. package/dist/core/discordParser/componentToJson.js +159 -0
  29. package/dist/core/discordParser/fetchMessages.d.ts +7 -0
  30. package/dist/core/{fetchMessages.js → discordParser/fetchMessages.js} +1 -1
  31. package/dist/core/{getMentions.d.ts → discordParser/getMentions.d.ts} +1 -1
  32. package/dist/core/{getMentions.js → discordParser/getMentions.js} +1 -1
  33. package/dist/core/discordParser/index.d.ts +4 -0
  34. package/dist/core/discordParser/index.js +33 -0
  35. package/dist/core/mappers.d.ts +1 -1
  36. package/dist/core/mappers.js +1 -1
  37. package/dist/core/networkSecurity/constants.d.ts +3 -0
  38. package/dist/core/networkSecurity/constants.js +3 -0
  39. package/dist/core/networkSecurity/dns.d.ts +2 -0
  40. package/dist/core/networkSecurity/dns.js +29 -0
  41. package/dist/core/networkSecurity/index.d.ts +2 -0
  42. package/dist/core/networkSecurity/index.js +2 -0
  43. package/dist/core/networkSecurity/ip.d.ts +1 -0
  44. package/dist/core/networkSecurity/ip.js +110 -0
  45. package/dist/core/networkSecurity/lookup.d.ts +2 -0
  46. package/dist/core/networkSecurity/lookup.js +14 -0
  47. package/dist/core/networkSecurity/urlSafety.d.ts +3 -0
  48. package/dist/core/networkSecurity/urlSafety.js +71 -0
  49. package/dist/index.d.ts +3 -3
  50. package/dist/index.js +13 -56
  51. package/dist/renderers/json/json.d.ts +1 -1
  52. package/dist/renderers/json/json.js +3 -4
  53. package/dist/types/types.d.ts +36 -2
  54. package/dist/utils/sleep.d.ts +1 -0
  55. package/dist/utils/sleep.js +3 -0
  56. package/package.json +4 -7
  57. package/dist/core/cdnResolver.d.ts +0 -5
  58. package/dist/core/cdnResolver.js +0 -210
  59. package/dist/core/clientManager.d.ts +0 -3
  60. package/dist/core/clientManager.js +0 -9
  61. package/dist/core/componentHelpers.d.ts +0 -3
  62. package/dist/core/componentHelpers.js +0 -175
  63. package/dist/core/componentToJson.js +0 -145
  64. package/dist/core/error.d.ts +0 -3
  65. package/dist/core/error.js +0 -7
  66. package/dist/core/fetchMessages.d.ts +0 -19
  67. package/dist/core/imageToBase64.d.ts +0 -1
  68. package/dist/core/markdown.d.ts +0 -2
  69. package/dist/core/markdown.js +0 -175
  70. package/dist/core/urlResolver.d.ts +0 -5
  71. package/dist/renderers/html/clientRenderer.d.ts +0 -0
  72. package/dist/renderers/html/clientRenderer.js +0 -73
  73. package/dist/renderers/html/css.d.ts +0 -11
  74. package/dist/renderers/html/css.js +0 -663
  75. package/dist/renderers/html/html copy.d.ts +0 -19
  76. package/dist/renderers/html/html copy.js +0 -371
  77. package/dist/renderers/html/html-backup.d.ts +0 -19
  78. package/dist/renderers/html/html-backup.js +0 -371
  79. package/dist/renderers/html/html.d.ts +0 -19
  80. package/dist/renderers/html/html.js +0 -415
  81. package/dist/renderers/html/html2.d.ts +0 -8
  82. package/dist/renderers/html/html2.js +0 -233
  83. package/dist/renderers/html/js.d.ts +0 -4
  84. package/dist/renderers/html/js.js +0 -174
  85. package/dist/types/types copy.d.ts +0 -284
  86. package/dist/types/types copy.js +0 -35
  87. /package/dist/core/{limiter.d.ts → assetResolver/limiter.d.ts} +0 -0
  88. /package/dist/core/{limiter.js → assetResolver/limiter.js} +0 -0
@@ -1,145 +0,0 @@
1
- import { ComponentType } from "discord.js";
2
- import { mapButtonStyle, mapSelectorType, mapSeparatorSpacing } from "./mappers.js";
3
- import { JsonComponentType } from "discord-message-transcript-base";
4
- import { isValidHexColor } from "../../../discord-message-transcript-base/src/core/sanitizer.js";
5
- export async function componentsToJson(components, options) {
6
- const processedComponents = await Promise.all(components.filter(component => !(!options.includeV2Components && component.type != ComponentType.ActionRow))
7
- .map(async (component) => {
8
- switch (component.type) {
9
- case ComponentType.ActionRow: {
10
- const actionRowComponents = await Promise.all(component.components.filter(c => {
11
- if (c.type == ComponentType.Button && !options.includeButtons)
12
- return false;
13
- if (c.type != ComponentType.Button && !options.includeComponents)
14
- return false;
15
- return true;
16
- }).map(async (c) => {
17
- if (c.type === ComponentType.Button) {
18
- return {
19
- type: JsonComponentType.Button,
20
- style: mapButtonStyle(c.style),
21
- label: c.label,
22
- emoji: c.emoji?.name ? c.emoji.name : null,
23
- url: c.url,
24
- disabled: c.disabled,
25
- };
26
- }
27
- else if (c.type === ComponentType.StringSelect) {
28
- return {
29
- type: JsonComponentType.StringSelect,
30
- placeholder: c.placeholder,
31
- disabled: c.disabled,
32
- options: c.options.map(option => ({
33
- label: option.label,
34
- description: option.description ?? null,
35
- emoji: option.emoji ? {
36
- id: option.emoji.id ?? null,
37
- name: option.emoji.name ?? null,
38
- animated: option.emoji.animated ?? false,
39
- } : null,
40
- }))
41
- };
42
- }
43
- else {
44
- return {
45
- type: mapSelectorType(c.type),
46
- placeholder: c.placeholder,
47
- disabled: c.disabled,
48
- };
49
- }
50
- }));
51
- if (actionRowComponents.length > 0)
52
- return { type: JsonComponentType.ActionRow, components: actionRowComponents };
53
- return null;
54
- }
55
- case ComponentType.Container: {
56
- const newOptions = { ...options, includeComponents: true, includeButtons: true };
57
- const componentsJson = await componentsToJson(component.components, newOptions);
58
- return {
59
- type: JsonComponentType.Container,
60
- components: componentsJson.filter(isJsonComponentInContainer), // Input components that are container-safe must always produce container-safe output.
61
- hexAccentColor: isValidHexColor(component.hexAccentColor, false),
62
- spoiler: component.spoiler,
63
- };
64
- }
65
- case ComponentType.File: {
66
- return {
67
- type: JsonComponentType.File,
68
- fileName: component.data.name ?? null,
69
- size: component.data.size ?? 0,
70
- url: component.file.url,
71
- spoiler: component.spoiler,
72
- };
73
- }
74
- case ComponentType.MediaGallery: {
75
- const mediaItems = component.items.map(item => {
76
- return {
77
- media: { url: item.media.url },
78
- spoiler: item.spoiler,
79
- };
80
- });
81
- return {
82
- type: JsonComponentType.MediaGallery,
83
- items: mediaItems,
84
- };
85
- }
86
- case ComponentType.Section: {
87
- let accessoryJson;
88
- if (component.accessory.type === ComponentType.Button) {
89
- accessoryJson = {
90
- type: JsonComponentType.Button,
91
- style: mapButtonStyle(component.accessory.style),
92
- label: component.accessory.label,
93
- emoji: component.accessory.emoji?.name ? component.accessory.emoji.name : null,
94
- url: component.accessory.url,
95
- disabled: component.accessory.disabled,
96
- };
97
- }
98
- else if (component.accessory.type === ComponentType.Thumbnail) {
99
- accessoryJson = {
100
- type: JsonComponentType.Thumbnail,
101
- media: {
102
- url: component.accessory.media.url,
103
- },
104
- spoiler: component.accessory.spoiler,
105
- };
106
- }
107
- else
108
- return null;
109
- const sectionComponents = component.components.map(c => ({
110
- type: JsonComponentType.TextDisplay,
111
- content: c.content,
112
- }));
113
- return {
114
- type: JsonComponentType.Section,
115
- accessory: accessoryJson,
116
- components: sectionComponents,
117
- };
118
- }
119
- case ComponentType.Separator: {
120
- return {
121
- type: JsonComponentType.Separator,
122
- spacing: mapSeparatorSpacing(component.spacing),
123
- divider: component.divider,
124
- };
125
- }
126
- case ComponentType.TextDisplay: {
127
- return {
128
- type: JsonComponentType.TextDisplay,
129
- content: component.content,
130
- };
131
- }
132
- default:
133
- return null;
134
- }
135
- }));
136
- return processedComponents.filter(c => c != null);
137
- }
138
- export function isJsonComponentInContainer(component) {
139
- return (component.type == JsonComponentType.ActionRow ||
140
- component.type == JsonComponentType.File ||
141
- component.type == JsonComponentType.MediaGallery ||
142
- component.type == JsonComponentType.Section ||
143
- component.type == JsonComponentType.Separator ||
144
- component.type == JsonComponentType.TextDisplay);
145
- }
@@ -1,3 +0,0 @@
1
- export declare class CustomError extends Error {
2
- constructor(message: string);
3
- }
@@ -1,7 +0,0 @@
1
- export class CustomError extends Error {
2
- constructor(message) {
3
- super(`[discord-message-transcript] ${message}`);
4
- this.name = 'DiscordMessageTranscriptError';
5
- Object.setPrototypeOf(this, CustomError.prototype);
6
- }
7
- }
@@ -1,19 +0,0 @@
1
- import { TextBasedChannel } from "discord.js";
2
- import { JsonAuthor, JsonMessage, TranscriptOptionsBase } from "discord-message-transcript-base";
3
- import { MapMentions } from "../types/types.js";
4
- export declare function fetchMessages(ctx: FetchMessagesContext): Promise<{
5
- messages: JsonMessage[];
6
- end: boolean;
7
- newLastMessageId: string | undefined;
8
- }>;
9
- export type FetchMessagesContext = {
10
- channel: TextBasedChannel;
11
- options: TranscriptOptionsBase;
12
- transcriptState: TranscriptState;
13
- lastMessageId: string | undefined;
14
- };
15
- type TranscriptState = {
16
- authors: Map<string, JsonAuthor>;
17
- mentions: MapMentions;
18
- };
19
- export {};
@@ -1 +0,0 @@
1
- export declare function imageToBase64(url: string, disableWarnings: boolean): Promise<string>;
@@ -1,2 +0,0 @@
1
- import { JsonMessageMentions } from "../types/types";
2
- export declare function markdownToHTML(text: string, mentions: JsonMessageMentions, dateFormat: Intl.DateTimeFormat): string;
@@ -1,175 +0,0 @@
1
- export function markdownToHTML(text, mentions, dateFormat) {
2
- const codeBlock = [];
3
- const codeLine = [];
4
- // Code Block (```)
5
- text = text.replace(/```(?:(\S+)\n)?([\s\S]+?)```/g, (_m, lang, code) => {
6
- const rawLang = lang?.toLowerCase();
7
- const normalizedLang = rawLang ? (LANGUAGE_ALIAS[rawLang] ?? rawLang) : null;
8
- const language = normalizedLang && SUPPORTED_LANGUAGES.has(rawLang) ? normalizedLang : 'plaintext';
9
- codeBlock.push(`<pre><code class="language-${language}">${code.trimEnd()}</code></pre>`);
10
- return `%$%CODE!BLOCK!${codeBlock.length - 1}%$%`;
11
- });
12
- // Code line (`)
13
- text = text.replace(/`([^`]+)`/g, (_m, code) => {
14
- codeLine.push(`<code>${code}</code>`);
15
- return `%$%CODE!LINE!${codeLine.length - 1}%$%`;
16
- });
17
- // Citation (> | >>>)
18
- text = text.replace(/(^> ?.*(?:(?:\n^> ?.*)+)?)/gm, (match) => {
19
- const cleanContent = match.split('\n').map(line => {
20
- return line.replace(/^>+ ?/, '');
21
- }).join('\n');
22
- return `<blockquote class="quote-multi">${cleanContent}</blockquote>`;
23
- });
24
- // Headers (#)
25
- text = text.replace(/^### (.*)(?=\n|$)/gm, `<h3>$1</h3>`);
26
- text = text.replace(/^## (.*)(?=\n|$)/gm, `<h2>$1</h2>`);
27
- text = text.replace(/^# (.*)(?=\n|$)/gm, `<h1>$1</h1>`);
28
- // Subtext(-#)
29
- text = text.replace(/^-# (.*)(?=\n|$)/gm, `<p class="subtext">$1</p>`);
30
- // List (- | *)
31
- text = text.replace(/^(\s*)[-*] (.*)(?=\n|$)/gm, (_m, indentation, text) => {
32
- const isSubItem = indentation.length > 0;
33
- const bullet = isSubItem ? '◦' : '•';
34
- return `<p class="pList">${indentation}${bullet} ${text}</p>`;
35
- });
36
- // Spoiler (||)
37
- text = text.replace(/\|\|(.*?)\|\|/gs, `<span class="spoilerMsg">$1</span>`);
38
- // Bold & Italic (***)
39
- text = text.replace(/\*\*\*(.*?)\*\*\*/gs, `<strong><em>$1</em></strong>`);
40
- // Bold (**)
41
- text = text.replace(/\*\*(.*?)\*\*/gs, `<strong>$1</strong>`);
42
- // Underline(__)
43
- text = text.replace(/__(.*?)__/gs, `<u>$1</u>`);
44
- // Italic (*)
45
- text = text.replace(/\*(.*?)\*/gs, `<em>$1</em>`);
46
- text = text.replace(/\_(.*?)\_/gs, `<em>$1</em>`);
47
- // Strikethrough (~~)
48
- text = text.replace(/~~(.*?)~~/gs, `<s>$1</s>`);
49
- // Links ([]() && https)
50
- text = text.replace(/\[([^\]]+)\]\((https?:\/\/[^\s]+)\)/g, (_m, text, link) => `<a href="${link}" target="_blank">${text}</a>`);
51
- text = text.replace(/(?<!href=")(https?:\/\/[^\s]+)/g, (_m, link) => `<a href="${link}" target="_blank">${link}</a>`);
52
- // Mentions (@)
53
- if (mentions.users.length != 0) {
54
- const users = new Map(mentions.users.map(user => [user.id, user]));
55
- text = text.replace(/<@!?(\d+)>/g, (_m, id) => {
56
- let user = users.get(id);
57
- return user ? `<span class="mention" style="color: ${user.color ?? "#dbdee1"}">@${user.name}</span> ` : `<span class="mention"><@${id}></span> `;
58
- });
59
- }
60
- if (mentions.roles.length != 0) {
61
- const roles = new Map(mentions.roles.map(role => [role.id, role]));
62
- text = text.replace(/<@&(\d+)>/g, (_m, id) => {
63
- const role = roles.get(id);
64
- return role ? `<span class="mention" style="color: ${role.color}">@${role.name}</span> ` : `<span class="mention"><@&${id}></span> `;
65
- });
66
- }
67
- if (mentions.channels.length != 0) {
68
- const channels = new Map(mentions.channels.map(channel => [channel.id, channel]));
69
- text = text.replace(/<#(\d+)>/g, (_m, id) => {
70
- const channel = channels.get(id);
71
- return channel && channel.name ? `<span class="mention">#${channel.name}</span> ` : `<span class="mention"><#${id}></span> `;
72
- });
73
- }
74
- if (mentions.everyone) {
75
- text = text.replace("@everyone", `<span class="mention">@everyone</span> `);
76
- text = text.replace("@here", `<span class="mention">@here</span> `);
77
- }
78
- // Timestamp
79
- const { locale, timeZone } = dateFormat.resolvedOptions();
80
- text = text.replace(/<t:(\d+)(?::([tTdDfFR]))?>/g, (_m, timestamp, format) => {
81
- const date = new Date(parseInt(timestamp, 10) * 1000);
82
- const style = format || 'f';
83
- const isoString = date.toISOString();
84
- const titleFormatter = new Intl.DateTimeFormat(locale, {
85
- dateStyle: 'full',
86
- timeStyle: 'full',
87
- timeZone: timeZone,
88
- });
89
- const fullDateForTitle = titleFormatter.format(date);
90
- if (style === 'R') {
91
- const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
92
- const seconds = Math.floor((date.getTime() - Date.now()) / 1000);
93
- const minutes = Math.floor(seconds / 60);
94
- const hours = Math.floor(minutes / 60);
95
- const days = Math.floor(hours / 24);
96
- let relativeString;
97
- if (Math.abs(days) > 30)
98
- relativeString = rtf.format(Math.floor(days / 30.44), 'month');
99
- else if (Math.abs(days) > 0)
100
- relativeString = rtf.format(days, 'day');
101
- else if (Math.abs(hours) > 0)
102
- relativeString = rtf.format(hours, 'hour');
103
- else if (Math.abs(minutes) > 0)
104
- relativeString = rtf.format(minutes, 'minute');
105
- else
106
- relativeString = rtf.format(seconds, 'second');
107
- return `<time datetime="${isoString}" title="${fullDateForTitle}">${relativeString}</time>`;
108
- }
109
- else if (isStyleKey(style)) {
110
- const formatter = new Intl.DateTimeFormat(locale, {
111
- ...styleOptions[style],
112
- timeZone: timeZone,
113
- });
114
- const formattedDate = formatter.format(date);
115
- return `<time datetime="${isoString}" title="${fullDateForTitle}">${formattedDate}</time>`;
116
- }
117
- return _m;
118
- });
119
- // Break Line
120
- text = text.replace(/\n/g, '<br>');
121
- // Clear Unecessary Break Line
122
- text = text.replace(/(<\/(?:p|h[1-3]|blockquote)>)\s*<br>/g, '$1');
123
- // Remove Placeholders
124
- text = text.replace(/%\$%CODE!BLOCK!(\d+)%\$%/g, (_m, number) => {
125
- return codeBlock[number];
126
- });
127
- text = text.replace(/%\$%CODE!LINE!(\d+)%\$%/g, (_m, number) => {
128
- return codeLine[number];
129
- });
130
- return text;
131
- }
132
- // Check if styleKey is valid
133
- const styleOptions = {
134
- 't': { timeStyle: 'short' },
135
- 'T': { timeStyle: 'medium' },
136
- 'd': { dateStyle: 'short' },
137
- 'D': { dateStyle: 'long' },
138
- 'f': { dateStyle: 'long', timeStyle: 'short' },
139
- 'F': { dateStyle: 'full', timeStyle: 'short' },
140
- };
141
- function isStyleKey(key) {
142
- return key in styleOptions;
143
- }
144
- // At least I hope
145
- const SUPPORTED_LANGUAGES = new Set([
146
- 'bash', 'sh', 'shell',
147
- 'c',
148
- 'cpp',
149
- 'css',
150
- 'javascript', 'js',
151
- 'typescript', 'ts',
152
- 'json',
153
- 'xml',
154
- 'yaml', 'yml',
155
- 'java',
156
- 'kotlin',
157
- 'php',
158
- 'python', 'py',
159
- 'ruby', 'rb',
160
- 'sql',
161
- 'lua',
162
- 'markdown', 'md',
163
- 'plaintext', 'txt'
164
- ]);
165
- const LANGUAGE_ALIAS = {
166
- sh: 'bash',
167
- shell: 'bash',
168
- js: 'javascript',
169
- ts: 'typescript',
170
- py: 'python',
171
- rb: 'ruby',
172
- md: 'markdown',
173
- yml: 'yaml',
174
- txt: 'plaintext'
175
- };
@@ -1,5 +0,0 @@
1
- import { JsonAuthor, JsonMessage, TranscriptOptionsBase } from "discord-message-transcript-base";
2
- import { CDNOptions } from "../types/types.js";
3
- export declare function urlResolver(url: string, options: TranscriptOptionsBase, cdnOptions: CDNOptions | null, urlCache: Map<string, Promise<string>>): Promise<string>;
4
- export declare function messagesUrlResolver(messages: JsonMessage[], options: TranscriptOptionsBase, cdnOptions: CDNOptions | null, urlCache: Map<string, Promise<string>>): Promise<JsonMessage[]>;
5
- export declare function authorUrlResolver(authors: Map<string, JsonAuthor>, options: TranscriptOptionsBase, cdnOptions: CDNOptions | null, urlCache: Map<string, Promise<string>>): Promise<JsonAuthor[]>;
File without changes
@@ -1,73 +0,0 @@
1
- "use strict";
2
- document.addEventListener('DOMContentLoaded', () => {
3
- const transcriptDataElement = document.getElementById('transcript-data');
4
- if (!transcriptDataElement) {
5
- console.error('Missing transcript data element.');
6
- return;
7
- }
8
- const data = JSON.parse(transcriptDataElement.textContent);
9
- const authorMap = new Map(data.authors.map(author => [author.id, author]));
10
- document.querySelectorAll('.messageDiv[data-author-id]').forEach(messageDiv => {
11
- const authorId = messageDiv.dataset.authorId;
12
- const author = authorMap.get(authorId);
13
- if (!author) {
14
- console.warn(`Author not found for message with ID: ${messageDiv.id} and author ID: ${authorId}`);
15
- return;
16
- }
17
- const avatarImg = messageDiv.querySelector('.messageImg');
18
- if (avatarImg)
19
- avatarImg.src = author.avatarURL;
20
- const usernameH3 = messageDiv.querySelector('.messageUsername');
21
- if (usernameH3) {
22
- usernameH3.textContent = author.member?.displayName ?? author.displayName;
23
- usernameH3.style.color = author.member?.displayHexColor ?? '#dbdee1';
24
- }
25
- const badgesDiv = messageDiv.querySelector('.badges');
26
- if (badgesDiv) {
27
- badgesDiv.innerHTML = ''; // Clear existing placeholders
28
- if (author.bot) {
29
- const badge = document.createElement('p');
30
- badge.className = 'badge';
31
- badge.textContent = 'APP';
32
- badgesDiv.appendChild(badge);
33
- }
34
- if (author.system) {
35
- const badge = document.createElement('p');
36
- badge.className = 'badge';
37
- badge.textContent = 'SYSTEM';
38
- badgesDiv.appendChild(badge);
39
- }
40
- if (author.guildTag) {
41
- const badge = document.createElement('p');
42
- badge.className = 'badgeTag';
43
- badge.textContent = author.guildTag;
44
- badgesDiv.appendChild(badge);
45
- }
46
- }
47
- });
48
- // Handle existing client-side event listeners
49
- document.addEventListener('click', function (event) {
50
- const spoiler = event.target.closest('.spoilerMsg, .spoilerAttachment');
51
- if (spoiler && !spoiler.classList.contains('revealed')) {
52
- event.preventDefault();
53
- event.stopPropagation();
54
- spoiler.classList.add('revealed');
55
- }
56
- const selectorInput = event.target.closest('.selectorInput');
57
- document.querySelectorAll('.selector').forEach(selector => {
58
- if (!selector.contains(event.target)) {
59
- selector.classList.remove('active');
60
- }
61
- });
62
- if (selectorInput) {
63
- const selector = selectorInput.closest('.selector');
64
- if (selector) {
65
- selector.classList.toggle('active');
66
- }
67
- }
68
- });
69
- // Initial highlighting
70
- if (window.hljs) {
71
- hljs.highlightAll();
72
- }
73
- });
@@ -1,11 +0,0 @@
1
- export declare const DEFAULT_CSS = "\nbody {\n background-color: #313338;\n color: #dbdee1;\n font-family: \"Whitney\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n margin: 0;\n padding: 0;\n width: 100%;\n}\nheader {\n height: fit-content;\n border-bottom: 2px solid black;\n margin-top: 2rem;\n padding-left: 2rem;\n padding-bottom: 1rem;\n display: flex;\n flex-direction: column;\n display: flex;\n flex-direction: row;\n}\na {\n text-decoration: none;\n color: #1E90FF;\n}\np {\n margin: 0;\n}\nh4 {\n margin: 0;\n}\ncode {\n border: 1px solid #202225;\n border-radius: 0.25rem;\n}\nblockquote {\n margin: 0.5rem 0;\n border-left: 0.25rem solid #4f545c;\n padding: 0.4rem 0.6rem;\n border-radius: 0.25rem;\n color: #9f9fa6;\n}\n.line {\n display: flex;\n align-items: baseline;\n gap: 0.5rem\n}\n.badge {\n background-color: #5865f2;\n color: white;\n font-weight: 600;\n font-size: 80%;\n padding: 0.1rem 0.35rem;\n border-radius: 0.25rem;\n letter-spacing: 0.03rem;\n height: fit-content;\n width: fit-content;\n align-self: flex-start;\n}\n.badgeTag {\n background-color: #747F8D50;\n color: white;\n font-weight: 600;\n font-size: 70%;\n padding: 0.1rem 0.35rem;\n border-radius: 0.25rem;\n letter-spacing: 0.03rem;\n height: fit-content;\n width: fit-content;\n align-self: center;\n}\n.mention {\n background-color: #5664fa41;\n padding: 0.2rem;\n border-radius: 0.25rem;\n transition: background-color 0.2s ease;\n}\n.mention:hover {\n background-color: #5664fa7e;\n}\n";
2
- export declare const MESSAGE_CSS = "\n.messageDiv {\n display: flex;\n flex-direction: column;\n gap: 0.2rem;\n padding: 0.5rem;\n border-radius: 1rem;\n}\n.messageDiv.highlight, .messageDiv:hover {\n background-color: #40434b;\n transition: background-color 0.3s ease-in-out;\n}\n.messageBotton {\n display: flex;\n flex-direction: row;\n gap: 1rem;\n padding: 0.5rem;\n border-radius: 0.25rem;\n}\n.messageImg {\n width: 3.5rem; \n height: 3.5rem; \n border-radius: 50%;\n}\n.messageDivRight {\n display: flex;\n flex-direction: column;\n gap: 0.25rem\n}\n.messageUser {\n display: flex;\n flex-direction: row;\n gap: 0.75rem;\n}\n.messageUsername {\n margin: 0;\n}\n.messageTimeStamp {\n color: #999999;\n font-size: 77.5%;\n align-self: center;\n}\n.messageContent {\n line-height: 1.5;\n}\n.pList {\n white-space: pre-wrap;\n}\n.subtext {\n font-size: 85%;\n color: #808080;\n}\n.spoilerMsg {\n display: inline-block;\n background-color: #202225;\n color: #202225;\n padding: 0 0.2rem;\n border-radius: 0.2rem;\n cursor: pointer;\n transition: background-color 0.1s ease-in-out, color 0.1s ease-in-out;\n}\n.spoilerMsg.revealed {\n background-color: transparent;\n color: inherit;\n}\n.messageReply {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.8rem;\n color: #b5bac1;\n cursor: pointer;\n margin-left: 2rem;\n}\n.messageReplySvg {\n flex-shrink: 0;\n width: 2.25rem;\n height: 2.25rem;\n color: #b5bac1;\n}\n.messageReplyImg {\n width: 1.75rem;\n height: 1.75rem;\n border-radius: 50%;\n flex-shrink: 0;\n}\n.messageReplyAuthor {\n font-weight: 600;\n color: #dbdee1;\n margin-right: 0.3rem;\n}\n.badgeReply {\n background-color: #5865f2;\n color: white;\n font-weight: 600;\n font-size: 70%;\n padding: 0.1rem 0.3rem;\n border-radius: 0.25rem;\n letter-spacing: 0.03rem;\n height: fit-content;\n align-self: center;\n flex-shrink: 0;\n}\n.messageReplyText {\n flex-grow: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: #b5bac1;\n font-size: 0.75rem;\n}\n";
3
- export declare const EMBED_CSS = "\n.embed {\n background-color: #2b2d31;\n border: 0.15rem solid #2b2d31;\n border-left: 0.25rem solid;\n border-radius: 0.25rem;\n padding: 0.5rem 0.75rem;\n margin-top: 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-width: 520px;\n}\n.embed a {\n color: #00aff4;\n text-decoration: none;\n}\n.embed a:hover {\n text-decoration: underline;\n}\n.embedHeader {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 0.5rem;\n}\n.embedHeaderRight {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n.embedHeaderRightAuthor {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n font-weight: 500;\n color: #ffffff;\n}\n.embedHeaderRightAuthorImg {\n width: 1.5rem;\n height: 1.5rem;\n border-radius: 50%;\n}\n.embedHeaderRightAuthorName {\n color: #ffffff;\n font-weight: 500;\n}\n.embedHeaderRightTitle {\n font-size: 1rem;\n font-weight: bold;\n color: #ffffff;\n}\n.embedHeaderThumbnail {\n max-width: 80px;\n max-height: 80px;\n object-fit: contain;\n border-radius: 0.25rem;\n flex-shrink: 0;\n}\n.embedDescription {\n font-size: 0.875rem;\n color: #dcddde;\n}\n.embedFields {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n.embedFieldsField {\n flex: 1;\n min-width: 150px;\n}\n.embedFieldsFieldTitle {\n font-size: 0.75rem;\n font-weight: bold;\n color: #ffffff;\n margin-bottom: 0.25rem;\n}\n.embedFieldsFieldValue {\n font-size: 0.875rem;\n color: #dcddde;\n}\n.embedImage {\n margin-top: 0.5rem;\n max-width: 100%;\n height: auto;\n}\n.embedImage img {\n max-width: 100%;\n max-height: 300px;\n object-fit: contain;\n border-radius: 0.25rem;\n}\n.embedFooter {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n color: #999999;\n margin-top: 0.5rem;\n}\n.embedFooterImg {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n}\n.embedFooterText {\n color: #999999;\n}\n";
4
- export declare const ATTACHMENT_CSS = "\n.attachmentImage, .attachmentVideo {\n max-width: 400px;\n height: auto;\n border-radius: 0.25rem;\n margin-top: 0.5rem;\n}\n.attachmentAudio {\n width: 300px;\n margin-top: 0.5rem;\n}\n.attachmentFile {\n background-color: #2b2d31;\n border: 1px solid #202225;\n border-radius: 0.75rem;\n padding: 0.75rem;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n max-width: 400px;\n margin-top: 0.5rem;\n width: fit-content;\n}\n.attachmentFileIcon {\n width: 2.5rem;\n height: 2.5rem;\n fill: #b9bbbe;\n flex-shrink: 0;\n}\n.attachmentFileInfo {\n display: flex;\n flex-direction: column;\n gap: 0.1rem;\n overflow: hidden;\n flex-grow: 1;\n}\n.attachmentFileName {\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.attachmentFileSize {\n font-size: 0.75rem;\n color: #72767d;\n}\n.attachmentDownload {\n display: block;\n flex-shrink: 0;\n}\n.attachmentDownloadIcon {\n width: 1.5rem;\n height: 1.5rem;\n fill: #b9bbbe;\n transition: fill 0.2s ease;\n}\n.attachmentDownload:hover .attachmentDownloadIcon {\n fill: #ffffff;\n}\n.spoilerAttachment {\n position: relative;\n display: inline-block;\n border-radius: 0.5rem;\n overflow: hidden;\n cursor: pointer;\n}\n.spoilerAttachment .spoilerAttachmentContent {\n filter: blur(64px);\n pointer-events: none;\n transition: filter 0.2s ease;\n}\n.spoilerAttachment .spoilerAttachmentOverlay {\n position: absolute;\n inset: 0;\n background: rgba(32, 34, 37, 0.85);\n color: #fff;\n font-weight: 600;\n letter-spacing: 0.05em;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n user-select: none;\n}\n.spoilerAttachment.revealed .spoilerAttachmentContent {\n filter: none;\n pointer-events: auto;\n}\n.spoilerAttachment.revealed .spoilerAttachmentOverlay {\n display: none;\n}\n";
5
- export declare const ACTIONROW_CSS = "\n.actionRow {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n";
6
- export declare const BUTTON_CSS = "\n.button {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0rem 0.8rem;\n height: 2.5rem;\n border-radius: 0.6rem;\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: filter 0.2s ease;\n}\n.button:hover {\n filter: brightness(1.1);\n}\n.buttonEmoji {\n font-size: 1.25rem;\n}\n.buttonLabel {\n font-size: 0.875rem;\n}\n.buttonLink {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: white;\n font-weight: 600;\n}\n.buttonLinkIcon {\n width: 1.25rem;\n height: 1.25rem;\n}\n";
7
- export declare const COMPONENTS_CSS = "\n.selector {\n width: 100%;\n position: relative;\n}\n.selectorInput {\n background-color: #2b2d31;\n border: 1px solid #202225;\n border-radius: 0.75rem;\n padding: 0.75rem;\n min-width: 17.5rem;\n cursor: pointer;\n user-select: none;\n}\n.selectorInputText {\n color: #808080;\n}\n.selectorOptionMenu {\n display: none; \n position: absolute;\n top: 100%;\n left: 0;\n width: 100%;\n background-color: #2b2d31;\n border: 1px solid #202225;\n border-radius: 1rem;\n margin-top: 0.25rem;\n padding: 0.5rem;\n z-index: 10;\n box-sizing: border-box;\n}\n.selector.active .selectorOptionMenu {\n display: block;\n}\n.selectorOption {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem;\n border-radius: 0.75rem;\n cursor: pointer;\n transition: background-color 0.2s ease;\n}\n.selectorOption:hover {\n background-color: #4f545c;\n}\n.selectorOptionEmoji {\n font-size: 1.25rem;\n}\n.selectorOptionRight {\n display: flex;\n flex-direction: column;\n}\n.selectorOptionTitle {\n font-weight: 500;\n}\n.selectorOptionDesc {\n font-size: 0.75rem;\n color: #808080;\n}\n";
8
- export declare const COMPONENTSV2_CSS = "\n.mediaGallery {\n display: flex;\n flex-wrap: wrap;\n gap: 0.35rem;\n width: 20rem;\n height: 20rem;\n border: 1px solid #202225\n padding: 0.35rem;\n overflow: hidden;\n}\n.mediaGalleryItem {\n flex-grow: 1;\n flex-basis: 6rem;\n min-width: 0;\n display: flex;\n}\n.mediaGalleryImg {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n";
9
- export declare const POLL_CSS = "\n.pollDiv {\n background-color: #2b2d31;\n border-radius: 0.5rem;\n padding: 1rem;\n margin-top: 0.5rem;\n max-width: 420px;\n}\n.pollQuestion {\n font-size: 1.1rem;\n font-weight: bold;\n margin-bottom: 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.pollAnswers {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n.pollAnswer {\n background-color: #3a3c42;\n border-radius: 0.3rem;\n padding: 0.75rem;\n cursor: pointer;\n border: 1px solid transparent;\n transition: border-color 0.2s ease;\n position: relative;\n overflow: hidden;\n}\n.pollAnswer:hover {\n border-color: #4d515a;\n}\n.pollAnswerBar {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background-color: #5664fa7a;\n border-radius: 0.2rem;\n z-index: 1;\n}\n.pollAnswerContent {\n position: relative;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.pollAnswerDetails {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.pollAnswerEmoji {\n font-size: 1.25rem;\n}\n.pollAnswerText {\n font-weight: 500;\n}\n.pollAnswerVotes {\n font-size: 0.8rem;\n color: #b5bac1;\n font-weight: bold;\n}\n.pollFooter {\n margin-top: 1rem;\n font-size: 0.75rem;\n color: #949ba4;\n}\n";
10
- export declare const POLL_RESULT_EMBED_CSS = "\n.pollResultEmbed {\n background-color: #2b2d31;\n border-radius: 0.5rem;\n padding: 1rem;\n margin-top: 0.5rem;\n border: 1px solid #3a3c42;\n min-width: 25rem;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n}\n.pollResultEmbedWinner {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1rem;\n font-weight: 600;\n margin-bottom: 0.4rem;\n}\n.pollResultEmbedCheckmark {\n color: #57f287;\n font-size: 1.1em;\n}\n.pollResultEmbedSubtitle {\n font-size: 0.9rem;\n color: #b5bac1;\n}\n.pollResultEmbedButtonDiv {\n margin-right: 0.5rem;\n margin-left: 1rem;\n align-self: center;\n}\n.pollResultEmbedButton {\n background-color: black;\n color: white;\n padding: 0.5rem 1rem;\n border-radius: 0.3rem;\n text-decoration: none;\n font-weight: 500;\n transition: background-color 0.2s ease;\n cursor: pointer;\n}\n.pollResultEmbedButton:hover {\n filter: brightness(1.1);\n}\n";
11
- export declare const REACTIONS_CSS = "\n.reactionsDiv {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n.reaction {\n align-items: center;\n background-color: #2b2d31;\n border: 1px solid #3a3c42;\n border-radius: 1rem;\n padding: 0.25rem 0.6rem;\n font-size: 1rem;\n color: #dcddde;\n font-weight: bold;\n cursor: pointer;\n}\n.reaction:hover {\n filter: brightness(1.1);\n}\n";