@skybloxsystems/ticket-bot
Version:
120 lines (110 loc) • 7.31 kB
JavaScript
async function fetchTranscript(channel ,message, numberOfMessages) {
if(!message) throw new ReferenceError('GhostTranscript => "message" is not defined')
if(!numberOfMessages) throw new ReferenceError('GhostTranscript => "numberOfMessages" is not defined')
if(typeof numberOfMessages !== "number") throw new SyntaxError('GhostTranscript => typeof "numberOfMessages" must be a number')
if(numberOfMessages >= 100) throw new RangeError('GhostTranscript => "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);
}
let msgs = messageCollection.array().reverse();
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)
msgs.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());
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');
img.setAttribute('src', files[0])
messageContainer.appendChild(img)
}
console.log(files[0])
}
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.array().filter((attachment) => valid.test(attachment.url)).map((attachment) => attachment.url);
}