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.
- package/LICENSE +201 -0
- package/README.md +114 -0
- package/dist/generator/index.d.ts +16 -0
- package/dist/generator/index.js +82 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/renderers/attachment.d.ts +21 -0
- package/dist/generator/renderers/attachment.js +49 -0
- package/dist/generator/renderers/attachment.js.map +1 -0
- package/dist/generator/renderers/components.d.ts +11 -0
- package/dist/generator/renderers/components.js +28 -0
- package/dist/generator/renderers/components.js.map +1 -0
- package/dist/generator/renderers/content.d.ts +32 -0
- package/dist/generator/renderers/content.js +153 -0
- package/dist/generator/renderers/content.js.map +1 -0
- package/dist/generator/renderers/embed.d.ts +12 -0
- package/dist/generator/renderers/embed.js +43 -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 +65 -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 +54 -0
- package/dist/generator/renderers/reply.js.map +1 -0
- package/dist/generator/renderers/systemMessage.d.ts +14 -0
- package/dist/generator/renderers/systemMessage.js +103 -0
- package/dist/generator/renderers/systemMessage.js.map +1 -0
- package/dist/generator/transcript.d.ts +10 -0
- package/dist/generator/transcript.js +75 -0
- package/dist/generator/transcript.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/static/client.d.ts +2 -0
- package/dist/static/client.js +30 -0
- package/dist/static/client.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildProfiles.d.ts +11 -0
- package/dist/utils/buildProfiles.js +47 -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 +10 -0
- package/dist/utils/utils.js +63 -0
- package/dist/utils/utils.js.map +1 -0
- package/package.json +77 -0
package/dist/index.d.ts
ADDED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;AA2BA,oDAmDC;AAQD,4CA8CC;AAjID,2CAKoB;AACpB,4DAA0C;AAC1C,mCAKiB;AAEjB,2CAA2C;AAC3C,qDAAoE;AAA3D,8HAAA,OAAO,OAAmB;AAEnC;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,QAAiD,EACjD,OAA6C,EAC7C,UAA0C,EAAE;;IAE5C,8BAA8B;IAC9B,MAAM,mBAAmB,GAAG,QAAQ,YAAY,uBAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEtG,sCAAsC;IAEtC,sBAAsB;IACtB,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAe,EAAC;QACjC,QAAQ,EAAE,mBAAmB;QAC7B,OAAO;QACP,UAAU,EAAE,MAAA,OAAO,CAAC,UAAU,mCAAI,KAAK;QACvC,SAAS,kBACP,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAyD,EAChH,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAC9E,WAAW,EACT,OAAO,CAAC,IAAI,KAAK,yBAAY,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,eAAC,OAAA,MAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,mCAAI,IAAI,CAAA,EAAA,IAEvG,CAAC,MAAA,OAAO,CAAC,SAAS,mCAAI,EAAE,CAAC,CAC7B;QACD,SAAS,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,IAAI;QACpC,UAAU,EAAE,MAAA,OAAO,CAAC,UAAU,mCAAI,+BAA+B;QACjE,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,OAAO;QACnC,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,KAAK;KAClC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,gDAAgD;IAChD,eAAe;IACf,wGAAwG;IACxG,8BAA8B;IAC9B,SAAS;IACT,KAAK;IAEL,0CAA0C;IAC1C,IAAI,OAAO,CAAC,UAAU,KAAK,wBAAgB,CAAC,MAAM,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAA6B,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,KAAK,wBAAgB,CAAC,MAAM,EAAE,CAAC;QACnD,OAAO,IAAgC,CAAC;IAC1C,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,EAAE,MAAA,OAAO,CAAC,QAAQ,mCAAI,cAAc,OAAO,CAAC,EAAE,OAAO;KAC9B,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAA6C,EAC7C,UAAsC,EAAE;;IAExC,gBAAgB;IAChB,IAAI,CAAC,iCAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,iDAAiD,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,iBAAiB;IACjB,IAAI,WAAW,GAAc,EAAE,CAAC;IAChC,IAAI,aAAiC,CAAC;IACtC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAEtF,kDAAkD;IAClD,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACZ,uBAAuB;QACvB,MAAM,iBAAiB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAChE,IAAI,CAAC,aAAa;YAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC;QAEpD,iBAAiB;QACjB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAC9D,MAAM,gBAAgB,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE3F,gCAAgC;QAChC,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,0GAA0G;QAC1G,aAAa;YACX,MAAA,MAAA,MAAA,MAAA,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,EAAE,mCACjC,MAAA,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,EAAE,mCACjD,MAAA,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,0CAAE,EAAE,mCAClC,MAAA,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,0CAAE,EAAE,CAAC;QAE7C,uCAAuC;QACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;YAAE,MAAM;QAEjC,uCAAuC;QACvC,IAAI,WAAW,CAAC,MAAM,IAAI,aAAa;YAAE,MAAM;IACjD,CAAC;IAED,IAAI,aAAa,GAAG,WAAW,CAAC,MAAM;QAAE,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAElF,0BAA0B;IAC1B,OAAO,oBAAoB,CAAI,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,kBAAe;IACb,gBAAgB;IAChB,oBAAoB;CACrB,CAAC;AACF,0CAAwB"}
|
|
@@ -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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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,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
|
+
}
|