diff --git a/commands/utility/addytp.js b/commands/utility/addytp.js new file mode 100644 index 00000000..b31544e8 --- /dev/null +++ b/commands/utility/addytp.js @@ -0,0 +1,91 @@ +import { SlashCommandBuilder, EmbedBuilder } from 'discord.js'; +import utils from '../../utils/videos.js'; +import fs from 'node:fs'; +import os from 'node:os'; + +const { ytpChannelId } = process.env; + +export default { + data: new SlashCommandBuilder() + .setName('addytp') + .setDescription('Add a video to the pool of ytps') + .addStringOption(option => + option.setName('url') + .setDescription('URL of the video you want to add.') + .setRequired(true)), + category: 'utility', + async execute(interaction, args) { + const url = args.url; + if (!await utils.stringIsAValidurl(url)) { + console.error(`Not a url!!! ${url}`); + return interaction.reply({ content: '❌ This does not look like a valid url!', ephemeral: true }); + } + + await interaction.deferReply({ ephemeral: true }); + + utils.downloadVideo(url, interaction.id, 'mp4') + .then(async () => { + const file = fs.readdirSync(os.tmpdir()).filter(fn => fn.startsWith(interaction.id)); + const output = `${os.tmpdir()}/${file}`; + + const fileStat = fs.statSync(output); + const fileSize = fileStat.size / 1000000.0; + + if (fileSize > 50) { + // await interaction.deleteReply(); + await interaction.editReply({ content: '❌ Uh oh! The video is too big!', ephemeral: true }); + } + else { + fs.renameSync(output, `./asset/ytp/userVid/${file}`); + const mp4 = []; + fs.readdirSync('./asset/ytp/userVid/').forEach(f => { + if (f.endsWith('mp4')) { + mp4.push(f); + } + }); + + // (Hopefully) limit video to 2k + if (mp4.length > 2000) { + const f = mp4.sort((a, b) => { + const time1 = fs.statSync(`./asset/ytp/userVid/${b}`).ctime; + const time2 = fs.statSync(`./asset/ytp/userVid/${a}`).ctime; + if (time1 < time2) return 1; + if (time1 > time2) return -1; + return 0; + }).slice(0, 1); + fs.unlinkSync(`./asset/ytp/userVid/${f[0]}`); + } + + interaction.editReply({ content: `Video successfully added to the pool! There is now ${mp4.length} videos`, ephemeral: true }); + + const Embed = new EmbedBuilder() + .setAuthor({ name: interaction.user.username, iconURL: interaction.user.displayAvatarURL() }) + .addFields([ + { name: 'Channel ID', value: interaction.channel.id.toString(), inline: true }, + { name: 'Message ID', value: interaction.id.toString(), inline: true }, + { name: 'Author', value: `${interaction.user.username} (${interaction.user.id})`, inline: true }, + ]) + .setTimestamp(); + + if (interaction.guild) { + Embed.addFields([ + { name: 'Guild', value: `${interaction.guild.name} (${interaction.guild.id})`, inline: true }, + { name: 'Message link', value: `https://discord.com/channels/${interaction.guild.id}/${interaction.channel.id}/${interaction.id}` }, + ]); + } + else { + Embed.addFields([ + { name: 'Message link', value: `https://discord.com/channels/@me/${interaction.channel.id}/${interaction.id}` }, + ]); + } + + const channel = interaction.client.channels.resolve(ytpChannelId); + // Send as 2 separate message otherwise the url won't get embedded. + channel.send({ content: url }); + return channel.send({ embeds: [Embed] }); + + + } + }); + }, +}; diff --git a/scripts/deploy-commands.cjs b/scripts/deploy-commands.cjs index a55c2b33..6b44b6ed 100644 --- a/scripts/deploy-commands.cjs +++ b/scripts/deploy-commands.cjs @@ -1,4 +1,4 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); +const { SlashCommandBuilder } = require('discord.js'); const { REST } = require('@discordjs/rest'); const { Routes } = require('discord-api-types/v9'); const { PermissionFlagsBits } = require('discord.js'); @@ -174,6 +174,14 @@ const commands = [ option.setName('force') .setDescription('Force the generation of the video in non-nsfw channel.') .setRequired(false)), + + new SlashCommandBuilder() + .setName('addytp') + .setDescription('Add a video to the pool of ytps') + .addStringOption(option => + option.setName('url') + .setDescription('URL of the video you want to add.') + .setRequired(true)), ] .map(command => command.toJSON());