xfinity
Version:
Easy to use discord.js multipurpose package for your bot
161 lines (152 loc) • 6.96 kB
JavaScript
async function fetchTranscript(channel, message, numberOfMessages) {
if (!message) throw new ReferenceError(' "message" is not defined');
if (!numberOfMessages)
throw new ReferenceError('"numberOfMessages" is not defined');
if (typeof numberOfMessages !== "number")
throw new SyntaxError(' typeof "numberOfMessages" must be a number');
if (numberOfMessages >= 101)
throw new RangeError(' "numberOfMessages" must be under 100 messages');
const jsdom = require("jsdom");
const fs = require("fs");
const Discord = require("discord.js");
const { JSDOM } = jsdom;
const dom = new JSDOM();
const document = dom.window.document;
let messageCollection = new Discord.Collection();
let channelMessages = await channel.messages
.fetch({
limit: numberOfMessages,
})
.catch((err) => console.log(err));
messageCollection = messageCollection.concat(channelMessages);
while (channelMessages.size === 100) {
let lastMessageId = channelMessages.lastKey();
channelMessages = await channel.messages
.fetch({ limit: numberOfMessages, before: lastMessageId })
.catch((err) => console.log(err));
if (channelMessages)
messageCollection = messageCollection.concat(channelMessages);
}
return new Promise(async (ful) => {
await fs.readFile(
require("path").join(__dirname, "template.html"),
"utf8",
async function (err, data) {
if (data) {
await fs.writeFile(
require("path").join(__dirname, "index.html"),
data,
async function (err) {
if (err) return console.log(err);
let info = document.createElement("div");
info.className = "info";
let iconClass = document.createElement("div");
iconClass.className = "info__guild-icon-container";
let guild__icon = document.createElement("img");
guild__icon.className = "info__guild-icon";
guild__icon.setAttribute("src", message.guild.iconURL());
iconClass.appendChild(guild__icon);
info.appendChild(iconClass);
let info__metadata = document.createElement("div");
info__metadata.className = "info__metadata";
let guildName = document.createElement("div");
guildName.className = "info__guild-name";
let gName = document.createTextNode(message.guild.name);
guildName.appendChild(gName);
info__metadata.appendChild(guildName);
let messagecount = document.createElement("div");
messagecount.className = "info__channel-message-count";
messagecount.appendChild(
document.createTextNode(
`Transcripted ${numberOfMessages} messages From: ${channel.name}`
)
);
info__metadata.appendChild(messagecount);
info.appendChild(info__metadata);
await fs.appendFile(
require("path").join(__dirname, "index.html"),
info.outerHTML,
async function (err) {
if (err) return console.log(err);
messageCollection.forEach(async (msg) => {
let parentContainer = document.createElement("div");
parentContainer.className = "parent-container";
let avatarDiv = document.createElement("div");
avatarDiv.className = "avatar-container";
let img = document.createElement("img");
img.setAttribute(
"src",
msg.author.displayAvatarURL({ dynamic: true })
);
img.className = "avatar";
avatarDiv.appendChild(img);
parentContainer.appendChild(avatarDiv);
let messageContainer = document.createElement("div");
messageContainer.className = "message-container";
let nameElement = document.createElement("span");
let name = document.createTextNode(
msg.author.tag +
" " +
msg.createdAt.toDateString() +
" " +
msg.createdAt.toLocaleTimeString() +
" EST"
);
nameElement.appendChild(name);
messageContainer.append(nameElement);
if (msg.content.startsWith("```")) {
let m = msg.content.replace(/```/g, "");
let codeNode = document.createElement("code");
let textNode = document.createTextNode(m);
codeNode.appendChild(textNode);
messageContainer.appendChild(codeNode);
} else {
let msgNode = document.createElement("span");
if (msg.attachments) {
const files = getImageLinks(msg.attachments);
if (files[0] !== undefined) {
let img = document.createElement("img");
console.log(files[0]);
img.setAttribute("src", files[0]);
messageContainer.appendChild(img);
}
console.log({ files: files });
}
if (msg.content) {
let textNode = document.createTextNode(msg.content);
msgNode.append(textNode);
messageContainer.appendChild(msgNode);
}
}
parentContainer.appendChild(messageContainer);
await fs.appendFile(
require("path").join(__dirname, "index.html"),
parentContainer.outerHTML,
function (err) {
if (err) return console.log(err);
}
);
});
fs.readFile(
require("path").join(__dirname, "index.html"),
(err, data) => {
if (err) console.log(err);
ful(data);
}
);
}
);
}
);
}
}
);
});
}
module.exports = fetchTranscript;
function getImageLinks(attachments) {
const valid = /^.*(gif|png|jpg|jpeg)$/g;
return attachments
.filter((attachment) => valid.test(attachment.url))
.map((attachment) => attachment.url);
}