oceanic-transcripts 1.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.
Files changed (51) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +114 -0
  3. package/dist/generator/index.d.ts +16 -0
  4. package/dist/generator/index.js +82 -0
  5. package/dist/generator/index.js.map +1 -0
  6. package/dist/generator/renderers/attachment.d.ts +21 -0
  7. package/dist/generator/renderers/attachment.js +49 -0
  8. package/dist/generator/renderers/attachment.js.map +1 -0
  9. package/dist/generator/renderers/components.d.ts +11 -0
  10. package/dist/generator/renderers/components.js +28 -0
  11. package/dist/generator/renderers/components.js.map +1 -0
  12. package/dist/generator/renderers/content.d.ts +32 -0
  13. package/dist/generator/renderers/content.js +153 -0
  14. package/dist/generator/renderers/content.js.map +1 -0
  15. package/dist/generator/renderers/embed.d.ts +12 -0
  16. package/dist/generator/renderers/embed.js +43 -0
  17. package/dist/generator/renderers/embed.js.map +1 -0
  18. package/dist/generator/renderers/message.d.ts +7 -0
  19. package/dist/generator/renderers/message.js +65 -0
  20. package/dist/generator/renderers/message.js.map +1 -0
  21. package/dist/generator/renderers/reply.d.ts +7 -0
  22. package/dist/generator/renderers/reply.js +54 -0
  23. package/dist/generator/renderers/reply.js.map +1 -0
  24. package/dist/generator/renderers/systemMessage.d.ts +14 -0
  25. package/dist/generator/renderers/systemMessage.js +103 -0
  26. package/dist/generator/renderers/systemMessage.js.map +1 -0
  27. package/dist/generator/transcript.d.ts +10 -0
  28. package/dist/generator/transcript.js +75 -0
  29. package/dist/generator/transcript.js.map +1 -0
  30. package/dist/index.d.ts +25 -0
  31. package/dist/index.js +120 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/static/client.d.ts +2 -0
  34. package/dist/static/client.js +30 -0
  35. package/dist/static/client.js.map +1 -0
  36. package/dist/types.d.ts +63 -0
  37. package/dist/types.js +10 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils/buildProfiles.d.ts +11 -0
  40. package/dist/utils/buildProfiles.js +47 -0
  41. package/dist/utils/buildProfiles.js.map +1 -0
  42. package/dist/utils/embeds.d.ts +2 -0
  43. package/dist/utils/embeds.js +17 -0
  44. package/dist/utils/embeds.js.map +1 -0
  45. package/dist/utils/extend.d.ts +8 -0
  46. package/dist/utils/extend.js +8 -0
  47. package/dist/utils/extend.js.map +1 -0
  48. package/dist/utils/utils.d.ts +10 -0
  49. package/dist/utils/utils.js +63 -0
  50. package/dist/utils/utils.js.map +1 -0
  51. package/package.json +77 -0
@@ -0,0 +1,25 @@
1
+ import type { AnyTextableChannel, TextableChannel } from 'oceanic.js';
2
+ import { Collection, type Message } from 'oceanic.js';
3
+ import { ExportReturnType, type CreateTranscriptOptions, type GenerateFromMessagesOptions, type ObjectType } from './types';
4
+ export { default as DiscordMessages } from './generator/transcript';
5
+ /**
6
+ *
7
+ * @param messages The messages to generate a transcript from
8
+ * @param channel The channel the messages are from (used for header and guild name)
9
+ * @param options The options to use when generating the transcript
10
+ * @returns The generated transcript
11
+ */
12
+ export declare function generateFromMessages<T extends ExportReturnType = ExportReturnType.Attachment>(messages: Message[] | Collection<string, Message>, channel: TextableChannel | AnyTextableChannel, options?: GenerateFromMessagesOptions<T>): Promise<ObjectType<T>>;
13
+ /**
14
+ *
15
+ * @param channel The channel to create a transcript from
16
+ * @param options The options to use when creating the transcript
17
+ * @returns The generated transcript
18
+ */
19
+ export declare function createTranscript<T extends ExportReturnType = ExportReturnType.Attachment>(channel: TextableChannel | AnyTextableChannel, options?: CreateTranscriptOptions<T>): Promise<ObjectType<T>>;
20
+ declare const _default: {
21
+ createTranscript: typeof createTranscript;
22
+ generateFromMessages: typeof generateFromMessages;
23
+ };
24
+ export default _default;
25
+ export * from './types';
package/dist/index.js ADDED
@@ -0,0 +1,120 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.DiscordMessages = void 0;
21
+ exports.generateFromMessages = generateFromMessages;
22
+ exports.createTranscript = createTranscript;
23
+ const oceanic_js_1 = require("oceanic.js");
24
+ const generator_1 = __importDefault(require("./generator"));
25
+ const types_1 = require("./types");
26
+ // re-export component for custom rendering
27
+ var transcript_1 = require("./generator/transcript");
28
+ Object.defineProperty(exports, "DiscordMessages", { enumerable: true, get: function () { return __importDefault(transcript_1).default; } });
29
+ /**
30
+ *
31
+ * @param messages The messages to generate a transcript from
32
+ * @param channel The channel the messages are from (used for header and guild name)
33
+ * @param options The options to use when generating the transcript
34
+ * @returns The generated transcript
35
+ */
36
+ async function generateFromMessages(messages, channel, options = {}) {
37
+ var _a, _b, _c, _d, _e, _f, _g;
38
+ // turn messages into an array
39
+ const transformedMessages = messages instanceof oceanic_js_1.Collection ? Array.from(messages.values()) : messages;
40
+ // const startTime = process.hrtime();
41
+ // render the messages
42
+ const html = await (0, generator_1.default)({
43
+ messages: transformedMessages,
44
+ channel,
45
+ saveImages: (_a = options.saveImages) !== null && _a !== void 0 ? _a : false,
46
+ callbacks: Object.assign({ resolveChannel: async (id) => channel.client.rest.channels.get(id).catch(() => null), resolveUser: async (id) => channel.client.rest.users.get(id).catch(() => null), resolveRole: channel.type === oceanic_js_1.ChannelTypes.DM ? async () => null : async (id) => { var _a, _b; return (_b = (_a = channel.guild) === null || _a === void 0 ? void 0 : _a.roles.get(id)) !== null && _b !== void 0 ? _b : null; } }, ((_b = options.callbacks) !== null && _b !== void 0 ? _b : {})),
47
+ poweredBy: (_c = options.poweredBy) !== null && _c !== void 0 ? _c : true,
48
+ footerText: (_d = options.footerText) !== null && _d !== void 0 ? _d : 'Exported {number} message{s}.',
49
+ favicon: (_e = options.favicon) !== null && _e !== void 0 ? _e : 'guild',
50
+ hydrate: (_f = options.hydrate) !== null && _f !== void 0 ? _f : false,
51
+ });
52
+ // get the time it took to render the messages
53
+ // const renderTime = process.hrtime(startTime);
54
+ // console.log(
55
+ // `[discord-html-transcripts] Rendered ${transformedMessages.length} messages in ${renderTime[0]}s ${
56
+ // renderTime[1] / 1000000
57
+ // }ms`
58
+ // );
59
+ // return the html in the specified format
60
+ if (options.returnType === types_1.ExportReturnType.Buffer) {
61
+ return Buffer.from(html);
62
+ }
63
+ if (options.returnType === types_1.ExportReturnType.String) {
64
+ return html;
65
+ }
66
+ return {
67
+ contents: Buffer.from(html),
68
+ name: (_g = options.filename) !== null && _g !== void 0 ? _g : `transcript-${channel.id}.html`,
69
+ };
70
+ }
71
+ /**
72
+ *
73
+ * @param channel The channel to create a transcript from
74
+ * @param options The options to use when creating the transcript
75
+ * @returns The generated transcript
76
+ */
77
+ async function createTranscript(channel, options = {}) {
78
+ var _a, _b, _c, _d, _e, _f, _g;
79
+ // validate type
80
+ if (!oceanic_js_1.TextableChannelTypes[channel.type]) {
81
+ throw new TypeError(`Provided channel must be text-based, received ${channel.type}`);
82
+ }
83
+ // fetch messages
84
+ let allMessages = [];
85
+ let lastMessageId;
86
+ const { limit, filter } = options;
87
+ const resolvedLimit = typeof limit === 'undefined' || limit === -1 ? Infinity : limit;
88
+ // until there are no more messages, keep fetching
89
+ // eslint-disable-next-line no-constant-condition
90
+ while (true) {
91
+ // create fetch options
92
+ const fetchLimitOptions = { limit: 100, before: lastMessageId };
93
+ if (!lastMessageId)
94
+ delete fetchLimitOptions.before;
95
+ // fetch messages
96
+ const messages = await channel.getMessages(fetchLimitOptions);
97
+ const filteredMessages = typeof filter === 'function' ? messages.filter(filter) : messages;
98
+ // add the messages to the array
99
+ allMessages.push(...filteredMessages.values());
100
+ // Get the last key of 'messages', not 'filteredMessages' because you will be refetching the same messages
101
+ lastMessageId =
102
+ (_f = (_d = (_b = (_a = messages[messages.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : (_c = filteredMessages[filteredMessages.length - 1]) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : (_e = messages.values().next().value) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : (_g = filteredMessages.values().next().value) === null || _g === void 0 ? void 0 : _g.id;
103
+ // if there are no more messages, break
104
+ if (messages.length < 100)
105
+ break;
106
+ // if the limit has been reached, break
107
+ if (allMessages.length >= resolvedLimit)
108
+ break;
109
+ }
110
+ if (resolvedLimit < allMessages.length)
111
+ allMessages = allMessages.slice(0, limit);
112
+ // generate the transcript
113
+ return generateFromMessages(allMessages.reverse(), channel, options);
114
+ }
115
+ exports.default = {
116
+ createTranscript,
117
+ generateFromMessages,
118
+ };
119
+ __exportStar(require("./types"), exports);
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const scrollToMessage = "document.addEventListener(\"click\",t=>{let e=t.target;if(!e)return;let o=e?.getAttribute(\"data-goto\");if(o){let r=document.getElementById(`m-${o}`);r?(r.scrollIntoView({behavior:\"smooth\",block:\"center\"}),r.style.backgroundColor=\"rgba(148, 156, 247, 0.1)\",r.style.transition=\"background-color 0.5s ease\",setTimeout(()=>{r.style.backgroundColor=\"transparent\"},1e3)):console.warn(\"Message ${goto} not found.\")}});";
2
+ export declare const revealSpoiler = "const s=document.querySelectorAll(\".discord-spoiler\");s.forEach(s=>s.addEventListener(\"click\",()=>{if(s.classList.contains(\"discord-spoiler\")){s.classList.remove(\"discord-spoiler\");s.classList.add(\"discord-spoiler--revealed\");}}));";
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ // TODO: create some sort of build system to compile this file
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.revealSpoiler = exports.scrollToMessage = void 0;
5
+ /*
6
+ // whenever user clicks on element with data-goto attribute, scroll to that message
7
+ document.addEventListener('click', (e) => {
8
+ const target = e.target;
9
+ if(!target) return;
10
+
11
+ const goto = target?.getAttribute('data-goto');
12
+
13
+ if (goto) {
14
+ const message = document.getElementById(`m-\${goto}`);
15
+ if (message) {
16
+ message.scrollIntoView({ behavior: 'smooth', block: 'center' });
17
+ message.style.backgroundColor = 'rgba(148, 156, 247, 0.1)';
18
+ message.style.transition = 'background-color 0.5s ease';
19
+ setTimeout(() => {
20
+ message.style.backgroundColor = 'transparent';
21
+ }, 1000);
22
+ } else {
23
+ console.warn(`Message \${goto} not found.`);
24
+ }
25
+ }
26
+ });
27
+ */
28
+ exports.scrollToMessage = 'document.addEventListener("click",t=>{let e=t.target;if(!e)return;let o=e?.getAttribute("data-goto");if(o){let r=document.getElementById(`m-${o}`);r?(r.scrollIntoView({behavior:"smooth",block:"center"}),r.style.backgroundColor="rgba(148, 156, 247, 0.1)",r.style.transition="background-color 0.5s ease",setTimeout(()=>{r.style.backgroundColor="transparent"},1e3)):console.warn("Message ${goto} not found.")}});';
29
+ exports.revealSpoiler = 'const s=document.querySelectorAll(".discord-spoiler");s.forEach(s=>s.addEventListener("click",()=>{if(s.classList.contains("discord-spoiler")){s.classList.remove("discord-spoiler");s.classList.add("discord-spoiler--revealed");}}));';
30
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/static/client.ts"],"names":[],"mappings":";AAAA,8DAA8D;;;AAE9D;;;;;;;;;;;;;;;;;;;;;;EAsBE;AACW,QAAA,eAAe,GAC1B,2ZAA2Z,CAAC;AAEjZ,QAAA,aAAa,GACxB,yOAAyO,CAAC"}
@@ -0,0 +1,63 @@
1
+ import type { Message, File } from 'oceanic.js';
2
+ import type { RenderMessageContext } from './generator';
3
+ export type AttachmentTypes = 'audio' | 'video' | 'image' | 'file';
4
+ export declare enum ExportReturnType {
5
+ Buffer = "buffer",
6
+ String = "string",
7
+ Attachment = "attachment"
8
+ }
9
+ export type ObjectType<T extends ExportReturnType> = T extends ExportReturnType.Buffer ? Buffer : T extends ExportReturnType.String ? string : File;
10
+ export type GenerateFromMessagesOptions<T extends ExportReturnType> = Partial<{
11
+ /**
12
+ * The type of object to return
13
+ * @default ExportReturnType.ATTACHMENT
14
+ */
15
+ returnType: T;
16
+ /**
17
+ * Downloads images and encodes them as base64 data urls
18
+ * @default false
19
+ */
20
+ saveImages: boolean;
21
+ /**
22
+ * Callbacks for resolving channels, users, and roles
23
+ */
24
+ callbacks: RenderMessageContext['callbacks'];
25
+ /**
26
+ * The name of the file to return if returnType is ExportReturnType.ATTACHMENT
27
+ * @default 'transcript-{channel-id}.html'
28
+ */
29
+ filename: string;
30
+ /**
31
+ * Whether to include the "Powered by discord-html-transcripts" footer
32
+ * @default true
33
+ */
34
+ poweredBy: boolean;
35
+ /**
36
+ * The message right before "Powered by" text. Remember to put the {s}
37
+ * @default 'Exported {number} message{s}.'
38
+ */
39
+ footerText: string;
40
+ /**
41
+ * Whether to show the guild icon or a custom icon as the favicon
42
+ * 'guild' - use the guild icon
43
+ * or pass in a url to use a custom icon
44
+ * @default "guild"
45
+ */
46
+ favicon: 'guild' | string;
47
+ /**
48
+ * Whether to hydrate the html server-side
49
+ * @default false - the returned html will be hydrated client-side
50
+ */
51
+ hydrate: boolean;
52
+ }>;
53
+ export type CreateTranscriptOptions<T extends ExportReturnType> = Partial<GenerateFromMessagesOptions<T> & {
54
+ /**
55
+ * The max amount of messages to fetch. Use `-1` to recursively fetch.
56
+ */
57
+ limit: number;
58
+ /**
59
+ * Filter messages of the channel
60
+ * @default (() => true)
61
+ */
62
+ filter: (message: Message) => boolean;
63
+ }>;
package/dist/types.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExportReturnType = void 0;
4
+ var ExportReturnType;
5
+ (function (ExportReturnType) {
6
+ ExportReturnType["Buffer"] = "buffer";
7
+ ExportReturnType["String"] = "string";
8
+ ExportReturnType["Attachment"] = "attachment";
9
+ })(ExportReturnType || (exports.ExportReturnType = ExportReturnType = {}));
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAKA,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;IACjB,6CAAyB,CAAA;AAC3B,CAAC,EAJW,gBAAgB,gCAAhB,gBAAgB,QAI3B"}
@@ -0,0 +1,11 @@
1
+ import { type Message } from 'oceanic.js';
2
+ export type Profile = {
3
+ author: string;
4
+ avatar?: string;
5
+ roleColor?: string;
6
+ roleIcon?: string;
7
+ roleName?: string;
8
+ bot?: boolean;
9
+ verified?: boolean;
10
+ };
11
+ export declare function buildProfiles(messages: Message[]): Promise<Record<string, Profile>>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProfiles = buildProfiles;
4
+ const oceanic_js_1 = require("oceanic.js");
5
+ async function buildProfiles(messages) {
6
+ const profiles = {};
7
+ // loop through messages
8
+ for (const message of messages) {
9
+ // add all users
10
+ const author = message.author;
11
+ if (!profiles[author.id]) {
12
+ // add profile
13
+ profiles[author.id] = await buildProfile(message.member, author);
14
+ }
15
+ // add interaction users
16
+ if (message.interactionMetadata) {
17
+ const user = message.interactionMetadata.user;
18
+ if (!profiles[user.id]) {
19
+ profiles[user.id] = await buildProfile(null, user);
20
+ }
21
+ }
22
+ // threads
23
+ if (message.thread && message.thread.lastMessage) {
24
+ profiles[message.thread.lastMessage.author.id] = await buildProfile(message.thread.lastMessage.member, message.thread.lastMessage.author);
25
+ }
26
+ }
27
+ // return as a JSON
28
+ return profiles;
29
+ }
30
+ async function buildProfile(member, author) {
31
+ var _a, _b, _c, _d, _e, _f;
32
+ const guild = member === null || member === void 0 ? void 0 : member.guild;
33
+ const roles = await (guild === null || guild === void 0 ? void 0 : guild.getRoles());
34
+ const highestRoleColor = roles === null || roles === void 0 ? void 0 : roles.sort((a, b) => b.position - a.position).find((role) => (member === null || member === void 0 ? void 0 : member.roles.includes(role.id)) && role.color);
35
+ const highestRoleIcon = roles === null || roles === void 0 ? void 0 : roles.sort((a, b) => b.position - a.position).find((role) => (member === null || member === void 0 ? void 0 : member.roles.includes(role.id)) && role.icon);
36
+ const highestRoleName = roles === null || roles === void 0 ? void 0 : roles.sort((a, b) => b.position - a.position).find((role) => (member === null || member === void 0 ? void 0 : member.roles.includes(role.id)) && role.hoist);
37
+ return {
38
+ author: (_b = (_a = member === null || member === void 0 ? void 0 : member.nick) !== null && _a !== void 0 ? _a : author.globalName) !== null && _b !== void 0 ? _b : author.username,
39
+ avatar: (_c = member === null || member === void 0 ? void 0 : member.avatarURL('jpg', 64)) !== null && _c !== void 0 ? _c : author.avatarURL('jpg', 64),
40
+ roleColor: (_d = '#' + (highestRoleColor === null || highestRoleColor === void 0 ? void 0 : highestRoleColor.color.toString(16).padStart(6, '0'))) !== null && _d !== void 0 ? _d : undefined,
41
+ roleIcon: (_e = highestRoleIcon === null || highestRoleIcon === void 0 ? void 0 : highestRoleIcon.icon) !== null && _e !== void 0 ? _e : undefined,
42
+ roleName: (_f = highestRoleName === null || highestRoleName === void 0 ? void 0 : highestRoleName.name) !== null && _f !== void 0 ? _f : undefined,
43
+ bot: author.bot,
44
+ verified: (author.publicFlags & oceanic_js_1.UserFlags.VERIFIED_BOT) !== 0,
45
+ };
46
+ }
47
+ //# sourceMappingURL=buildProfiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildProfiles.js","sourceRoot":"","sources":["../../src/utils/buildProfiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { EmbedField } from 'oceanic.js';
2
+ export declare function calculateInlineIndex(fields: EmbedField[], currentFieldIndex: number): number;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateInlineIndex = calculateInlineIndex;
4
+ function calculateInlineIndex(fields, currentFieldIndex) {
5
+ const startIndex = currentFieldIndex - 1;
6
+ for (let i = startIndex; i >= 0; i--) {
7
+ const field = fields[i];
8
+ if (!field)
9
+ continue;
10
+ if (field.inline === false) {
11
+ const amount = startIndex - i;
12
+ return (amount % 3) + 1;
13
+ }
14
+ }
15
+ return (currentFieldIndex % 3) + 1;
16
+ }
17
+ //# sourceMappingURL=embeds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeds.js","sourceRoot":"","sources":["../../src/utils/embeds.ts"],"names":[],"mappings":";;AAEA,oDAcC;AAdD,SAAgB,oBAAoB,CAAC,MAAoB,EAAE,iBAAyB;IAClF,MAAM,UAAU,GAAG,iBAAiB,GAAG,CAAC,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ASTNode, ParserRule } from 'simple-markdown';
3
+ import type { State } from './types';
4
+ type AdditionalRule = Partial<ParserRule> & {
5
+ react: (node: ASTNode, output: (node: ASTNode, state?: unknown) => string, state: State) => ReactNode;
6
+ };
7
+ export declare const extend: (additionalRules: AdditionalRule, defaultRule: ParserRule) => AdditionalRule;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extend = void 0;
4
+ const extend = (additionalRules, defaultRule) => {
5
+ return Object.assign({}, defaultRule, additionalRules);
6
+ };
7
+ exports.extend = extend;
8
+ //# sourceMappingURL=extend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend.js","sourceRoot":"","sources":["../../src/utils/extend.ts"],"names":[],"mappings":";;;AAQO,MAAM,MAAM,GAAG,CAAC,eAA+B,EAAE,WAAuB,EAAkB,EAAE;IACjG,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AACzD,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB"}
@@ -0,0 +1,10 @@
1
+ import type { NullablePartialEmoji, PartialEmoji } from 'oceanic.js';
2
+ export declare function isDefined<T>(value: T | undefined | null): value is T;
3
+ export declare function formatBytes(bytes: number, decimals?: number): string;
4
+ export declare function parseDiscordEmoji(emoji: PartialEmoji | NullablePartialEmoji): string;
5
+ export declare function downloadImageToDataURL(url: string): Promise<string | null>;
6
+ /**
7
+ * Converts a stream to a string
8
+ * @param stream - The stream to convert
9
+ */
10
+ export declare function streamToString(stream: NodeJS.ReadableStream): Promise<string>;
@@ -0,0 +1,63 @@
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.isDefined = isDefined;
7
+ exports.formatBytes = formatBytes;
8
+ exports.parseDiscordEmoji = parseDiscordEmoji;
9
+ exports.downloadImageToDataURL = downloadImageToDataURL;
10
+ exports.streamToString = streamToString;
11
+ const undici_1 = require("undici");
12
+ const twemoji_1 = __importDefault(require("twemoji"));
13
+ function isDefined(value) {
14
+ return value !== undefined && value !== null;
15
+ }
16
+ function formatBytes(bytes, decimals = 2) {
17
+ if (bytes === 0)
18
+ return '0 Bytes';
19
+ const k = 1024;
20
+ const dm = decimals < 0 ? 0 : decimals;
21
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
22
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
23
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
24
+ }
25
+ function parseDiscordEmoji(emoji) {
26
+ if (emoji.id) {
27
+ return `https://cdn.discordapp.com/emojis/${emoji.id}.${emoji.animated ? 'gif' : 'png'}`;
28
+ }
29
+ const codepoints = twemoji_1.default.convert
30
+ .toCodePoint(emoji.name.indexOf(String.fromCharCode(0x200d)) < 0 ? emoji.name.replace(/\uFE0F/g, '') : emoji.name)
31
+ .toLowerCase();
32
+ return `https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/${codepoints}.svg`;
33
+ }
34
+ async function downloadImageToDataURL(url) {
35
+ const response = await (0, undici_1.request)(url);
36
+ const dataURL = await response.body
37
+ .arrayBuffer()
38
+ .then((res) => {
39
+ const data = Buffer.from(res).toString('base64');
40
+ const mime = response.headers['content-type'];
41
+ return `data:${mime};base64,${data}`;
42
+ })
43
+ .catch((err) => {
44
+ if (!process.env.HIDE_TRANSCRIPT_ERRORS) {
45
+ console.error(`[discord-html-transcripts] Failed to download image for transcript: `, err);
46
+ }
47
+ return null;
48
+ });
49
+ return dataURL;
50
+ }
51
+ /**
52
+ * Converts a stream to a string
53
+ * @param stream - The stream to convert
54
+ */
55
+ function streamToString(stream) {
56
+ const chunks = [];
57
+ return new Promise((resolve, reject) => {
58
+ stream.on('data', (chunk) => chunks.push(chunk));
59
+ stream.on('error', reject);
60
+ stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
61
+ });
62
+ }
63
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "oceanic-transcripts",
3
+ "version": "1.0.0",
4
+ "description": "A nicely formatted html transcript generator for oceanic.js.",
5
+ "main": "dist/index.js",
6
+ "homepage": "https://github.com/TheMonDon/oceanic-transcripts",
7
+ "types": "./dist/index.d.ts",
8
+ "scripts": {
9
+ "test": "echo \"Error: no test specified\" && exit 1",
10
+ "build": "tsc -p tsconfig.json",
11
+ "prepack": "npm run build",
12
+ "test:typescript": "ts-node ./tests/generate.ts",
13
+ "lint": "prettier --write --cache . && eslint --cache --fix .",
14
+ "typecheck": "tsc -p tsconfig.eslint.json"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/TheMonDon/oceanic-transcripts.git"
19
+ },
20
+ "keywords": [
21
+ "oceanic",
22
+ "oceanic.js",
23
+ "oceanic.js-transcripts",
24
+ "oceanic.js-html-transcripts",
25
+ "html-transcripts",
26
+ "discord-html-transcripts",
27
+ "discord-transcripts"
28
+ ],
29
+ "author": "TheMonDon <bforster48@gmail.com>",
30
+ "contributors": [
31
+ {
32
+ "name": "bunnywasnothere",
33
+ "url": "https://github.com/ShootDot"
34
+ }
35
+ ],
36
+ "license": "GPL-3.0",
37
+ "files": [
38
+ "dist/**/*.js",
39
+ "dist/**/*.d.ts",
40
+ "dist/**/*.js.map"
41
+ ],
42
+ "devDependencies": {
43
+ "@types/node": "^20.11.17",
44
+ "@types/react": "^18.2.47",
45
+ "@types/react-dom": "^18.2.18",
46
+ "@typescript-eslint/eslint-plugin": "^5.62.0",
47
+ "@typescript-eslint/parser": "^5.62.0",
48
+ "dotenv": "^16.3.1",
49
+ "eslint": "^8.56.0",
50
+ "husky": "^8.0.3",
51
+ "prettier": "^2.8.8",
52
+ "pretty-quick": "^3.1.3",
53
+ "ts-node": "^10.9.2",
54
+ "typescript": "^5.3.3"
55
+ },
56
+ "dependencies": {
57
+ "@derockdev/discord-components-core": "^3.6.1",
58
+ "@derockdev/discord-components-react": "^3.6.1",
59
+ "discord-markdown-parser": "~1.1.0",
60
+ "oceanic.js": "^1.11.0",
61
+ "react": "0.0.0-experimental-6639ed3b3-20240111",
62
+ "react-dom": "0.0.0-experimental-6639ed3b3-20240111",
63
+ "simple-markdown": "^0.7.3",
64
+ "twemoji": "^14.0.2",
65
+ "undici": "^5.28.2"
66
+ },
67
+ "overrides": {
68
+ "react": "$react"
69
+ },
70
+ "directories": {
71
+ "doc": "docs",
72
+ "test": "tests"
73
+ },
74
+ "bugs": {
75
+ "url": "https://github.com/TheMonDon/oceanic-transcripts/issues"
76
+ }
77
+ }