V14 update, added category and made it work with message event

This commit is contained in:
Supositware 2022-08-28 17:03:15 +02:00
parent bb49cfd490
commit ef61db520b
17 changed files with 138 additions and 95 deletions

View file

@ -1,5 +1,5 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { MessageEmbed } from 'discord.js'; import { EmbedBuilder } from 'discord.js';
import TurndownService from 'turndown'; import TurndownService from 'turndown';
const turndown = new TurndownService(); const turndown = new TurndownService();
import fetch from 'node-fetch'; import fetch from 'node-fetch';
@ -14,8 +14,9 @@ export default {
option.setName('board') option.setName('board')
.setDescription('The board you wish to see') .setDescription('The board you wish to see')
.setRequired(true)), .setRequired(true)),
async execute(interaction) { category: 'fun',
let board = interaction.options.getString('board'); async execute(interaction, args) {
let board = args[0];
if (fourChan[board] == undefined) { if (fourChan[board] == undefined) {
return interaction.reply({ content: 'Uh oh! The board you are looking for does not exist? You think this is a mistake? Please send a feedback telling me so!', ephemeral: true }); return interaction.reply({ content: 'Uh oh! The board you are looking for does not exist? You think this is a mistake? Please send a feedback telling me so!', ephemeral: true });
@ -65,7 +66,7 @@ export default {
title = 'No title'; title = 'No title';
} }
const FourchanEmbed = new MessageEmbed() const FourchanEmbed = new EmbedBuilder()
.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY') .setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
.setTitle(turndown.turndown(title)) .setTitle(turndown.turndown(title))
.setDescription(turndown.turndown(description)) .setDescription(turndown.turndown(description))

View file

@ -1,5 +1,5 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { Permissions } from 'discord.js'; import { PermissionFlagsBits } from 'discord.js';
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('fakeuser') .setName('fakeuser')
@ -16,12 +16,14 @@ export default {
option.setName('image') option.setName('image')
.setDescription('Optional attachment.') .setDescription('Optional attachment.')
.setRequired(false)), .setRequired(false)),
clientPermissions: [ Permissions.FLAGS.MANAGE_WEBHOOKS ], category: 'fun',
async execute(interaction) { clientPermissions: [ PermissionFlagsBits.ManageWebhooks ],
async execute(interaction, args) {
await interaction.deferReply({ ephemeral: true }); await interaction.deferReply({ ephemeral: true });
const attachment = interaction.options.getAttachment('image'); const member = args[0];
const message = interaction.options.getString('message'); const message = args[1];
const member = interaction.options.getMentionable('user'); const attachment = args[2];
const webhook = await interaction.channel.createWebhook(member.user.username, { const webhook = await interaction.channel.createWebhook(member.user.username, {
avatar: member.user.displayAvatarURL(), avatar: member.user.displayAvatarURL(),

View file

@ -1,10 +1,11 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('inspirobot') .setName('inspirobot')
.setDescription('Get an image from inspirobot'), .setDescription('Get an image from inspirobot'),
category: 'fun',
async execute(interaction) { async execute(interaction) {
fetch('http://inspirobot.me/api?generate=true') fetch('http://inspirobot.me/api?generate=true')
.then(res => res.text()) .then(res => res.text())

View file

@ -1,5 +1,5 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { MessageEmbed } from 'discord.js'; import { EmbedBuilder } from 'discord.js';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
export default { export default {
@ -10,10 +10,11 @@ export default {
option.setName('subreddit') option.setName('subreddit')
.setDescription('The subreddit you wish to see') .setDescription('The subreddit you wish to see')
.setRequired(true)), .setRequired(true)),
async execute(interaction) { category: 'fun',
async execute(interaction, args) {
await interaction.deferReply({ ephemeral: false }); await interaction.deferReply({ ephemeral: false });
const subreddit = args[0];
fetch('https://www.reddit.com/r/' + interaction.options.getString('subreddit') + '.json?limit=100').then((response) => { fetch('https://www.reddit.com/r/' + subreddit + '.json?limit=100').then((response) => {
return response.json(); return response.json();
}).then((response) => { }).then((response) => {
if (response.error == 404) { if (response.error == 404) {
@ -27,7 +28,7 @@ export default {
if (response.data.children[i].data.over_18 == true && !interaction.channel.nsfw) { if (response.data.children[i].data.over_18 == true && !interaction.channel.nsfw) {
return interaction.editReply('No nsfw'); return interaction.editReply('No nsfw');
} }
const redditEmbed = new MessageEmbed() const redditEmbed = new EmbedBuilder()
.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY') .setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
.setTitle(response.data.children[i].data.title) .setTitle(response.data.children[i].data.title)
.setDescription(response.data.children[i].data.selftext) .setDescription(response.data.children[i].data.selftext)

View file

@ -1,4 +1,4 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
@ -8,8 +8,9 @@ export default {
option.setName('something') option.setName('something')
.setDescription('🤫') .setDescription('🤫')
.setRequired(true)), .setRequired(true)),
async execute(interaction) { category: 'fun',
const command = interaction.options.getString('something'); async execute(interaction, args) {
const command = args[0];
if (command === 'levertowned') { if (command === 'levertowned') {
interaction.reply('Hello buddy bro <:youngtroll:488559163832795136> <@434762632004894746>'); interaction.reply('Hello buddy bro <:youngtroll:488559163832795136> <@434762632004894746>');

View file

@ -1,5 +1,5 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { MessageEmbed } from 'discord.js'; import { EmbedBuilder } from 'discord.js';
import Twit from 'twit'; import Twit from 'twit';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
import os from 'node:os'; import os from 'node:os';
@ -25,16 +25,19 @@ export default {
option.setName('image') option.setName('image')
.setDescription('Optional attachment (Image only.)') .setDescription('Optional attachment (Image only.)')
.setRequired(false)), .setRequired(false)),
category: 'fun',
ratelimit: 3, ratelimit: 3,
cooldown: 3600, cooldown: 3600,
async execute(interaction) { async execute(interaction, args, client) {
if (!interaction.options.getString('content') && !interaction.options.getAttachment('image')) { const content = args[0];
const attachment = args[1];
if (!content && !attachment) {
return interaction.reply({ content: 'Uh oh! You are missing any content for me to tweet!', ephemeral: true }); return interaction.reply({ content: 'Uh oh! You are missing any content for me to tweet!', ephemeral: true });
} }
await interaction.deferReply({ ephemeral: false }); await interaction.deferReply({ ephemeral: false });
let tweet = interaction.options.getString('content'); let tweet = content;
const attachment = interaction.options.getAttachment('image');
const date = new Date(); const date = new Date();
// If account is less than 6 months old don't accept the tweet ( alt prevention ) // If account is less than 6 months old don't accept the tweet ( alt prevention )
if (interaction.user.createdAt > date.setMonth(date.getMonth() - 6)) { if (interaction.user.createdAt > date.setMonth(date.getMonth() - 6)) {
@ -170,30 +173,34 @@ export default {
const TweetLink = `https://twitter.com/${FunnyWords[Math.floor((Math.random() * FunnyWords.length))]}/status/${tweetid}`; const TweetLink = `https://twitter.com/${FunnyWords[Math.floor((Math.random() * FunnyWords.length))]}/status/${tweetid}`;
// Im too lazy for now to make an entry in config.json // Im too lazy for now to make an entry in config.json
let channel = interaction.client.channels.resolve(twiChannel); let channel = client.channels.resolve(twiChannel);
channel.send(TweetLink); channel.send(TweetLink);
const Embed = new MessageEmbed() const Embed = new EmbedBuilder()
.setAuthor({ name: interaction.user.username, iconURL: interaction.user.displayAvatarURL() }) .setAuthor({ name: interaction.user.username, iconURL: interaction.user.displayAvatarURL() })
.setDescription(tweet) .setDescription(tweet)
.addField('Link', TweetLink, true) .addFields(
.addField('Tweet ID', tweetid, true) { name: 'Link', value: TweetLink, inline: true },
.addField('Channel ID', interaction.channel.id, true) { name: 'Tweet ID', value: tweetid, inline: true },
.addField('Messsage ID', interaction.id, true) { name: 'Channel ID', value: interaction.channel.id, inline: true },
.addField('Author', `${interaction.user.username} (${interaction.user.id})`, true) { name: 'Message ID', value: interaction.id, inline: true },
{ name: 'Author', value: `${interaction.user.username} (${interaction.user.id})`, inline: true },
)
.setTimestamp(); .setTimestamp();
if (interaction.guild) { if (interaction.guild) {
Embed.addField('Guild', `${interaction.guild.name} (${interaction.guild.id})`, true); Embed.addFields(
Embed.addField('message link', `https://discord.com/channels/${interaction.guild.id}/${interaction.channel.id}/${interaction.id}`); { 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}`, inline: true },
);
} }
else { else {
Embed.addField('message link', `https://discord.com/channels/@me/${interaction.channel.id}/${interaction.id}`); Embed.addFields({ name: 'message link', value: `https://discord.com/channels/@me/${interaction.channel.id}/${interaction.id}` });
} }
if (attachment) Embed.setImage(attachment.url); if (attachment) Embed.setImage(attachment.url);
channel = interaction.client.channels.resolve(twiLogChannel); channel = client.channels.resolve(twiLogChannel);
channel.send({ embeds: [Embed] }); channel.send({ embeds: [Embed] });
return interaction.editReply({ content: `Go see ur epic tweet ${TweetLink}` }); return interaction.editReply({ content: `Go see ur epic tweet ${TweetLink}` });
}); });

View file

@ -1,4 +1,4 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import Twit from 'twit'; import Twit from 'twit';
import dotenv from 'dotenv'; import dotenv from 'dotenv';
@ -13,6 +13,7 @@ export default {
option.setName('tweetid') option.setName('tweetid')
.setDescription('The id of the tweet you wish to delete.') .setDescription('The id of the tweet you wish to delete.')
.setRequired(true)), .setRequired(true)),
category: 'owner',
ownerOnly: true, ownerOnly: true,
async execute(interaction) { async execute(interaction) {
await interaction.deferReply(); await interaction.deferReply();

View file

@ -1,9 +1,10 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('die') .setName('die')
.setDescription('Kill the bot'), .setDescription('Kill the bot'),
category: 'owner',
ownerOnly: true, ownerOnly: true,
async execute(interaction) { async execute(interaction) {
console.log('\x1b[31m\x1b[47m\x1b[5mSHUTING DOWN!!!!!\x1b[0m'); console.log('\x1b[31m\x1b[47m\x1b[5mSHUTING DOWN!!!!!\x1b[0m');

View file

@ -1,5 +1,4 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { ButtonStyle, SlashCommandBuilder, ButtonBuilder, ActionRowBuilder } from 'discord.js';
import { MessageButton, MessageActionRow } from 'discord.js';
import db from '../../models/index.js'; import db from '../../models/index.js';
const Blacklists = db.Blacklists; const Blacklists = db.Blacklists;
@ -19,6 +18,7 @@ export default {
option.setName('reason') option.setName('reason')
.setDescription('The reason of the blacklist.') .setDescription('The reason of the blacklist.')
.setRequired(false)), .setRequired(false)),
category: 'owner',
ownerOnly: true, ownerOnly: true,
async execute(interaction) { async execute(interaction) {
await interaction.deferReply({ ephemeral: true }); await interaction.deferReply({ ephemeral: true });
@ -38,18 +38,18 @@ export default {
return interaction.editReply(`${user} has been blacklisted from ${command} with the following reason ${reason}`); return interaction.editReply(`${user} has been blacklisted from ${command} with the following reason ${reason}`);
} }
else { else {
const row = new MessageActionRow() const row = new ActionRowBuilder()
.addComponents( .addComponents(
new MessageButton() new ButtonBuilder()
.setCustomId('yes') .setCustomId('yes')
.setLabel('Yes') .setLabel('Yes')
.setStyle('PRIMARY'), .setStyle(ButtonStyle.Primary),
) )
.addComponents( .addComponents(
new MessageButton() new ButtonBuilder()
.setCustomId('no') .setCustomId('no')
.setLabel('No') .setLabel('No')
.setStyle('DANGER'), .setStyle(ButtonStyle.Danger),
); );
await interaction.editReply({ content: 'This user is already blacklisted, do you want to unblacklist him?', ephemeral: true, components: [row] }); await interaction.editReply({ content: 'This user is already blacklisted, do you want to unblacklist him?', ephemeral: true, components: [row] });

View file

@ -1,5 +1,5 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { MessageEmbed } from 'discord.js'; import { EmbedBuilder } from 'discord.js';
import { exec } from 'node:child_process'; import { exec } from 'node:child_process';
import db from '../../models/index.js'; import db from '../../models/index.js';
const donator = db.donator; const donator = db.donator;
@ -12,6 +12,7 @@ export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('about') .setName('about')
.setDescription('About me (The bot)'), .setDescription('About me (The bot)'),
category: 'utility',
async execute(interaction) { async execute(interaction) {
const Donator = await donator.findAll({ order: ['id'] }); const Donator = await donator.findAll({ order: ['id'] });
const client = interaction.client; const client = interaction.client;
@ -39,16 +40,19 @@ export default {
// description += '\nThanks to Jetbrains for providing their IDE!'; // description += '\nThanks to Jetbrains for providing their IDE!';
exec('git rev-parse --short HEAD', (err, stdout) => { exec('git rev-parse --short HEAD', (err, stdout) => {
const aboutEmbed = new MessageEmbed() const aboutEmbed = new EmbedBuilder()
.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY') .setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
.setAuthor({ name: client.user.tag, iconURL: client.user.displayAvatarURL(), url: 'https://libtar.de' }) .setAuthor({ name: client.user.tag, iconURL: client.user.displayAvatarURL(), url: 'https://libtar.de' })
.setTitle('About me') .setTitle('About me')
.setDescription(description) .setDescription(description)
.addField('Current commit', stdout) .addFields(
.addField('Current maintainer: ', `${maintainer.tag} (${ownerId})`) { name: 'Current commit', value: stdout },
.addField('Gitea (Main)', 'https://git.namejeff.xyz/Supositware/Haha-Yes', true) { name: 'Current maintainer', value: `${maintainer.tag} (${ownerId})` },
.addField('Github (Mirror)', 'https://github.com/Supositware/Haha-yes', true) { name: 'Gitea (Main)', value: 'https://git.namejeff.xyz/Supositware/Haha-Yes', inline: true },
.addField('Privacy Policy', 'https://libtar.de/discordprivacy.txt') { name: 'Github (Mirror)', value: 'https://github.com/Supositware/Haha-yes', inline: true },
{ name: 'Privacy Policy', value: 'https://libtar.de/discordprivacy.txt' },
)
.setFooter({ text: `Original bot made by ${owner.tag} (267065637183029248)` }); .setFooter({ text: `Original bot made by ${owner.tag} (267065637183029248)` });
interaction.reply({ embeds: [aboutEmbed] }); interaction.reply({ embeds: [aboutEmbed] });

View file

@ -1,18 +1,19 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { MessageEmbed } from 'discord.js'; import { EmbedBuilder } from 'discord.js';
import donations from '../../json/donations.json' assert {type: 'json'}; import donations from '../../json/donations.json' assert {type: 'json'};
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('donate') .setName('donate')
.setDescription('Show donation link for the bot.'), .setDescription('Show donation link for the bot.'),
category: 'utility',
async execute(interaction) { async execute(interaction) {
let desc = 'If you decide to donate, please do /feedback to let the owner know about it so he can put you in the about and donator command.'; let desc = 'If you decide to donate, please do /feedback to let the owner know about it so he can put you in the about and donator command.';
donations.forEach(m => { donations.forEach(m => {
desc += `\n${m}`; desc += `\n${m}`;
}); });
const Embed = new MessageEmbed() const Embed = new EmbedBuilder()
.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY') .setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
.setTitle('Donation link') .setTitle('Donation link')
.setDescription(desc); .setDescription(desc);

View file

@ -1,4 +1,4 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import db from '../../models/index.js'; import db from '../../models/index.js';
const donator = db.donator; const donator = db.donator;
@ -6,6 +6,7 @@ export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('donator') .setName('donator')
.setDescription('All the people who donated for this bot <3'), .setDescription('All the people who donated for this bot <3'),
category: 'utility',
async execute(interaction) { async execute(interaction) {
await interaction.deferReply(); await interaction.deferReply();
const client = interaction.client; const client = interaction.client;

View file

@ -1,10 +1,12 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder } from 'discord.js';
import { MessageEmbed, MessageActionRow, MessageSelectMenu } from 'discord.js';
import { exec } from 'node:child_process'; import { exec } from 'node:child_process';
import fs from 'node:fs'; import fs from 'node:fs';
import os from 'node:os'; import os from 'node:os';
import utils from '../../utils/videos.js'; import utils from '../../utils/videos.js';
let client;
let cleanUp;
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('download') .setName('download')
@ -21,17 +23,29 @@ export default {
option.setName('compress') option.setName('compress')
.setDescription('Compress the video?') .setDescription('Compress the video?')
.setRequired(false)), .setRequired(false)),
category: 'utility',
async execute(interaction, args, c) {
client = c;
const url = args[0];
const format = args[1];
interaction.doCompress = args[2];
if (interaction.cleanUp) {
cleanUp = interaction.cleanUp;
}
async execute(interaction) {
await interaction.deferReply({ ephemeral: false }); await interaction.deferReply({ ephemeral: false });
const url = interaction.options.getString('url');
if (interaction.isMessage) {
interaction.delete();
}
if (!await utils.stringIsAValidurl(url)) { if (!await utils.stringIsAValidurl(url)) {
console.error(`Not a url!!! ${url}`); console.error(`Not a url!!! ${url}`);
return interaction.editReply({ content: '❌ This does not look like a valid url!', ephemeral: true }); return interaction.editReply({ content: '❌ This does not look like a valid url!', ephemeral: true });
} }
if (interaction.options.getBoolean('format')) { if (format) {
let qualitys = await new Promise((resolve, reject) => { let qualitys = await new Promise((resolve, reject) => {
exec(`./bin/yt-dlp "${url}" --print "%()j"`, (err, stdout, stderr) => { exec(`./bin/yt-dlp "${url}" --print "%()j"`, (err, stdout, stderr) => {
if (err) { if (err) {
@ -71,9 +85,9 @@ export default {
options.reverse(); options.reverse();
} }
const row = new MessageActionRow() const row = new ActionRowBuilder()
.addComponents( .addComponents(
new MessageSelectMenu() new SelectMenuBuilder()
.setCustomId('downloadQuality') .setCustomId('downloadQuality')
.setPlaceholder('Nothing selected') .setPlaceholder('Nothing selected')
.setMinValues(1) .setMinValues(1)
@ -84,7 +98,7 @@ export default {
await interaction.deleteReply(); await interaction.deleteReply();
await interaction.followUp({ content: 'Which quality do you want?', ephemeral: true, components: [row] }); await interaction.followUp({ content: 'Which quality do you want?', ephemeral: true, components: [row] });
interaction.client.once('interactionCreate', async (interactionMenu) => { client.once('interactionCreate', async (interactionMenu) => {
if (!interactionMenu.isSelectMenu()) return; if (!interactionMenu.isSelectMenu()) return;
if (interactionMenu.customId === 'downloadQuality') { if (interactionMenu.customId === 'downloadQuality') {
await interactionMenu.deferReply({ ephemeral: false }); await interactionMenu.deferReply({ ephemeral: false });
@ -99,7 +113,7 @@ export default {
async function download(url, interaction, originalInteraction) { async function download(url, interaction, originalInteraction) {
let format = 'bestvideo*+bestaudio/best'; let format = 'bestvideo*+bestaudio/best';
const Embed = new MessageEmbed() const Embed = new EmbedBuilder()
.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY') .setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
.setAuthor({ name: `Downloaded by ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL(), url: url }) .setAuthor({ name: `Downloaded by ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL(), url: url })
.setFooter({ text: `You can get the original video by clicking on the "Downloaded by ${interaction.user.tag}" message!` }); .setFooter({ text: `You can get the original video by clicking on the "Downloaded by ${interaction.user.tag}" message!` });
@ -117,7 +131,7 @@ async function download(url, interaction, originalInteraction) {
const fileStat = fs.statSync(output); const fileStat = fs.statSync(output);
const fileSize = fileStat.size / 1000000.0; const fileSize = fileStat.size / 1000000.0;
const compressInteraction = originalInteraction ? originalInteraction : interaction; const compressInteraction = originalInteraction ? originalInteraction : interaction;
if (compressInteraction.options.getBoolean('compress')) { if (compressInteraction.doCompress) {
const presets = [ 'Discord Tiny 5 Minutes 240p30', 'Discord Small 2 Minutes 360p30', 'Discord Nitro Small 10-20 Minutes 480p30', 'Discord Nitro Medium 5-10 Minutes 720p30', 'Discord Nitro Large 3-6 Minutes 1080p30' ]; const presets = [ 'Discord Tiny 5 Minutes 240p30', 'Discord Small 2 Minutes 360p30', 'Discord Nitro Small 10-20 Minutes 480p30', 'Discord Nitro Medium 5-10 Minutes 720p30', 'Discord Nitro Large 3-6 Minutes 1080p30' ];
const options = []; const options = [];
@ -128,9 +142,9 @@ async function download(url, interaction, originalInteraction) {
}); });
}); });
const row = new MessageActionRow() const row = new ActionRowBuilder()
.addComponents( .addComponents(
new MessageSelectMenu() new SelectMenuBuilder()
.setCustomId('preset') .setCustomId('preset')
.setPlaceholder('Nothing selected') .setPlaceholder('Nothing selected')
.addOptions(options), .addOptions(options),
@ -138,11 +152,12 @@ async function download(url, interaction, originalInteraction) {
await interaction.deleteReply(); await interaction.deleteReply();
await interaction.followUp({ content: 'Which compression preset do you want?', ephemeral: true, components: [row] }); await interaction.followUp({ content: 'Which compression preset do you want?', ephemeral: true, components: [row] });
interaction.client.once('interactionCreate', async (interactionMenu) => { client.once('interactionCreate', async (interactionMenu) => {
if (!interactionMenu.isSelectMenu()) return; if (!interactionMenu.isSelectMenu()) return;
if (interactionMenu.customId === 'preset') { if (interactionMenu.customId === 'preset') {
await interactionMenu.deferReply({ ephemeral: false }); await interactionMenu.deferReply({ ephemeral: false });
compress(file, interactionMenu, Embed); compress(file, interactionMenu, Embed);
cleanUp();
} }
}); });
return; return;
@ -163,6 +178,7 @@ async function download(url, interaction, originalInteraction) {
else { else {
await interaction.editReply({ embeds: [Embed], files: [output], ephemeral: false }); await interaction.editReply({ embeds: [Embed], files: [output], ephemeral: false });
} }
cleanUp();
}) })
.catch(async err => { .catch(async err => {
console.error(err); console.error(err);

View file

@ -1,5 +1,5 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { MessageEmbed } from 'discord.js'; import { EmbedBuilder } from 'discord.js';
const { feedbackChannelId } = process.env; const { feedbackChannelId } = process.env;
@ -11,13 +11,14 @@ export default {
option.setName('feedback') option.setName('feedback')
.setDescription('The message you want to send me.') .setDescription('The message you want to send me.')
.setRequired(true)), .setRequired(true)),
async execute(interaction) { category: 'utility',
const Embed = new MessageEmbed() async execute(interaction, args) {
const Embed = new EmbedBuilder()
.setAuthor({ name: `${interaction.user.tag} (${interaction.user.id})`, iconURL: interaction.user.avatarURL() }) .setAuthor({ name: `${interaction.user.tag} (${interaction.user.id})`, iconURL: interaction.user.avatarURL() })
.setTimestamp(); .setTimestamp();
if (interaction.guild) Embed.addField('Guild', `${interaction.guild.name} (${interaction.guild.id})`, true); if (interaction.guild) Embed.addFields({ name: 'Guild', value: `${interaction.guild.name} (${interaction.guild.id})`, inline: true });
Embed.addField('Feedback', interaction.options.getString('feedback')); Embed.addFields({ name: 'Feedback', value: args[0], inline: true });
// Don't let new account use this command to prevent spam // Don't let new account use this command to prevent spam
const date = new Date(); const date = new Date();

View file

@ -1,9 +1,10 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('ping') .setName('ping')
.setDescription('Replies with Pong!'), .setDescription('Replies with Pong!'),
category: 'utility',
async execute(interaction) { async execute(interaction) {
await interaction.reply(`Pong! \`${Math.round(interaction.client.ws.ping)} ms\``); await interaction.reply(`Pong! \`${Math.round(interaction.client.ws.ping)} ms\``);
}, },

View file

@ -1,11 +1,12 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import { MessageEmbed, version } from 'discord.js'; import { EmbedBuilder, version } from 'discord.js';
import os from 'node:os'; import os from 'node:os';
export default { export default {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('stats') .setName('stats')
.setDescription('Show some stats about the bot'), .setDescription('Show some stats about the bot'),
category: 'utility',
async execute(interaction) { async execute(interaction) {
const client = interaction.client; const client = interaction.client;
const uptime = process.uptime(); const uptime = process.uptime();
@ -32,19 +33,21 @@ export default {
return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
}; };
const statsEmbed = new MessageEmbed() const statsEmbed = new EmbedBuilder()
.setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY') .setColor(interaction.member ? interaction.member.displayHexColor : 'NAVY')
.setTitle('Bot stats') .setTitle('Bot stats')
.setAuthor({ name: client.user.tag, iconURL: client.user.displayAvatarURL(), url: 'https://libtar.de' }) .setAuthor({ name: client.user.tag, iconURL: client.user.displayAvatarURL(), url: 'https://libtar.de' })
.addField('Servers', client.guilds.cache.size.toString(), true) .addFields(
.addField('Channels', client.channels.cache.size.toString(), true) { name: 'Servers', value: client.guilds.cache.size.toString(), inline: true },
.addField('Users', client.users.cache.size.toString(), true) { name: 'Channels', value: client.channels.cache.size.toString(), inline: true },
.addField('Ram usage', `${bytesToSize(process.memoryUsage().heapUsed)}/${bytesToSize(os.totalmem)}`, true) { name: 'Users', value: client.users.cache.size.toString(), inline: true },
.addField('CPU', `${os.cpus()[0].model} (${os.cpus().length} core)`, true) { name: 'Ram usage', value: `${bytesToSize(process.memoryUsage().heapUsed)}/${bytesToSize(os.totalmem)}`, inline: true },
.addField('OS', `${os.platform()} ${os.release()}`, true) { name: 'CPU', value: `${os.cpus()[0].model} (${os.cpus().length} core)`, inline: true },
.addField('Nodejs version', process.version, true) { name: 'OS', value: `${os.platform()} ${os.release()}`, inline: true },
.addField('Discord.js version', version, true) { name: 'Nodejs version', value: process.version, inline: true },
.addField('Uptime', dateString, true) { name: 'Discord.js version', value: version, inline: true },
{ name: 'Uptime', value: dateString, inline: true },
)
.setTimestamp(); .setTimestamp();
return interaction.reply({ embeds: [statsEmbed] }); return interaction.reply({ embeds: [statsEmbed] });

View file

@ -1,4 +1,4 @@
import { SlashCommandBuilder } from '@discordjs/builders'; import { SlashCommandBuilder } from 'discord.js';
import utils from '../../utils/videos.js'; import utils from '../../utils/videos.js';
import fs from 'node:fs'; import fs from 'node:fs';
import os from 'node:os'; import os from 'node:os';
@ -14,9 +14,10 @@ export default {
option.setName('url') option.setName('url')
.setDescription('URL of the video you want to convert') .setDescription('URL of the video you want to convert')
.setRequired(true)), .setRequired(true)),
async execute(interaction) { category: 'utility',
async execute(interaction, args) {
await interaction.deferReply({ ephemeral: false }); await interaction.deferReply({ ephemeral: false });
const url = interaction.options.getString('url'); const url = args[0];
if (!await utils.stringIsAValidurl(url)) { if (!await utils.stringIsAValidurl(url)) {
console.error(`Not a url!!! ${url}`); console.error(`Not a url!!! ${url}`);