discord.js-html-transcript 4.0.0
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.
- package/LICENSE +201 -0
- package/README.md +470 -0
- package/dist/downloader/assets.d.ts +18 -0
- package/dist/downloader/assets.js +53 -0
- package/dist/downloader/assets.js.map +1 -0
- package/dist/downloader/images.d.ts +28 -0
- package/dist/downloader/images.js +119 -0
- package/dist/downloader/images.js.map +1 -0
- package/dist/generator/index.d.ts +24 -0
- package/dist/generator/index.js +112 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/renderers/attachment.d.ts +23 -0
- package/dist/generator/renderers/attachment.js +154 -0
- package/dist/generator/renderers/attachment.js.map +1 -0
- package/dist/generator/renderers/components/Attachment Gallery.d.ts +9 -0
- package/dist/generator/renderers/components/Attachment Gallery.js +26 -0
- package/dist/generator/renderers/components/Attachment Gallery.js.map +1 -0
- package/dist/generator/renderers/components/Button.d.ts +9 -0
- package/dist/generator/renderers/components/Button.js +23 -0
- package/dist/generator/renderers/components/Button.js.map +1 -0
- package/dist/generator/renderers/components/Container.d.ts +6 -0
- package/dist/generator/renderers/components/Container.js +26 -0
- package/dist/generator/renderers/components/Container.js.map +1 -0
- package/dist/generator/renderers/components/Media Gallery.d.ts +8 -0
- package/dist/generator/renderers/components/Media Gallery.js +45 -0
- package/dist/generator/renderers/components/Media Gallery.js.map +1 -0
- package/dist/generator/renderers/components/Select Menu.d.ts +10 -0
- package/dist/generator/renderers/components/Select Menu.js +34 -0
- package/dist/generator/renderers/components/Select Menu.js.map +1 -0
- package/dist/generator/renderers/components/Spacing.d.ts +7 -0
- package/dist/generator/renderers/components/Spacing.js +17 -0
- package/dist/generator/renderers/components/Spacing.js.map +1 -0
- package/dist/generator/renderers/components/Thumbnail.d.ts +7 -0
- package/dist/generator/renderers/components/Thumbnail.js +21 -0
- package/dist/generator/renderers/components/Thumbnail.js.map +1 -0
- package/dist/generator/renderers/components/poll.d.ts +7 -0
- package/dist/generator/renderers/components/poll.js +78 -0
- package/dist/generator/renderers/components/poll.js.map +1 -0
- package/dist/generator/renderers/components/section/Section.d.ts +11 -0
- package/dist/generator/renderers/components/section/Section.js +21 -0
- package/dist/generator/renderers/components/section/Section.js.map +1 -0
- package/dist/generator/renderers/components/section/SectionAccessory.d.ts +6 -0
- package/dist/generator/renderers/components/section/SectionAccessory.js +20 -0
- package/dist/generator/renderers/components/section/SectionAccessory.js.map +1 -0
- package/dist/generator/renderers/components/section/SectionContent.d.ts +6 -0
- package/dist/generator/renderers/components/section/SectionContent.js +21 -0
- package/dist/generator/renderers/components/section/SectionContent.js.map +1 -0
- package/dist/generator/renderers/components/styles.d.ts +21 -0
- package/dist/generator/renderers/components/styles.js +1639 -0
- package/dist/generator/renderers/components/styles.js.map +1 -0
- package/dist/generator/renderers/components/utils.d.ts +36 -0
- package/dist/generator/renderers/components/utils.js +98 -0
- package/dist/generator/renderers/components/utils.js.map +1 -0
- package/dist/generator/renderers/components/voice.d.ts +5 -0
- package/dist/generator/renderers/components/voice.js +50 -0
- package/dist/generator/renderers/components/voice.js.map +1 -0
- package/dist/generator/renderers/components.d.ts +13 -0
- package/dist/generator/renderers/components.js +78 -0
- package/dist/generator/renderers/components.js.map +1 -0
- package/dist/generator/renderers/content.d.ts +26 -0
- package/dist/generator/renderers/content.js +396 -0
- package/dist/generator/renderers/content.js.map +1 -0
- package/dist/generator/renderers/embed.d.ts +59 -0
- package/dist/generator/renderers/embed.js +216 -0
- package/dist/generator/renderers/embed.js.map +1 -0
- package/dist/generator/renderers/message.d.ts +7 -0
- package/dist/generator/renderers/message.js +106 -0
- package/dist/generator/renderers/message.js.map +1 -0
- package/dist/generator/renderers/reply.d.ts +7 -0
- package/dist/generator/renderers/reply.js +74 -0
- package/dist/generator/renderers/reply.js.map +1 -0
- package/dist/generator/renderers/systemMessage.d.ts +15 -0
- package/dist/generator/renderers/systemMessage.js +168 -0
- package/dist/generator/renderers/systemMessage.js.map +1 -0
- package/dist/generator/transcript.d.ts +3 -0
- package/dist/generator/transcript.js +148 -0
- package/dist/generator/transcript.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +37 -0
- package/dist/options.js +89 -0
- package/dist/options.js.map +1 -0
- package/dist/static/client.d.ts +6 -0
- package/dist/static/client.js +626 -0
- package/dist/static/client.js.map +1 -0
- package/dist/types.d.ts +193 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildProfiles.d.ts +14 -0
- package/dist/utils/buildProfiles.js +136 -0
- package/dist/utils/buildProfiles.js.map +1 -0
- package/dist/utils/embeds.d.ts +2 -0
- package/dist/utils/embeds.js +17 -0
- package/dist/utils/embeds.js.map +1 -0
- package/dist/utils/extend.d.ts +8 -0
- package/dist/utils/extend.js +8 -0
- package/dist/utils/extend.js.map +1 -0
- package/dist/utils/utils.d.ts +9 -0
- package/dist/utils/utils.js +44 -0
- package/dist/utils/utils.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TranscriptAssetDownloader = void 0;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const undici_1 = require("undici");
|
|
9
|
+
/**
|
|
10
|
+
* Builder to build a generic asset saving callback.
|
|
11
|
+
*/
|
|
12
|
+
class TranscriptAssetDownloader {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.log = TranscriptAssetDownloader.log;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sets the maximum file size for each downloaded asset.
|
|
18
|
+
* @param size The maximum file size in kilobytes
|
|
19
|
+
*/
|
|
20
|
+
withMaxSize(size) {
|
|
21
|
+
this.maxFileSize = size;
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Builds the asset saving callback.
|
|
26
|
+
*/
|
|
27
|
+
build() {
|
|
28
|
+
return async (asset) => {
|
|
29
|
+
var _a;
|
|
30
|
+
if (!asset.url || asset.url.startsWith('data:')) {
|
|
31
|
+
return asset.url;
|
|
32
|
+
}
|
|
33
|
+
if (this.maxFileSize && asset.size && asset.size > this.maxFileSize * 1024) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
this.log(`Fetching ${asset.kind}: ${asset.url}`);
|
|
37
|
+
const response = await (0, undici_1.request)(asset.url).catch((err) => {
|
|
38
|
+
console.error(`[discord-html-transcripts] Failed to download asset for transcript: `, err);
|
|
39
|
+
return null;
|
|
40
|
+
});
|
|
41
|
+
if (!response) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const mimeType = (_a = response.headers['content-type']) !== null && _a !== void 0 ? _a : 'application/octet-stream';
|
|
45
|
+
const buffer = await response.body.arrayBuffer().then((res) => Buffer.from(res));
|
|
46
|
+
this.log(`Finished fetching ${asset.kind} (${buffer.length} bytes)`);
|
|
47
|
+
return `data:${mimeType};base64,${buffer.toString('base64')}`;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.TranscriptAssetDownloader = TranscriptAssetDownloader;
|
|
52
|
+
TranscriptAssetDownloader.log = (0, debug_1.default)('discord-html-transcripts:TranscriptAssetDownloader');
|
|
53
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/downloader/assets.ts"],"names":[],"mappings":";;;;;;AACA,kDAA0B;AAC1B,mCAAiC;AAEjC;;GAEG;AACH,MAAa,yBAAyB;IAAtC;QAEU,QAAG,GAAG,yBAAyB,CAAC,GAAG,CAAC;IA2C9C,CAAC;IAvCC;;;OAGG;IACH,WAAW,CAAC,IAAY;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,KAAK,EAAE,KAAsB,EAAE,EAAE;;YACtC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChD,OAAO,KAAK,CAAC,GAAG,CAAC;YACnB,CAAC;YAED,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC;gBAC3E,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,IAAA,gBAAO,EAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtD,OAAO,CAAC,KAAK,CAAC,sEAAsE,EAAE,GAAG,CAAC,CAAC;gBAC3F,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,QAAQ,GAAG,MAAA,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,mCAAI,0BAA0B,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;YAErE,OAAO,QAAQ,QAAQ,WAAW,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC;;AA5CH,8DA6CC;AA5CgB,6BAAG,GAAG,IAAA,eAAK,EAAC,oDAAoD,CAAC,AAA9D,CAA+D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ResolveImageCallback } from '../types';
|
|
2
|
+
import type { WebpOptions } from 'sharp';
|
|
3
|
+
export type { ResolveImageCallback } from '../types';
|
|
4
|
+
/**
|
|
5
|
+
* Builder to build a image saving callback.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TranscriptImageDownloader {
|
|
8
|
+
private static log;
|
|
9
|
+
private log;
|
|
10
|
+
private maxFileSize?;
|
|
11
|
+
private compression?;
|
|
12
|
+
/**
|
|
13
|
+
* Sets the maximum file size for *each* individual image.
|
|
14
|
+
* @param size The maximum file size in kilobytes
|
|
15
|
+
*/
|
|
16
|
+
withMaxSize(size: number): this;
|
|
17
|
+
/**
|
|
18
|
+
* Sets the compression quality for each image. This requires `sharp` to be installed.
|
|
19
|
+
* Optionally, images can be converted to WebP format which is smaller in size.
|
|
20
|
+
* @param quality The quality of the image (1 lowest - 100 highest). Lower quality means smaller file size.
|
|
21
|
+
* @param convertToWebP Whether to convert the image to WebP format
|
|
22
|
+
*/
|
|
23
|
+
withCompression(quality?: number, convertToWebP?: boolean, options?: Omit<WebpOptions, 'quality' | 'force'>): this;
|
|
24
|
+
/**
|
|
25
|
+
* Builds the image saving callback.
|
|
26
|
+
*/
|
|
27
|
+
build(): ResolveImageCallback;
|
|
28
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.TranscriptImageDownloader = void 0;
|
|
40
|
+
const undici_1 = require("undici");
|
|
41
|
+
const debug_1 = __importDefault(require("debug"));
|
|
42
|
+
/**
|
|
43
|
+
* Builder to build a image saving callback.
|
|
44
|
+
*/
|
|
45
|
+
class TranscriptImageDownloader {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.log = TranscriptImageDownloader.log;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Sets the maximum file size for *each* individual image.
|
|
51
|
+
* @param size The maximum file size in kilobytes
|
|
52
|
+
*/
|
|
53
|
+
withMaxSize(size) {
|
|
54
|
+
this.maxFileSize = size;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Sets the compression quality for each image. This requires `sharp` to be installed.
|
|
59
|
+
* Optionally, images can be converted to WebP format which is smaller in size.
|
|
60
|
+
* @param quality The quality of the image (1 lowest - 100 highest). Lower quality means smaller file size.
|
|
61
|
+
* @param convertToWebP Whether to convert the image to WebP format
|
|
62
|
+
*/
|
|
63
|
+
withCompression(quality = 80, convertToWebP = false, options = {}) {
|
|
64
|
+
if (quality < 1 || quality > 100)
|
|
65
|
+
throw new Error('Quality must be between 1 and 100');
|
|
66
|
+
// try and import sharp
|
|
67
|
+
Promise.resolve().then(() => __importStar(require('sharp'))).catch((err) => {
|
|
68
|
+
console.error(err);
|
|
69
|
+
console.error(`[discord-html-transcripts] Failed to import 'sharp'. Image compression requires the 'sharp' package to be installed. Either install sharp or remove the compression options.`);
|
|
70
|
+
});
|
|
71
|
+
this.compression = { quality, convertToWebP, options };
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Builds the image saving callback.
|
|
76
|
+
*/
|
|
77
|
+
build() {
|
|
78
|
+
return async (attachment) => {
|
|
79
|
+
if (!attachment.width || !attachment.height)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (this.maxFileSize && attachment.size > this.maxFileSize * 1024)
|
|
82
|
+
return undefined;
|
|
83
|
+
this.log(`Fetching attachment ${attachment.id}: ${attachment.url}`);
|
|
84
|
+
const response = await (0, undici_1.request)(attachment.url).catch((err) => {
|
|
85
|
+
console.error(`[discord-html-transcripts] Failed to download image for transcript: `, err);
|
|
86
|
+
return null;
|
|
87
|
+
});
|
|
88
|
+
if (!response)
|
|
89
|
+
return undefined;
|
|
90
|
+
const mimetype = response.headers['content-type'];
|
|
91
|
+
const buffer = await response.body.arrayBuffer().then((res) => Buffer.from(res));
|
|
92
|
+
this.log(`Finished fetching ${attachment.id} (${buffer.length} bytes)`);
|
|
93
|
+
if (this.compression) {
|
|
94
|
+
try {
|
|
95
|
+
const sharp = await Promise.resolve().then(() => __importStar(require('sharp')));
|
|
96
|
+
this.log(`Compressing ${attachment.id} with 'sharp'`);
|
|
97
|
+
let pipeline = sharp.default(buffer);
|
|
98
|
+
const metadata = await pipeline.metadata();
|
|
99
|
+
if (metadata.width && metadata.width > 1200) {
|
|
100
|
+
pipeline = pipeline.resize({ width: 1200, withoutEnlargement: true });
|
|
101
|
+
}
|
|
102
|
+
const sharpbuf = await pipeline
|
|
103
|
+
.webp(Object.assign({ quality: this.compression.quality, force: this.compression.convertToWebP, effort: 6, smartSubsample: true }, this.compression.options))
|
|
104
|
+
.toBuffer({ resolveWithObject: true });
|
|
105
|
+
this.log(`Finished compressing ${attachment.id} (${sharpbuf.info.size} bytes)`);
|
|
106
|
+
return `data:image/${sharpbuf.info.format};base64,${sharpbuf.data.toString('base64')}`;
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
this.log(`Advanced compression failed for ${attachment.id}, falling back safely:`, e);
|
|
110
|
+
// fall through to uncompressed buffer below
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return `data:${mimetype};base64,${buffer.toString('base64')}`;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.TranscriptImageDownloader = TranscriptImageDownloader;
|
|
118
|
+
TranscriptImageDownloader.log = (0, debug_1.default)('discord-html-transcripts:TranscriptImageDownloader');
|
|
119
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/downloader/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Awaitable, type Channel, type Message, type Role, type User } from 'discord.js';
|
|
2
|
+
import type { ResolveAssetCallback, ResolveImageCallback, TranscriptAsset, TranscriptInviteData } from '../types';
|
|
3
|
+
import type { ResolvedTranscriptAssetOptions, ResolvedTranscriptFeatureOptions } from '../options';
|
|
4
|
+
export type RenderMessageContext = {
|
|
5
|
+
messages: Message[];
|
|
6
|
+
channel: Channel;
|
|
7
|
+
guildIcon?: string;
|
|
8
|
+
callbacks: {
|
|
9
|
+
resolveImageSrc?: ResolveImageCallback;
|
|
10
|
+
resolveAssetSrc?: ResolveAssetCallback;
|
|
11
|
+
resolveTranscriptAssetUrl: (asset: TranscriptAsset) => Promise<string | undefined>;
|
|
12
|
+
resolveChannel: (channelId: string) => Awaitable<Channel | null>;
|
|
13
|
+
resolveUser: (userId: string) => Awaitable<User | null>;
|
|
14
|
+
resolveRole: (roleId: string) => Awaitable<Role | null>;
|
|
15
|
+
resolveInvite: (code: string) => Awaitable<TranscriptInviteData | null>;
|
|
16
|
+
};
|
|
17
|
+
assets: ResolvedTranscriptAssetOptions;
|
|
18
|
+
features: ResolvedTranscriptFeatureOptions;
|
|
19
|
+
poweredBy?: boolean;
|
|
20
|
+
footerText?: string;
|
|
21
|
+
favicon: 'guild' | string;
|
|
22
|
+
hydrate: boolean;
|
|
23
|
+
};
|
|
24
|
+
export default function render({ messages, channel, callbacks, ...options }: RenderMessageContext): Promise<string>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _a;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.default = render;
|
|
19
|
+
const static_1 = require("react-dom/static");
|
|
20
|
+
const react_1 = __importDefault(require("react"));
|
|
21
|
+
const buildProfiles_1 = require("../utils/buildProfiles");
|
|
22
|
+
const client_1 = require("../static/client");
|
|
23
|
+
const fs_1 = require("fs");
|
|
24
|
+
const path_1 = __importDefault(require("path"));
|
|
25
|
+
const hydrate_1 = require("@derockdev/discord-components-core/hydrate");
|
|
26
|
+
const transcript_1 = __importDefault(require("./transcript"));
|
|
27
|
+
const utils_1 = require("../utils/utils");
|
|
28
|
+
// read the package.json file and get the @derockdev/discord-components-core version
|
|
29
|
+
let discordComponentsVersion = '^3.6.1';
|
|
30
|
+
try {
|
|
31
|
+
const packagePath = path_1.default.join(__dirname, '..', '..', 'package.json');
|
|
32
|
+
const packageJSON = JSON.parse((0, fs_1.readFileSync)(packagePath, 'utf8'));
|
|
33
|
+
discordComponentsVersion = (_a = packageJSON.dependencies['@derockdev/discord-components-core']) !== null && _a !== void 0 ? _a : discordComponentsVersion;
|
|
34
|
+
// eslint-disable-next-line no-empty
|
|
35
|
+
}
|
|
36
|
+
catch (_b) { } // ignore errors
|
|
37
|
+
async function resolveOptionalAssetUrl(resolveTranscriptAssetUrl, asset) {
|
|
38
|
+
var _a;
|
|
39
|
+
if (!(asset === null || asset === void 0 ? void 0 : asset.url)) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return (_a = (await resolveTranscriptAssetUrl(asset))) !== null && _a !== void 0 ? _a : asset.url;
|
|
43
|
+
}
|
|
44
|
+
async function resolveProfiles(profiles, resolveTranscriptAssetUrl) {
|
|
45
|
+
const entries = await Promise.all(Object.entries(profiles).map(async ([id, profile]) => {
|
|
46
|
+
var _a, _b, _c;
|
|
47
|
+
return [
|
|
48
|
+
id,
|
|
49
|
+
Object.assign(Object.assign({}, profile), { avatar: await resolveOptionalAssetUrl(resolveTranscriptAssetUrl, {
|
|
50
|
+
kind: 'avatar',
|
|
51
|
+
url: (_a = profile.avatar) !== null && _a !== void 0 ? _a : '',
|
|
52
|
+
}), roleIcon: await resolveOptionalAssetUrl(resolveTranscriptAssetUrl, {
|
|
53
|
+
kind: 'role-icon',
|
|
54
|
+
url: (_b = profile.roleIcon) !== null && _b !== void 0 ? _b : '',
|
|
55
|
+
}), serverTagBadge: await resolveOptionalAssetUrl(resolveTranscriptAssetUrl, {
|
|
56
|
+
kind: 'server-tag-badge',
|
|
57
|
+
url: (_c = profile.serverTagBadge) !== null && _c !== void 0 ? _c : '',
|
|
58
|
+
}) }),
|
|
59
|
+
];
|
|
60
|
+
}));
|
|
61
|
+
return Object.fromEntries(entries);
|
|
62
|
+
}
|
|
63
|
+
async function render(_a) {
|
|
64
|
+
var _b;
|
|
65
|
+
var { messages, channel, callbacks } = _a, options = __rest(_a, ["messages", "channel", "callbacks"]);
|
|
66
|
+
const rawProfiles = await (0, buildProfiles_1.buildProfiles)(messages);
|
|
67
|
+
const profiles = await resolveProfiles(rawProfiles, callbacks.resolveTranscriptAssetUrl);
|
|
68
|
+
const guildIcon = channel.isDMBased() || options.guildIcon
|
|
69
|
+
? options.guildIcon
|
|
70
|
+
: await resolveOptionalAssetUrl(callbacks.resolveTranscriptAssetUrl, {
|
|
71
|
+
kind: 'guild-icon',
|
|
72
|
+
url: (_b = channel.guild.iconURL({ size: 128, extension: 'png' })) !== null && _b !== void 0 ? _b : '',
|
|
73
|
+
});
|
|
74
|
+
const { prelude } = await (0, static_1.prerenderToNodeStream)(react_1.default.createElement("html", null,
|
|
75
|
+
react_1.default.createElement("head", null,
|
|
76
|
+
react_1.default.createElement("meta", { charSet: "utf-8" }),
|
|
77
|
+
react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }),
|
|
78
|
+
react_1.default.createElement("link", { rel: "icon", type: "image/png", href: options.favicon === 'guild' ? guildIcon : options.favicon }),
|
|
79
|
+
react_1.default.createElement("title", null, channel.isDMBased() ? 'Direct Messages' : channel.name),
|
|
80
|
+
options.features.messageLinks && (react_1.default.createElement("script", { dangerouslySetInnerHTML: {
|
|
81
|
+
__html: client_1.scrollToMessage,
|
|
82
|
+
} })),
|
|
83
|
+
react_1.default.createElement("script", { dangerouslySetInnerHTML: {
|
|
84
|
+
__html: `(window.$discordMessage=window.$discordMessage||{}).profiles=${JSON.stringify(profiles)};`,
|
|
85
|
+
} }),
|
|
86
|
+
!options.hydrate && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
87
|
+
react_1.default.createElement("script", { type: "module", src: `https://cdn.jsdelivr.net/npm/@derockdev/discord-components-core@${discordComponentsVersion}/dist/derockdev-discord-components-core/derockdev-discord-components-core.esm.js` })))),
|
|
88
|
+
react_1.default.createElement("body", { style: {
|
|
89
|
+
margin: 0,
|
|
90
|
+
minHeight: '100vh',
|
|
91
|
+
backgroundColor: '#070709',
|
|
92
|
+
}, "data-transcript-image-preview": options.features.imagePreview ? 'true' : undefined },
|
|
93
|
+
react_1.default.createElement(transcript_1.default, Object.assign({ messages: messages, channel: channel, callbacks: callbacks, guildIcon: guildIcon }, options))),
|
|
94
|
+
options.features.spoilerReveal && react_1.default.createElement("script", { dangerouslySetInnerHTML: { __html: client_1.revealSpoiler } }),
|
|
95
|
+
options.features.profileBadges && react_1.default.createElement("script", { dangerouslySetInnerHTML: { __html: client_1.applyServerTags } }),
|
|
96
|
+
options.features.imagePreview && react_1.default.createElement("script", { dangerouslySetInnerHTML: { __html: client_1.enableImagePreview } }),
|
|
97
|
+
options.features.search && react_1.default.createElement("script", { dangerouslySetInnerHTML: { __html: client_1.enableMessageSearch } }),
|
|
98
|
+
options.features.embedTweaks && react_1.default.createElement("script", { dangerouslySetInnerHTML: { __html: client_1.fixEmbedBorders } })));
|
|
99
|
+
const markup = await (0, utils_1.streamToString)(prelude);
|
|
100
|
+
if (options.hydrate) {
|
|
101
|
+
const result = await (0, hydrate_1.renderToString)(markup, {
|
|
102
|
+
beforeHydrate: async (document) => {
|
|
103
|
+
document.defaultView.$discordMessage = {
|
|
104
|
+
profiles,
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
return result.html;
|
|
109
|
+
}
|
|
110
|
+
return markup;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA6FA,yBA8FC;AA1LD,6CAAyD;AACzD,kDAA0B;AAC1B,0DAAuD;AAEvD,6CAO0B;AAC1B,2BAAkC;AAClC,gDAAwB;AACxB,wEAA4E;AAC5E,8DAA2C;AAG3C,0CAAgD;AAEhD,oFAAoF;AACpF,IAAI,wBAAwB,GAAG,QAAQ,CAAC;AAExC,IAAI,CAAC;IACH,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,wBAAwB,GAAG,MAAA,WAAW,CAAC,YAAY,CAAC,oCAAoC,CAAC,mCAAI,wBAAwB,CAAC;IACtH,oCAAoC;AACtC,CAAC;AAAC,WAAM,CAAC,CAAA,CAAC,CAAC,gBAAgB;AAyB3B,KAAK,UAAU,uBAAuB,CACpC,yBAAyF,EACzF,KAAkC;;IAElC,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,GAAG,CAAA,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAA,CAAC,MAAM,yBAAyB,CAAC,KAAK,CAAC,CAAC,mCAAI,KAAK,CAAC,GAAG,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAiC,EACjC,yBAAyF;IAEzF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;;QAAC,OAAA;YACpD,EAAE;YACF,gCACK,OAAO,KACV,MAAM,EAAE,MAAM,uBAAuB,CAAC,yBAAyB,EAAE;oBAC/D,IAAI,EAAE,QAAQ;oBACd,GAAG,EAAE,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE;iBAC1B,CAAC,EACF,QAAQ,EAAE,MAAM,uBAAuB,CAAC,yBAAyB,EAAE;oBACjE,IAAI,EAAE,WAAW;oBACjB,GAAG,EAAE,MAAA,OAAO,CAAC,QAAQ,mCAAI,EAAE;iBAC5B,CAAC,EACF,cAAc,EAAE,MAAM,uBAAuB,CAAC,yBAAyB,EAAE;oBACvE,IAAI,EAAE,kBAAkB;oBACxB,GAAG,EAAE,MAAA,OAAO,CAAC,cAAc,mCAAI,EAAE;iBAClC,CAAC,GACe;SACpB,CAAA;KAAA,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAEc,KAAK,UAAU,MAAM,CAAC,EAAkE;;QAAlE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,OAAoC,EAA/B,OAAO,cAA1C,oCAA4C,CAAF;IAC7E,MAAM,WAAW,GAAG,MAAM,IAAA,6BAAa,EAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACzF,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,EAAE,IAAI,OAAO,CAAC,SAAS;QACtC,CAAC,CAAC,OAAO,CAAC,SAAS;QACnB,CAAC,CAAC,MAAM,uBAAuB,CAAC,SAAS,CAAC,yBAAyB,EAAE;YACjE,IAAI,EAAE,YAAY;YAClB,GAAG,EAAE,MAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,mCAAI,EAAE;SAClE,CAAC,CAAC;IAET,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,8BAAqB,EAC7C;QACE;YACE,wCAAM,OAAO,EAAC,OAAO,GAAG;YACxB,wCAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,qCAAqC,GAAG;YAGtE,wCAAM,GAAG,EAAC,MAAM,EAAC,IAAI,EAAC,WAAW,EAAC,IAAI,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAAI;YAGrG,6CAAQ,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAS;YAGtE,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,CAChC,0CACE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,wBAAe;iBACxB,GACD,CACH;YAGD,0CACE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,gEAAgE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;iBACpG,GACO;YAET,CAAC,OAAO,CAAC,OAAO,IAAI,CACnB;gBAEE,0CACE,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,mEAAmE,wBAAwB,kFAAkF,GAC1K,CACT,CACJ,CACI;QAEP,wCACE,KAAK,EAAE;gBACL,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,OAAO;gBAClB,eAAe,EAAE,SAAS;aAC3B,mCAC8B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAEjF,8BAAC,oBAAe,kBACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,IAChB,OAAO,EACX,CACG;QAEN,OAAO,CAAC,QAAQ,CAAC,aAAa,IAAI,0CAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,sBAAa,EAAE,GAAW;QAEvG,OAAO,CAAC,QAAQ,CAAC,aAAa,IAAI,0CAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,wBAAe,EAAE,GAAW;QAEzG,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,0CAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,2BAAkB,EAAE,GAAW;QAE3G,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,0CAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,4BAAmB,EAAE,GAAW;QAEtG,OAAO,CAAC,QAAQ,CAAC,WAAW,IAAI,0CAAQ,uBAAuB,EAAE,EAAE,MAAM,EAAE,wBAAe,EAAE,GAAW,CACnG,CACR,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,EAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAc,EAAC,MAAM,EAAE;YAC1C,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAChC,QAAQ,CAAC,WAAW,CAAC,eAAe,GAAG;oBACrC,QAAQ;iBACT,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Attachment as AttachmentType, Message } from 'discord.js';
|
|
3
|
+
import type { RenderMessageContext } from '..';
|
|
4
|
+
/**
|
|
5
|
+
* Renders all attachments for a message
|
|
6
|
+
* @param message
|
|
7
|
+
* @param context
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
export declare function Attachments(props: {
|
|
11
|
+
message: Message;
|
|
12
|
+
context: RenderMessageContext;
|
|
13
|
+
inline?: boolean;
|
|
14
|
+
}): Promise<React.JSX.Element>;
|
|
15
|
+
/**
|
|
16
|
+
* Renders one Discord Attachment
|
|
17
|
+
* @param props - the attachment and rendering context
|
|
18
|
+
*/
|
|
19
|
+
export declare function Attachment({ attachment, context, message, }: {
|
|
20
|
+
attachment: AttachmentType;
|
|
21
|
+
context: RenderMessageContext;
|
|
22
|
+
message: Message;
|
|
23
|
+
}): Promise<React.JSX.Element>;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.Attachments = Attachments;
|
|
40
|
+
exports.Attachment = Attachment;
|
|
41
|
+
const discord_components_react_1 = require("@derockdev/discord-components-react");
|
|
42
|
+
const react_1 = __importDefault(require("react"));
|
|
43
|
+
const utils_1 = require("../../utils/utils");
|
|
44
|
+
const Attachment_Gallery_1 = __importDefault(require("./components/Attachment Gallery"));
|
|
45
|
+
/**
|
|
46
|
+
* Renders all attachments for a message
|
|
47
|
+
* @param message
|
|
48
|
+
* @param context
|
|
49
|
+
* @returns
|
|
50
|
+
*/
|
|
51
|
+
async function Attachments(props) {
|
|
52
|
+
if (props.message.attachments.size === 0)
|
|
53
|
+
return react_1.default.createElement(react_1.default.Fragment, null);
|
|
54
|
+
const attachments = Array.from(props.message.attachments.values());
|
|
55
|
+
const isImageCollection = attachments.length > 1 &&
|
|
56
|
+
attachments.every((attachment) => !isVoiceMessage(attachment, props.message) && getAttachmentType(attachment) === 'image');
|
|
57
|
+
if (isImageCollection) {
|
|
58
|
+
const images = await Promise.all(attachments.map(async (attachment) => {
|
|
59
|
+
var _a;
|
|
60
|
+
return ({
|
|
61
|
+
id: attachment.id,
|
|
62
|
+
url: await resolveAttachmentUrl(attachment, props.message, props.context),
|
|
63
|
+
alt: (_a = attachment.name) !== null && _a !== void 0 ? _a : undefined,
|
|
64
|
+
});
|
|
65
|
+
}));
|
|
66
|
+
return (react_1.default.createElement(discord_components_react_1.DiscordAttachments, Object.assign({}, (props.inline ? {} : { slot: 'attachments' })),
|
|
67
|
+
react_1.default.createElement(Attachment_Gallery_1.default, { items: images })));
|
|
68
|
+
}
|
|
69
|
+
return (react_1.default.createElement(discord_components_react_1.DiscordAttachments, Object.assign({}, (props.inline ? {} : { slot: 'attachments' })), attachments.map((attachment, id) => (react_1.default.createElement(Attachment, { attachment: attachment, message: props.message, context: props.context, key: id })))));
|
|
70
|
+
}
|
|
71
|
+
// "audio" | "video" | "image" | "file"
|
|
72
|
+
function getAttachmentType(attachment) {
|
|
73
|
+
var _a, _b, _c;
|
|
74
|
+
const type = (_c = (_b = (_a = attachment.contentType) === null || _a === void 0 ? void 0 : _a.split('/')) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : 'unknown';
|
|
75
|
+
if (['audio', 'video', 'image'].includes(type))
|
|
76
|
+
return type;
|
|
77
|
+
return 'file';
|
|
78
|
+
}
|
|
79
|
+
function getAttachmentAssetKind(type) {
|
|
80
|
+
switch (type) {
|
|
81
|
+
case 'image':
|
|
82
|
+
return 'attachment-image';
|
|
83
|
+
case 'video':
|
|
84
|
+
return 'attachment-video';
|
|
85
|
+
case 'audio':
|
|
86
|
+
return 'attachment-audio';
|
|
87
|
+
default:
|
|
88
|
+
return 'attachment-file';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function isVoiceMessage(attachment, message) {
|
|
92
|
+
if (message.flags && (message.flags.bitfield & 8192) === 8192)
|
|
93
|
+
return true;
|
|
94
|
+
if (attachment.waveform && attachment.duration)
|
|
95
|
+
return true;
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
async function resolveAttachmentUrl(attachment, message, context) {
|
|
99
|
+
var _a;
|
|
100
|
+
const type = getAttachmentType(attachment);
|
|
101
|
+
const attachmentJson = attachment.toJSON();
|
|
102
|
+
const messageJson = message.toJSON();
|
|
103
|
+
if (type === 'image' && context.callbacks.resolveImageSrc) {
|
|
104
|
+
const downloaded = await context.callbacks.resolveImageSrc(attachmentJson, messageJson);
|
|
105
|
+
if (typeof downloaded === 'string') {
|
|
106
|
+
return downloaded;
|
|
107
|
+
}
|
|
108
|
+
if (downloaded === null) {
|
|
109
|
+
return attachment.url;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return ((_a = (await context.callbacks.resolveTranscriptAssetUrl({
|
|
113
|
+
kind: getAttachmentAssetKind(type),
|
|
114
|
+
url: attachment.url,
|
|
115
|
+
contentType: attachment.contentType,
|
|
116
|
+
filename: attachment.name,
|
|
117
|
+
size: attachment.size,
|
|
118
|
+
width: attachment.width,
|
|
119
|
+
height: attachment.height,
|
|
120
|
+
attachment: attachmentJson,
|
|
121
|
+
message: messageJson,
|
|
122
|
+
}))) !== null && _a !== void 0 ? _a : attachment.url);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Renders one Discord Attachment
|
|
126
|
+
* @param props - the attachment and rendering context
|
|
127
|
+
*/
|
|
128
|
+
async function Attachment({ attachment, context, message, }) {
|
|
129
|
+
let url = await resolveAttachmentUrl(attachment, message, context);
|
|
130
|
+
const name = attachment.name;
|
|
131
|
+
const width = attachment.width;
|
|
132
|
+
const height = attachment.height;
|
|
133
|
+
// Voice messages must be checked before getAttachmentType since voice .ogg files would otherwise be "audio"
|
|
134
|
+
if (isVoiceMessage(attachment, message)) {
|
|
135
|
+
const DiscordVoiceMessage = (await Promise.resolve().then(() => __importStar(require('./components/voice')))).default;
|
|
136
|
+
return react_1.default.createElement(DiscordVoiceMessage, { attachment: attachment });
|
|
137
|
+
}
|
|
138
|
+
const type = getAttachmentType(attachment);
|
|
139
|
+
if (type === 'file') {
|
|
140
|
+
return (react_1.default.createElement("div", { className: "discord-custom-file-base", slot: "attachment" },
|
|
141
|
+
react_1.default.createElement("div", { className: "discord-custom-file-icon" },
|
|
142
|
+
react_1.default.createElement("svg", { width: "30", height: "40", viewBox: "0 0 30 40", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
143
|
+
react_1.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M18 0H4C1.79086 0 0 1.79086 0 4V36C0 38.2091 1.79086 40 4 40H26C28.2091 40 30 38.2091 30 36V12L18 0Z", fill: "#C9CDD3" }),
|
|
144
|
+
react_1.default.createElement("path", { d: "M18 0L30 12H18V0Z", fill: "#88919E" }))),
|
|
145
|
+
react_1.default.createElement("div", { className: "discord-custom-file-inner" },
|
|
146
|
+
react_1.default.createElement("a", { className: "discord-custom-file-name", href: url, target: "_blank", rel: "noopener noreferrer" }, name !== null && name !== void 0 ? name : 'file'),
|
|
147
|
+
react_1.default.createElement("div", { className: "discord-custom-file-size" }, (0, utils_1.formatBytes)(attachment.size))),
|
|
148
|
+
react_1.default.createElement("a", { className: "discord-custom-file-download", href: url, download: true },
|
|
149
|
+
react_1.default.createElement("svg", { viewBox: "0 0 24 24", width: "24", height: "24", fill: "currentColor" },
|
|
150
|
+
react_1.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M16.293 9.29289C16.6835 8.90237 17.3167 8.90237 17.7072 9.29289C18.0977 9.68342 18.0977 10.3166 17.7072 10.7071L12.7072 15.7071C12.3167 16.0976 11.6835 16.0976 11.293 15.7071L6.29297 10.7071C5.90244 10.3166 5.90244 9.68342 6.29297 9.29289C6.68349 8.90237 7.31666 8.90237 7.70718 9.29289L11.0001 12.5858V2C11.0001 1.44772 11.4478 1 12.0001 1C12.5524 1 13.0001 1.44772 13.0001 2V12.5858L16.293 9.29289ZM3 19C2.44772 19 2 19.4477 2 20C2 20.5523 2.44772 21 3 21H21C21.5523 21 22 20.5523 22 20C22 19.4477 21.5523 19 21 19H3Z" })))));
|
|
151
|
+
}
|
|
152
|
+
return (react_1.default.createElement(discord_components_react_1.DiscordAttachment, { type: type, size: (0, utils_1.formatBytes)(attachment.size), key: attachment.id, slot: "attachment", url: url, alt: name !== null && name !== void 0 ? name : undefined, width: width !== null && width !== void 0 ? width : undefined, height: height !== null && height !== void 0 ? height : undefined }));
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=attachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../../src/generator/renderers/attachment.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = DiscordAttachmentGallery;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
function DiscordAttachmentGallery({ items }) {
|
|
10
|
+
if (items.length === 0) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const imagesToShow = items.slice(0, 10);
|
|
14
|
+
const hasMore = items.length > imagesToShow.length;
|
|
15
|
+
const visibleCount = imagesToShow.length;
|
|
16
|
+
const layout = Object.assign(Object.assign({}, (0, utils_1.getGalleryLayout)(visibleCount)), { gap: '2px', maxWidth: '610px' });
|
|
17
|
+
return (react_1.default.createElement("div", { className: "discord-attachment-gallery", style: layout, slot: "attachment" }, imagesToShow.map((item, idx) => {
|
|
18
|
+
var _a;
|
|
19
|
+
return (react_1.default.createElement("div", { key: item.id, className: "discord-attachment-gallery-item", style: (0, utils_1.getImageStyle)(idx, visibleCount) },
|
|
20
|
+
react_1.default.createElement("img", { src: item.url, alt: (_a = item.alt) !== null && _a !== void 0 ? _a : 'Image attachment', className: "discord-attachment-gallery-image", loading: "lazy", decoding: "async" }),
|
|
21
|
+
hasMore && idx === imagesToShow.length - 1 && (react_1.default.createElement("div", { className: "discord-attachment-gallery-more" },
|
|
22
|
+
"+",
|
|
23
|
+
items.length - imagesToShow.length))));
|
|
24
|
+
})));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Attachment%20Gallery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Attachment Gallery.js","sourceRoot":"","sources":["../../../../src/generator/renderers/components/Attachment Gallery.tsx"],"names":[],"mappings":";;;;;AASA,2CAgCC;AAzCD,kDAA0B;AAC1B,mCAA0D;AAQ1D,SAAwB,wBAAwB,CAAC,EAAE,KAAK,EAAsC;IAC5F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IACnD,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;IACzC,MAAM,MAAM,mCACP,IAAA,wBAAgB,EAAC,YAAY,CAAC,KACjC,GAAG,EAAE,KAAK,EACV,QAAQ,EAAE,OAAO,GAClB,CAAC;IAEF,OAAO,CACL,uCAAK,SAAS,EAAC,4BAA4B,EAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAC,YAAY,IACzE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;;QAAC,OAAA,CAC/B,uCAAK,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAC,iCAAiC,EAAC,KAAK,EAAE,IAAA,qBAAa,EAAC,GAAG,EAAE,YAAY,CAAC;YACpG,uCACE,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,GAAG,EAAE,MAAA,IAAI,CAAC,GAAG,mCAAI,kBAAkB,EACnC,SAAS,EAAC,kCAAkC,EAC5C,OAAO,EAAC,MAAM,EACd,QAAQ,EAAC,OAAO,GAChB;YACD,OAAO,IAAI,GAAG,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAC7C,uCAAK,SAAS,EAAC,iCAAiC;;gBAAG,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAO,CAC7F,CACG,CACP,CAAA;KAAA,CAAC,CACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface DiscordButtonProps {
|
|
3
|
+
type: string;
|
|
4
|
+
url?: string;
|
|
5
|
+
emoji?: string;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export declare function DiscordButton({ type, url, emoji, children }: DiscordButtonProps): React.JSX.Element;
|
|
9
|
+
export default DiscordButton;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DiscordButton = DiscordButton;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
function DiscordButton({ type, url, emoji, children }) {
|
|
9
|
+
const content = (react_1.default.createElement(react_1.default.Fragment, null,
|
|
10
|
+
react_1.default.createElement("span", { className: "discord-button-content" },
|
|
11
|
+
emoji && react_1.default.createElement("img", { src: emoji, alt: "", className: "discord-button-emoji", draggable: false }),
|
|
12
|
+
react_1.default.createElement("span", { className: "discord-button-label" }, children)),
|
|
13
|
+
url && (react_1.default.createElement("span", { className: "discord-button-launch", "aria-hidden": "true" },
|
|
14
|
+
react_1.default.createElement("svg", { role: "img", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "none", viewBox: "0 0 24 24" },
|
|
15
|
+
react_1.default.createElement("path", { fill: "currentColor", d: "M15 2a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0V4.41l-4.3 4.3a1 1 0 1 1-1.4-1.42L19.58 3H16a1 1 0 0 1-1-1Z" }),
|
|
16
|
+
react_1.default.createElement("path", { fill: "currentColor", d: "M5 2a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-6a1 1 0 1 0-2 0v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h6a1 1 0 1 0 0-2H5Z" }))))));
|
|
17
|
+
if (!url) {
|
|
18
|
+
return react_1.default.createElement("span", { className: `discord-button discord-button-${type}` }, content);
|
|
19
|
+
}
|
|
20
|
+
return (react_1.default.createElement("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: `discord-button discord-button-${type}` }, content));
|
|
21
|
+
}
|
|
22
|
+
exports.default = DiscordButton;
|
|
23
|
+
//# sourceMappingURL=Button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../../src/generator/renderers/components/Button.tsx"],"names":[],"mappings":";;;;;AASA,sCAiCC;AA1CD,kDAA0B;AAS1B,SAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAsB;IAC9E,MAAM,OAAO,GAAG,CACd;QACE,wCAAM,SAAS,EAAC,wBAAwB;YACrC,KAAK,IAAI,uCAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,EAAE,EAAC,SAAS,EAAC,sBAAsB,EAAC,SAAS,EAAE,KAAK,GAAI;YACvF,wCAAM,SAAS,EAAC,sBAAsB,IAAE,QAAQ,CAAQ,CACnD;QACN,GAAG,IAAI,CACN,wCAAM,SAAS,EAAC,uBAAuB,iBAAa,MAAM;YACxD,uCAAK,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,4BAA4B,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW;gBACvG,wCACE,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,gHAAgH,GAClH;gBACF,wCACE,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,0IAA0I,GAC5I,CACE,CACD,CACR,CACA,CACJ,CAAC;IAEF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,wCAAM,SAAS,EAAE,iCAAiC,IAAI,EAAE,IAAG,OAAO,CAAQ,CAAC;IACpF,CAAC;IAED,OAAO,CACL,qCAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAE,iCAAiC,IAAI,EAAE,IACvG,OAAO,CACN,CACL,CAAC;AACJ,CAAC;AAED,kBAAe,aAAa,CAAC"}
|