@arqenoh/xrcore 3.2.0-r4

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 (47) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +14 -0
  3. package/dist/generator/index.d.ts +16 -0
  4. package/dist/generator/index.js +150 -0
  5. package/dist/generator/renderers/attachment.d.ts +5 -0
  6. package/dist/generator/renderers/attachment.js +40 -0
  7. package/dist/generator/renderers/components/Button.d.ts +9 -0
  8. package/dist/generator/renderers/components/Button.js +57 -0
  9. package/dist/generator/renderers/components/Container.d.ts +7 -0
  10. package/dist/generator/renderers/components/Container.js +28 -0
  11. package/dist/generator/renderers/components/MediaGallery.d.ts +6 -0
  12. package/dist/generator/renderers/components/MediaGallery.js +35 -0
  13. package/dist/generator/renderers/components/Section.d.ts +7 -0
  14. package/dist/generator/renderers/components/Section.js +32 -0
  15. package/dist/generator/renderers/components/SelectMenu.d.ts +6 -0
  16. package/dist/generator/renderers/components/SelectMenu.js +51 -0
  17. package/dist/generator/renderers/components/Spacing.d.ts +7 -0
  18. package/dist/generator/renderers/components/Spacing.js +17 -0
  19. package/dist/generator/renderers/components/Thumbnail.d.ts +5 -0
  20. package/dist/generator/renderers/components/Thumbnail.js +17 -0
  21. package/dist/generator/renderers/components.d.ts +5 -0
  22. package/dist/generator/renderers/components.js +110 -0
  23. package/dist/generator/renderers/content.d.ts +21 -0
  24. package/dist/generator/renderers/content.js +190 -0
  25. package/dist/generator/renderers/embed.d.ts +9 -0
  26. package/dist/generator/renderers/embed.js +42 -0
  27. package/dist/generator/renderers/message.d.ts +4 -0
  28. package/dist/generator/renderers/message.js +60 -0
  29. package/dist/generator/renderers/reply.d.ts +4 -0
  30. package/dist/generator/renderers/reply.js +47 -0
  31. package/dist/generator/renderers/systemMessage.d.ts +8 -0
  32. package/dist/generator/renderers/systemMessage.js +127 -0
  33. package/dist/index.d.ts +23 -0
  34. package/dist/index.js +116 -0
  35. package/dist/static/client.d.ts +2 -0
  36. package/dist/static/client.js +30 -0
  37. package/dist/types.d.ts +59 -0
  38. package/dist/types.js +10 -0
  39. package/dist/utils/buildProfiles.d.ts +11 -0
  40. package/dist/utils/buildProfiles.js +43 -0
  41. package/dist/utils/embeds.d.ts +3 -0
  42. package/dist/utils/embeds.js +21 -0
  43. package/dist/utils/extend.d.ts +8 -0
  44. package/dist/utils/extend.js +8 -0
  45. package/dist/utils/utils.d.ts +4 -0
  46. package/dist/utils/utils.js +47 -0
  47. package/package.json +58 -0
@@ -0,0 +1,127 @@
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.JoinMessage = exports.Highlight = void 0;
7
+ const discord_components_react_1 = require("@derockdev/discord-components-react");
8
+ const discord_js_1 = require("discord.js");
9
+ const react_1 = __importDefault(require("react"));
10
+ const utils_1 = require("../../utils/utils");
11
+ async function renderSystemMessage(message) {
12
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
13
+ switch (message.type) {
14
+ case discord_js_1.MessageType.RecipientAdd:
15
+ case discord_js_1.MessageType.UserJoin:
16
+ return (react_1.default.createElement(discord_components_react_1.DiscordSystemMessage, { id: `m-${message.id}`, key: message.id, type: "join", timestamp: message.createdAt.toISOString() }, JoinMessage(message.member, message.author)));
17
+ case discord_js_1.MessageType.RecipientAdd: {
18
+ const target = message.mentions.users.first();
19
+ return (react_1.default.createElement(discord_components_react_1.DiscordSystemMessage, { id: `m-${message.id}`, key: message.id, type: "join", timestamp: message.createdAt.toISOString() },
20
+ react_1.default.createElement(Highlight, { color: (_b = (_a = message.member) === null || _a === void 0 ? void 0 : _a.roles.color) === null || _b === void 0 ? void 0 : _b.hexColor }, message.author.displayName),
21
+ ' ',
22
+ "adicionou",
23
+ ' ',
24
+ react_1.default.createElement(Highlight, null, (_c = target === null || target === void 0 ? void 0 : target.displayName) !== null && _c !== void 0 ? _c : 'um usuário'),
25
+ ' ',
26
+ "ao t\u00F3pico."));
27
+ }
28
+ case discord_js_1.MessageType.RecipientRemove: {
29
+ const target = message.mentions.users.first();
30
+ return (react_1.default.createElement(discord_components_react_1.DiscordSystemMessage, { id: `m-${message.id}`, key: message.id, type: "leave", timestamp: message.createdAt.toISOString() },
31
+ react_1.default.createElement(Highlight, { color: (_e = (_d = message.member) === null || _d === void 0 ? void 0 : _d.roles.color) === null || _e === void 0 ? void 0 : _e.hexColor }, message.author.displayName),
32
+ ' ',
33
+ "removeu",
34
+ ' ',
35
+ react_1.default.createElement(Highlight, null, (_f = target === null || target === void 0 ? void 0 : target.displayName) !== null && _f !== void 0 ? _f : 'um usuário'),
36
+ ' ',
37
+ "do t\u00F3pico."));
38
+ }
39
+ case discord_js_1.MessageType.ChannelNameChange:
40
+ return (react_1.default.createElement(discord_components_react_1.DiscordSystemMessage, { id: `m-${message.id}`, key: message.id, type: "edit", channelName: true, timestamp: message.createdAt.toISOString() },
41
+ react_1.default.createElement(Highlight, { color: (_h = (_g = message.member) === null || _g === void 0 ? void 0 : _g.roles.color) === null || _h === void 0 ? void 0 : _h.hexColor }, message.author.displayName),
42
+ ' ',
43
+ "mudou o nome do canal: ",
44
+ react_1.default.createElement("b", null, message.content)));
45
+ case discord_js_1.MessageType.ChannelPinnedMessage:
46
+ return (react_1.default.createElement(discord_components_react_1.DiscordSystemMessage, { id: `m-${message.id}`, key: message.id, type: "pin" },
47
+ react_1.default.createElement(Highlight, { color: (_k = (_j = message.member) === null || _j === void 0 ? void 0 : _j.roles.color) === null || _k === void 0 ? void 0 : _k.hexColor }, message.author.displayName),
48
+ " pinned",
49
+ ' ',
50
+ react_1.default.createElement("i", { "data-goto": (_l = message.reference) === null || _l === void 0 ? void 0 : _l.messageId }, "a message"),
51
+ " to this channel.",
52
+ message.reactions.cache.size > 0 && (react_1.default.createElement(discord_components_react_1.DiscordReactions, { slot: "reactions" }, message.reactions.cache.map((reaction, id) => (react_1.default.createElement(discord_components_react_1.DiscordReaction, { key: `${message.id}r${id}`, name: reaction.emoji.name, emoji: (0, utils_1.parseDiscordEmoji)(reaction.emoji), count: reaction.count })))))));
53
+ case discord_js_1.MessageType.GuildBoost:
54
+ case discord_js_1.MessageType.GuildBoostTier1:
55
+ case discord_js_1.MessageType.GuildBoostTier2:
56
+ case discord_js_1.MessageType.GuildBoostTier3:
57
+ return (react_1.default.createElement(discord_components_react_1.DiscordSystemMessage, { id: `m-${message.id}`, key: message.id, type: "boost" },
58
+ react_1.default.createElement(Highlight, { color: (_o = (_m = message.member) === null || _m === void 0 ? void 0 : _m.roles.color) === null || _o === void 0 ? void 0 : _o.hexColor }, message.author.displayName),
59
+ " boosted the server!"));
60
+ case discord_js_1.MessageType.ThreadStarterMessage:
61
+ return (react_1.default.createElement(discord_components_react_1.DiscordSystemMessage, { id: `ms-${message.id}`, key: message.id, type: "thread" },
62
+ react_1.default.createElement(Highlight, { color: (_q = (_p = message.member) === null || _p === void 0 ? void 0 : _p.roles.color) === null || _q === void 0 ? void 0 : _q.hexColor }, message.author.displayName),
63
+ " started a thread: ",
64
+ react_1.default.createElement("i", { "data-goto": (_r = message.reference) === null || _r === void 0 ? void 0 : _r.messageId }, message.content)));
65
+ default:
66
+ return undefined;
67
+ }
68
+ }
69
+ exports.default = renderSystemMessage;
70
+ function Highlight({ children, color }) {
71
+ return (react_1.default.createElement("span", { style: { color: color !== null && color !== void 0 ? color : '#f2f3f5', fontWeight: 600 } }, children));
72
+ }
73
+ exports.Highlight = Highlight;
74
+ const allJoinMessages = [
75
+ '{user} just joined the server - glhf!',
76
+ '{user} just joined. Everyone, look busy!',
77
+ '{user} just joined. Can I get a heal?',
78
+ '{user} joined your party.',
79
+ '{user} joined. You must construct additional pylons.',
80
+ 'Ermagherd. {user} is here.',
81
+ 'Welcome, {user}. Stay awhile and listen.',
82
+ 'Welcome, {user}. We were expecting you ( ͡° ͜ʖ ͡°)',
83
+ 'Welcome, {user}. We hope you brought pizza.',
84
+ 'Welcome {user}. Leave your weapons by the door.',
85
+ 'A wild {user} appeared.',
86
+ 'Swoooosh. {user} just landed.',
87
+ 'Brace yourselves {user} just joined the server.',
88
+ '{user} just joined. Hide your bananas.',
89
+ '{user} just arrived. Seems OP - please nerf.',
90
+ '{user} just slid into the server.',
91
+ 'A {user} has spawned in the server.',
92
+ 'Big {user} showed up!',
93
+ "Where's {user}? In the server!",
94
+ '{user} hopped into the server. Kangaroo!!',
95
+ '{user} just showed up. Hold my beer.',
96
+ 'Challenger approaching - {user} has appeared!',
97
+ "It's a bird! It's a plane! Nevermind, it's just {user}.",
98
+ "It's {user}! Praise the sun! \\\\[T]/",
99
+ 'Never gonna give {user} up. Never gonna let {user} down.',
100
+ 'Ha! {user} has joined! You activated my trap card!',
101
+ 'Cheers, love! {user} is here!',
102
+ 'Hey! Listen! {user} has joined!',
103
+ "We've been expecting you {user}",
104
+ "It's dangerous to go alone, take {user}!",
105
+ "{user} has joined the server! It's super effective!",
106
+ 'Cheers, love! {user} is here!',
107
+ '{user} is here, as the prophecy foretold.',
108
+ "{user} has arrived. Party's over.",
109
+ 'Ready player {user}',
110
+ '{user} is here to kick butt and chew bubblegum. And {user} is all out of gum.',
111
+ "Hello. Is it {user} you're looking for?",
112
+ ];
113
+ function JoinMessage(member, fallbackUser) {
114
+ const randomMessage = allJoinMessages[Math.floor(Math.random() * allJoinMessages.length)];
115
+ return randomMessage
116
+ .split('{user}')
117
+ .flatMap((item, i) => {
118
+ var _a, _b;
119
+ return [
120
+ item,
121
+ react_1.default.createElement(Highlight, { color: (_a = member === null || member === void 0 ? void 0 : member.roles.color) === null || _a === void 0 ? void 0 : _a.hexColor, key: i }, (_b = member === null || member === void 0 ? void 0 : member.nickname) !== null && _b !== void 0 ? _b : fallbackUser.displayName),
122
+ ];
123
+ })
124
+ .slice(0, -1);
125
+ }
126
+ exports.JoinMessage = JoinMessage;
127
+ //# sourceMappingURL=systemMessage.js.map
@@ -0,0 +1,23 @@
1
+ import { Collection, type Channel, type Message, type TextBasedChannel } from 'discord.js';
2
+ import { ExportReturnType, type CreateTranscriptOptions, type GenerateFromMessagesOptions, type ObjectType } from './types';
3
+ /**
4
+ *
5
+ * @param messages The messages to generate a transcript from
6
+ * @param channel The channel the messages are from (used for header and guild name)
7
+ * @param options The options to use when generating the transcript
8
+ * @returns The generated transcript
9
+ */
10
+ export declare function generateFromMessages<T extends ExportReturnType = ExportReturnType.Attachment>(messages: Message[] | Collection<string, Message>, channel: Channel, options?: GenerateFromMessagesOptions<T>): Promise<ObjectType<T>>;
11
+ /**
12
+ *
13
+ * @param channel The channel to create a transcript from
14
+ * @param options The options to use when creating the transcript
15
+ * @returns The generated transcript
16
+ */
17
+ export declare function createTranscript<T extends ExportReturnType = ExportReturnType.Attachment>(channel: TextBasedChannel, options?: CreateTranscriptOptions<T>): Promise<ObjectType<T>>;
18
+ declare const _default: {
19
+ createTranscript: typeof createTranscript;
20
+ generateFromMessages: typeof generateFromMessages;
21
+ };
22
+ export default _default;
23
+ export * from './types';
package/dist/index.js ADDED
@@ -0,0 +1,116 @@
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.createTranscript = exports.generateFromMessages = void 0;
21
+ const discord_js_1 = require("discord.js");
22
+ const generator_1 = __importDefault(require("./generator"));
23
+ const types_1 = require("./types");
24
+ // version check
25
+ const versionPrefix = discord_js_1.version.split('.')[0];
26
+ if (versionPrefix !== '14' && versionPrefix !== '15') {
27
+ console.error(`[discord-html-transcripts] Versions v3.x.x of discord-html-transcripts are only compatible with discord.js v14.x.x and v15.x.x, and you are using v${discord_js_1.version}.` +
28
+ ` For v13.x.x support, please install discord-html-transcripts v2.x.x using "npm install discord-html-transcripts@^2".`);
29
+ process.exit(1);
30
+ }
31
+ /**
32
+ *
33
+ * @param messages The messages to generate a transcript from
34
+ * @param channel The channel the messages are from (used for header and guild name)
35
+ * @param options The options to use when generating the transcript
36
+ * @returns The generated transcript
37
+ */
38
+ async function generateFromMessages(messages, channel, options = {}) {
39
+ var _a, _b, _c, _d, _e, _f, _g;
40
+ // turn messages into an array
41
+ const transformedMessages = messages instanceof discord_js_1.Collection ? Array.from(messages.values()) : messages;
42
+ // const startTime = process.hrtime();
43
+ // render the messages
44
+ const html = await (0, generator_1.default)({
45
+ messages: transformedMessages,
46
+ channel,
47
+ saveImages: (_a = options.saveImages) !== null && _a !== void 0 ? _a : false,
48
+ callbacks: Object.assign({ resolveChannel: async (id) => channel.client.channels.fetch(id).catch(() => null), resolveUser: async (id) => channel.client.users.fetch(id).catch(() => null), resolveRole: channel.isDMBased() ? () => null : async (id) => { var _a; return (_a = channel.guild) === null || _a === void 0 ? void 0 : _a.roles.fetch(id).catch(() => null); } }, ((_b = options.callbacks) !== null && _b !== void 0 ? _b : {})),
49
+ poweredBy: (_c = options.poweredBy) !== null && _c !== void 0 ? _c : true,
50
+ footerText: (_d = options.footerText) !== null && _d !== void 0 ? _d : 'Exported {number} message{s}.',
51
+ favicon: (_e = options.favicon) !== null && _e !== void 0 ? _e : 'guild',
52
+ hydrate: (_f = options.hydrate) !== null && _f !== void 0 ? _f : false,
53
+ });
54
+ // get the time it took to render the messages
55
+ // const renderTime = process.hrtime(startTime);
56
+ // console.log(`[discord-html-transcripts] Rendered ${transformedMessages.length} messages in ${renderTime[0]}s ${renderTime[1] / 1000000}ms`);
57
+ // return the html in the specified format
58
+ if (options.returnType === types_1.ExportReturnType.Buffer) {
59
+ return Buffer.from(html);
60
+ }
61
+ if (options.returnType === types_1.ExportReturnType.String) {
62
+ return html;
63
+ }
64
+ return new discord_js_1.AttachmentBuilder(Buffer.from(html), {
65
+ name: (_g = options.filename) !== null && _g !== void 0 ? _g : `transcript-${channel.id}.html`,
66
+ });
67
+ }
68
+ exports.generateFromMessages = generateFromMessages;
69
+ /**
70
+ *
71
+ * @param channel The channel to create a transcript from
72
+ * @param options The options to use when creating the transcript
73
+ * @returns The generated transcript
74
+ */
75
+ async function createTranscript(channel, options = {}) {
76
+ // validate type
77
+ if (!channel.isTextBased()) {
78
+ // @ts-expect-error(2339): run-time check
79
+ throw new TypeError(`Provided channel must be text-based, received ${channel.type}`);
80
+ }
81
+ // fetch messages
82
+ let allMessages = [];
83
+ let lastMessageId;
84
+ const { limit } = options;
85
+ const resolvedLimit = typeof limit === 'undefined' || limit === -1 ? Infinity : limit;
86
+ // until there are no more messages, keep fetching
87
+ // eslint-disable-next-line no-constant-condition
88
+ while (true) {
89
+ // create fetch options
90
+ const fetchLimitOptions = { limit: 100, before: lastMessageId };
91
+ if (!lastMessageId)
92
+ delete fetchLimitOptions.before;
93
+ // fetch messages
94
+ const messages = await channel.messages.fetch(fetchLimitOptions);
95
+ // add the messages to the array
96
+ allMessages.push(...messages.values());
97
+ lastMessageId = messages.lastKey();
98
+ // if there are no more messages, break
99
+ if (messages.size < 100)
100
+ break;
101
+ // if the limit has been reached, break
102
+ if (allMessages.length >= resolvedLimit)
103
+ break;
104
+ }
105
+ if (resolvedLimit < allMessages.length)
106
+ allMessages = allMessages.slice(0, limit);
107
+ // generate the transcript
108
+ return generateFromMessages(allMessages.reverse(), channel, options);
109
+ }
110
+ exports.createTranscript = createTranscript;
111
+ exports.default = {
112
+ createTranscript,
113
+ generateFromMessages,
114
+ };
115
+ __exportStar(require("./types"), exports);
116
+ //# sourceMappingURL=index.js.map
@@ -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,59 @@
1
+ /// <reference types="node" />
2
+ import type { AttachmentBuilder } from 'discord.js';
3
+ import type { RenderMessageContext } from './generator';
4
+ export type AttachmentTypes = 'audio' | 'video' | 'image' | 'file';
5
+ export declare enum ExportReturnType {
6
+ Buffer = "buffer",
7
+ String = "string",
8
+ Attachment = "attachment"
9
+ }
10
+ export type ObjectType<T extends ExportReturnType> = T extends ExportReturnType.Buffer ? Buffer : T extends ExportReturnType.String ? string : AttachmentBuilder;
11
+ export type GenerateFromMessagesOptions<T extends ExportReturnType> = Partial<{
12
+ /**
13
+ * The type of object to return
14
+ * @default ExportReturnType.ATTACHMENT
15
+ */
16
+ returnType: T;
17
+ /**
18
+ * Downloads images and encodes them as base64 data urls
19
+ * @default false
20
+ */
21
+ saveImages: boolean;
22
+ /**
23
+ * Callbacks for resolving channels, users, and roles
24
+ */
25
+ callbacks: RenderMessageContext['callbacks'];
26
+ /**
27
+ * The name of the file to return if returnType is ExportReturnType.ATTACHMENT
28
+ * @default 'transcript-{channel-id}.html'
29
+ */
30
+ filename: string;
31
+ /**
32
+ * Whether to include the "Powered by discord-html-transcripts" footer
33
+ * @default true
34
+ */
35
+ poweredBy: boolean;
36
+ /**
37
+ * The message right before "Powered by" text. Remember to put the {s}
38
+ * @default 'Exported {number} message{s}.'
39
+ */
40
+ footerText: string;
41
+ /**
42
+ * Whether to show the guild icon or a custom icon as the favicon
43
+ * 'guild' - use the guild icon
44
+ * or pass in a url to use a custom icon
45
+ * @default "guild"
46
+ */
47
+ favicon: 'guild' | string;
48
+ /**
49
+ * Whether to hydrate the html server-side
50
+ * @default false - the returned html will be hydrated client-side
51
+ */
52
+ hydrate: boolean;
53
+ }>;
54
+ export type CreateTranscriptOptions<T extends ExportReturnType> = Partial<GenerateFromMessagesOptions<T> & {
55
+ /**
56
+ * The max amount of messages to fetch. Use `-1` to recursively fetch.
57
+ */
58
+ limit: number;
59
+ }>;
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,11 @@
1
+ import { type Message } from 'discord.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,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProfiles = void 0;
4
+ const discord_js_1 = require("discord.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] = buildProfile(message.member, author);
14
+ }
15
+ // add interaction users
16
+ if (message.interaction) {
17
+ const user = message.interaction.user;
18
+ if (!profiles[user.id]) {
19
+ profiles[user.id] = buildProfile(null, user);
20
+ }
21
+ }
22
+ // threads
23
+ if (message.thread && message.thread.lastMessage) {
24
+ profiles[message.thread.lastMessage.author.id] = buildProfile(message.thread.lastMessage.member, message.thread.lastMessage.author);
25
+ }
26
+ }
27
+ // return as a JSON
28
+ return profiles;
29
+ }
30
+ exports.buildProfiles = buildProfiles;
31
+ function buildProfile(member, author) {
32
+ var _a, _b, _c, _d, _e, _f, _g;
33
+ return {
34
+ author: (_a = member === null || member === void 0 ? void 0 : member.nickname) !== null && _a !== void 0 ? _a : author.displayName,
35
+ avatar: (_b = member === null || member === void 0 ? void 0 : member.displayAvatarURL({ size: 64 })) !== null && _b !== void 0 ? _b : author.displayAvatarURL({ size: 64 }),
36
+ roleColor: member === null || member === void 0 ? void 0 : member.displayHexColor,
37
+ roleIcon: (_d = (_c = member === null || member === void 0 ? void 0 : member.roles.icon) === null || _c === void 0 ? void 0 : _c.iconURL()) !== null && _d !== void 0 ? _d : undefined,
38
+ roleName: (_f = (_e = member === null || member === void 0 ? void 0 : member.roles.hoist) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : undefined,
39
+ bot: author.bot,
40
+ verified: (_g = author.flags) === null || _g === void 0 ? void 0 : _g.has(discord_js_1.UserFlags.VerifiedBot),
41
+ };
42
+ }
43
+ //# sourceMappingURL=buildProfiles.js.map
@@ -0,0 +1,3 @@
1
+ import type { APIEmbedField } from 'discord.js';
2
+ export declare const calculateAmountOfTrue: (array: boolean[]) => number;
3
+ export declare function calculateInlineIndex(fields: APIEmbedField[], currentFieldIndex: number): number;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateInlineIndex = exports.calculateAmountOfTrue = void 0;
4
+ const calculateAmountOfTrue = (array) => {
5
+ // get the amount of true values before endIndex, stopping at the first false value
6
+ for (let i = array.length - 1; i >= 0; i--) {
7
+ if (!array[i]) {
8
+ return array.length - i;
9
+ }
10
+ }
11
+ return array.length - 1;
12
+ };
13
+ exports.calculateAmountOfTrue = calculateAmountOfTrue;
14
+ function calculateInlineIndex(fields, currentFieldIndex) {
15
+ // get the amount of inline fields before the current field without gaps
16
+ const inlineFieldsBefore = fields.slice(0, currentFieldIndex).map((e) => { var _a; return (_a = e.inline) !== null && _a !== void 0 ? _a : false; });
17
+ const amount = (0, exports.calculateAmountOfTrue)(inlineFieldsBefore) + 1;
18
+ return (amount % 3) + 1;
19
+ }
20
+ exports.calculateInlineIndex = calculateInlineIndex;
21
+ //# sourceMappingURL=embeds.js.map
@@ -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,4 @@
1
+ import type { APIMessageComponentEmoji, Emoji } from 'discord.js';
2
+ export declare function formatBytes(bytes: number, decimals?: number): string;
3
+ export declare function parseDiscordEmoji(emoji: Emoji | APIMessageComponentEmoji): string;
4
+ export declare function downloadImageToDataURL(url: string): Promise<string | null>;
@@ -0,0 +1,47 @@
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.downloadImageToDataURL = exports.parseDiscordEmoji = exports.formatBytes = void 0;
7
+ const undici_1 = require("undici");
8
+ const twemoji_1 = __importDefault(require("twemoji"));
9
+ function formatBytes(bytes, decimals = 2) {
10
+ if (bytes === 0)
11
+ return '0 Bytes';
12
+ const k = 1024;
13
+ const dm = decimals < 0 ? 0 : decimals;
14
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
15
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
16
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
17
+ }
18
+ exports.formatBytes = formatBytes;
19
+ function parseDiscordEmoji(emoji) {
20
+ if (emoji.id) {
21
+ return `https://cdn.discordapp.com/emojis/${emoji.id}.${emoji.animated ? 'gif' : 'png'}`;
22
+ }
23
+ const codepoints = twemoji_1.default.convert
24
+ .toCodePoint(emoji.name.indexOf(String.fromCharCode(0x200d)) < 0 ? emoji.name.replace(/\uFE0F/g, '') : emoji.name)
25
+ .toLowerCase();
26
+ return `https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/${codepoints}.svg`;
27
+ }
28
+ exports.parseDiscordEmoji = parseDiscordEmoji;
29
+ async function downloadImageToDataURL(url) {
30
+ const response = await (0, undici_1.request)(url);
31
+ const dataURL = await response.body
32
+ .arrayBuffer()
33
+ .then((res) => {
34
+ const data = Buffer.from(res).toString('base64');
35
+ const mime = response.headers['content-type'];
36
+ return `data:${mime};base64,${data}`;
37
+ })
38
+ .catch((err) => {
39
+ if (!process.env.HIDE_TRANSCRIPT_ERRORS) {
40
+ console.error(`[discord-html-transcripts] Failed to download image for transcript: `, err);
41
+ }
42
+ return null;
43
+ });
44
+ return dataURL;
45
+ }
46
+ exports.downloadImageToDataURL = downloadImageToDataURL;
47
+ //# sourceMappingURL=utils.js.map
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@arqenoh/xrcore",
3
+ "version": "3.2.0-r4",
4
+ "description": "Internal rendering utilities.",
5
+ "main": "dist/index.js",
6
+ "homepage": "",
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": ""
19
+ },
20
+ "keywords": [],
21
+ "author": "Xellon Bots",
22
+ "contributors": [
23
+ "Derock <derock@derock.dev> (original project author)"
24
+ ],
25
+ "license": "Apache-2.0",
26
+ "files": [
27
+ "dist/**/*.js",
28
+ "dist/**/*.d.ts"
29
+ ],
30
+ "devDependencies": {
31
+ "@types/node": "^18.11.18",
32
+ "@types/react": "^18.0.27",
33
+ "@types/react-dom": "^18.0.10",
34
+ "@typescript-eslint/eslint-plugin": "^5.49.0",
35
+ "@typescript-eslint/parser": "^5.49.0",
36
+ "discord.js": "^14.25.1",
37
+ "dotenv": "^16.0.3",
38
+ "eslint": "^8.32.0",
39
+ "husky": "^8.0.3",
40
+ "prettier": "^2.8.3",
41
+ "pretty-quick": "^3.1.3",
42
+ "ts-node": "^10.9.1",
43
+ "typescript": "^5.1.6"
44
+ },
45
+ "dependencies": {
46
+ "@derockdev/discord-components-core": "^3.6.1",
47
+ "@derockdev/discord-components-react": "^3.6.1",
48
+ "discord-markdown-parser": "1.3.1",
49
+ "react": "^18.2.0",
50
+ "react-dom": "^18.2.0",
51
+ "simple-markdown": "^0.7.3",
52
+ "twemoji": "^14.0.2",
53
+ "undici": "^5.23.0"
54
+ },
55
+ "peerDependencies": {
56
+ "discord.js": "^14.0.0 || ^15.0.0"
57
+ }
58
+ }