const { Command } = require('discord-akairo'); const captureWebsite = require('capture-website'); const os = require('os'); const fs = require('fs'); class screenshotCommand extends Command { constructor() { super('screenshot', { aliases: ['screenshot', 'webshot', 'ss'], category: 'utility', clientPermissions: ['SEND_MESSAGES', 'ATTACH_FILES'], ownerOnly: 'true', // Owner only until i am sure there is no security issue args: [ { id: 'url', type: 'string' }, { id: 'fullpage', type: 'flag', flag: '--full' } ], channelRestriction: 'guild', description: { content: 'Take a screenshot of a website', usage: '[link to a website]', examples: ['www.google.com'] } }); } async exec(message, args) { let Embed = this.client.util.embed() .setColor(message.member.displayHexColor) .setTitle(args.url); // eslint-disable-next-line no-useless-escape let urlregex = new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/); if (args.url.match(urlregex)) { // Only allow link with http/https await captureWebsite.file(args.url, `${os.tmpdir()}/${message.id}.jpg`, { type: 'jpeg', headers: { 'Accept-Language': 'en-GB' }, fullPage: args.fullpage }) .catch((err) => { console.error(err); Embed.setDescription(err.toString()); return message.channel.send(Embed); }) .then(() => { if (fs.existsSync(`${os.tmpdir()}/${message.id}.jpg`)) { Embed.attachFiles([`${os.tmpdir()}/${message.id}.jpg`]); Embed.setImage(`attachment://${message.id}.jpg`); return message.channel.send(Embed); } }); } else { return message.channel.send('The URL you used doesn\'t correspond to a website!'); } } } module.exports = screenshotCommand;