This commit is contained in:
Jonny_Bro (Nikita) 2023-03-24 00:09:26 +05:00
parent 94a6e5fc0f
commit ce9799a17f
20 changed files with 226 additions and 598 deletions

View file

@ -1,5 +1,5 @@
const { Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder } = require("discord.js"),
{ Player } = require("discord-player-play-dl"),
{ Player } = require("discord-player"),
{ GiveawaysManager } = require("discord-giveaways"),
{ REST } = require("@discordjs/rest"),
{ Routes } = require("discord-api-types/v10");
@ -43,7 +43,7 @@ class JaBa extends Client {
this.databaseCache.usersReminds = new Collection();
this.databaseCache.mutedUsers = new Collection();
this.player = new Player(this);
this.player = Player.singleton(this);
playdl.getFreeClientID().then(id => playdl.setToken({
soundcloud: {
@ -51,7 +51,7 @@ class JaBa extends Client {
},
}));
this.player.on("trackStart", async (queue, track) => {
this.player.events.on("playerStart", async (queue, track) => {
const m = await queue.metadata.channel.send({ content: this.translate("music/play:NOW_PLAYING", { songName: track.title }, queue.metadata.channel.guild.data.language) });
if (track.durationMS > 1)
setTimeout(() => {
@ -60,16 +60,16 @@ class JaBa extends Client {
else
setTimeout(() => {
if (m.deletable) m.delete();
}, (10 * 60 * 1000)); // m * s * ms
}, (5 * 60 * 1000)); // m * s * ms
});
this.player.on("queueEnd", queue => queue.metadata.channel.send(this.translate("music/play:QUEUE_ENDED", null, queue.metadata.channel.guild.data.language)));
this.player.on("channelEmpty", queue => queue.metadata.channel.send(this.translate("music/play:STOP_EMPTY", null, queue.metadata.channel.guild.data.language)));
this.player.on("connectionError", (queue, e) => {
console.error(e);
this.player.events.on("emptyQueue", queue => queue.metadata.channel.send(this.translate("music/play:QUEUE_ENDED", null, queue.metadata.channel.guild.data.language)));
this.player.events.on("emptyChannel", queue => queue.metadata.channel.send(this.translate("music/play:STOP_EMPTY", null, queue.metadata.channel.guild.data.language)));
this.player.events.on("playerError", (queue, e) => {
console.log(e);
queue.metadata.channel.send({ content: this.translate("music/play:ERR_OCCURRED", { error: e.message }, queue.metadata.channel.guild.data.language) });
});
this.player.on("error", (queue, e) => {
console.error(e);
this.player.events.on("error", (queue, e) => {
console.log(e);
queue.metadata.channel.send({ content: this.translate("music/play:ERR_OCCURRED", { error: e.message }, queue.metadata.channel.guild.data.language) });
});

View file

@ -34,11 +34,11 @@ class Back extends BaseCommand {
const voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { ephemeral: true });
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { ephemeral: true });
if (!queue.previousTracks[0]) return interaction.error("music/back:NO_PREV_SONG", null, { ephemeral: true });
if (queue.history.isEmpty()) return interaction.error("music/back:NO_PREV_SONG", null, { ephemeral: true });
queue.back();
queue.history.back();
interaction.success("music/back:SUCCESS");
}
}

View file

@ -1,5 +1,5 @@
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, EmbedBuilder, ButtonStyle } = require("discord.js"),
{ joinVoiceChannel, createAudioResource, createAudioPlayer, getVoiceConnection, AudioPlayerStatus } = require("@discordjs/voice");
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js"),
{ QueryType } = require("discord-player");
const BaseCommand = require("../../base/BaseCommand"),
fs = require("fs");
@ -16,7 +16,8 @@ class Clips extends BaseCommand {
.setDMPermission(false)
.addStringOption(option => option.setName("query")
.setDescription(client.translate("music/clips:QUERY"))
.setRequired(true)),
.setRequired(true)
.setAutocomplete(true)),
aliases: [],
dirname: __dirname,
ownerOnly: false,
@ -36,195 +37,54 @@ class Clips extends BaseCommand {
* @param {Object} data
*/
async execute(client, interaction) {
fs.readdir("./clips", async function (err, files) {
await interaction.deferReply();
const query = interaction.options.getString("query");
const query = interaction.options.getString("query"),
voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { edit: true });
const perms = voice.permissionsFor(client.user);
if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return interaction.error("music/play:VOICE_CHANNEL_CONNECT", null, { edit: true });
client.player.play(interaction.member.voice.channel, query, {
nodeOptions: {
metadata: {
channel: interaction.channel,
client,
requestedBy: interaction.user,
},
},
searchEngine: QueryType.FILE,
selfDeaf: true,
leaveOnEnd: false,
leaveOnStop: true,
skipOnNoStream: true,
bufferingTimeout: 1000,
});
if (err) {
interaction.editReply({
content: "```js\n" + err + "```",
});
return console.log("Unable to read directory: " + err);
}
if (query === "list") {
const clips = files.map(file => file.substring(0, file.length - 4));
let currentPage = 0;
const embeds = generateClipsEmbeds(interaction, clips);
const row = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId("clips_prev_page")
.setStyle(ButtonStyle.Primary)
.setEmoji("⬅️"),
new ButtonBuilder()
.setCustomId("clips_next_page")
.setStyle(ButtonStyle.Primary)
.setEmoji("➡️"),
new ButtonBuilder()
.setCustomId("clips_jump_page")
.setStyle(ButtonStyle.Secondary)
.setEmoji("↗️"),
new ButtonBuilder()
.setCustomId("clips_stop")
.setStyle(ButtonStyle.Danger)
.setEmoji("⏹️"),
);
await interaction.editReply({
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
embeds: [embeds[currentPage]],
components: [row],
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (20 * 1000) });
collector.on("collect", async i => {
if (i.isButton()) {
if (i.customId === "clips_prev_page") {
i.deferUpdate();
if (currentPage !== 0) {
--currentPage;
interaction.editReply({
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
embeds: [embeds[currentPage]],
components: [row],
});
}
} else if (i.customId === "clips_next_page") {
i.deferUpdate();
if (currentPage < embeds.length - 1) {
currentPage++;
interaction.editReply({
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
embeds: [embeds[currentPage]],
components: [row],
});
}
} else if (i.customId === "clips_jump_page") {
i.deferUpdate();
const msg = await interaction.followUp({
content: interaction.translate("misc:JUMP_TO_PAGE", {
length: embeds.length,
content: interaction.translate("music/play:ADDED_QUEUE", {
songName: query.substring(8, query.length - 4),
}),
fetchReply: true,
});
const filter = res => {
return res.author.id === interaction.user.id && !isNaN(res.content);
};
interaction.channel.awaitMessages({ filter, max: 1, time: (10 * 1000) }).then(collected => {
if (embeds[collected.first().content - 1]) {
currentPage = collected.first().content - 1;
interaction.editReply({
content: `${interaction.translate("common:PAGE")}: **${currentPage + 1}**/**${embeds.length}**`,
embeds: [embeds[currentPage]],
components: [row],
});
if (collected.first().deletable) collected.first().delete();
if (msg.deletable) msg.delete();
} else {
if (collected.first().deletable) collected.first().delete();
if (msg.deletable) msg.delete();
return;
}
});
} else if (i.customId === "clips_stop") {
i.deferUpdate();
collector.stop();
}
}
});
collector.on("end", () => {
row.components.forEach(component => {
component.setDisabled(true);
});
return interaction.editReply({
components: [row],
});
});
} else {
const voice = interaction.member.voice.channel;
if (!voice) return interaction.editReply({ content: interaction.translate("music/play:NO_VOICE_CHANNEL") });
const queue = client.player.getQueue(interaction.guild.id);
if (queue) return interaction.editReply({ content: interaction.translate("music/clips:ACTIVE_QUEUE") });
if (getVoiceConnection(interaction.guild.id)) return interaction.editReply({ content: interaction.translate("music/clips:ACTIVE_CLIP") });
if (!fs.existsSync(`./clips/${query}.mp3`)) return interaction.editReply({ content: interaction.translate("music/clips:NO_CLIP", { file: query }) });
try {
const connection = joinVoiceChannel({
channelId: voice.id,
guildId: interaction.guild.id,
adapterCreator: interaction.guild.voiceAdapterCreator,
});
const resource = createAudioResource(fs.createReadStream(`./clips/${query}.mp3`));
const player = createAudioPlayer()
.on("error", err => {
connection.destroy();
console.error(err.message);
});
player.play(resource);
connection.subscribe(player);
player.on(AudioPlayerStatus.Idle, () => {
connection.destroy();
});
} catch (error) {
console.error(error);
}
await interaction.editReply({
content: interaction.translate("music/clips:PLAYING", {
clip: query,
}),
components: [],
});
}
});
}
}
/**
*
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} clips
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").AutocompleteInteraction} interaction
* @returns
*/
function generateClipsEmbeds(interaction, clips) {
const embeds = [];
let k = 10;
async autocompleteRun(client, interaction) {
const files = fs.readdirSync("./clips");
for (let i = 0; i < clips.length; i += 10) {
const current = clips.slice(i, k);
k += 10;
const page = current.join("\n");
const embed = new EmbedBuilder()
.setColor(interaction.client.config.embed.color)
.setFooter({
text: interaction.client.config.embed.footer,
})
.setTitle(interaction.translate("music/clips:CLIPS_LIST"))
.setDescription(page)
.setTimestamp();
embeds.push(embed);
return interaction.respond(
files.slice(0, 10).map(file => ({
name: file.substring(0, file.length - 4),
value: `./clips/${file}`,
}),
));
}
return embeds;
}
module.exports = Clips;

View file

@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require("discord.js"),
{ QueueRepeatMode } = require("discord-player-play-dl");
{ QueueRepeatMode } = require("discord-player");
const BaseCommand = require("../../base/BaseCommand");
class Loop extends BaseCommand {
@ -44,7 +44,7 @@ class Loop extends BaseCommand {
const voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { edit: true });
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { edit: true });
const type = interaction.options.getString("option"),

View file

@ -1,5 +1,5 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"),
{ QueueRepeatMode } = require("discord-player-play-dl");
{ QueueRepeatMode } = require("discord-player");
const BaseCommand = require("../../base/BaseCommand");
class Nowplaying extends BaseCommand {
@ -34,10 +34,10 @@ class Nowplaying extends BaseCommand {
async execute(client, interaction) {
await interaction.deferReply();
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { edit: true });
const progressBar = queue.createProgressBar(),
track = queue.current;
const progressBar = queue.node.createProgressBar(),
track = queue.currentTrack;
const embed = new EmbedBuilder()
.setAuthor({
@ -58,7 +58,7 @@ class Nowplaying extends BaseCommand {
{ name: "\u200B", value: "\u200B", inline: true },
{
name: interaction.translate("common:VIEWS"),
value: new Intl.NumberFormat(interaction.client.languages.find(language => language.name === interaction.guild.data.language).moment, { notation: "standard" }).format(track.views),
value: track.raw.live ? "" : new Intl.NumberFormat(interaction.client.languages.find(language => language.name === interaction.guild.data.language).moment, { notation: "standard" }).format(track.raw.views),
inline: true,
},
{

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionsBitField } = require("discord.js");
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Play extends BaseCommand {
@ -14,7 +14,8 @@ class Play extends BaseCommand {
.setDMPermission(false)
.addStringOption(option => option.setName("query")
.setDescription(client.translate("music/play:QUERY"))
.setRequired(true)),
.setRequired(true)
.setAutocomplete(true)),
aliases: [],
dirname: __dirname,
ownerOnly: false,
@ -43,195 +44,51 @@ class Play extends BaseCommand {
const perms = voice.permissionsFor(client.user);
if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return interaction.error("music/play:VOICE_CHANNEL_CONNECT", null, { edit: true });
try {
// eslint-disable-next-line no-var
var searchResult = await client.player.search(query, {
const searchResult = await client.player.search(query, {
requestedBy: interaction.user,
});
if (!searchResult.tracks[0] || !searchResult)
return interaction.error("music/play:NO_RESULT", { query, error: "Скорее всего видео заблокировано по региону" }, { edit: true });
} catch (error) {
console.log(error);
return interaction.editReply({
content: interaction.translate("music/play:NO_RESULT", {
query,
error,
}),
});
}
const queue = await client.player.getQueue(interaction.guildId) || client.player.createQueue(interaction.guild, {
metadata: { channel: interaction.channel },
autoSelfDeaf: true,
leaveOnEnd: true,
if (!searchResult.hasTracks()) return interaction.error("music/play:NO_RESULT", { query }, { edit: true });
else {
client.player.play(interaction.member.voice.channel, searchResult, {
nodeOptions: {
metadata: {
channel: interaction.channel,
client,
requestedBy: interaction.user,
},
},
selfDeaf: true,
leaveOnEnd: false,
leaveOnStop: true,
skipOnNoStream: true,
bufferingTimeout: 1000,
});
if (searchResult.searched) {
const row1 = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId("1")
.setStyle(ButtonStyle.Secondary)
.setEmoji("1⃣"),
new ButtonBuilder()
.setCustomId("2")
.setStyle(ButtonStyle.Secondary)
.setEmoji("2⃣"),
new ButtonBuilder()
.setCustomId("3")
.setStyle(ButtonStyle.Secondary)
.setEmoji("3⃣"),
new ButtonBuilder()
.setCustomId("4")
.setStyle(ButtonStyle.Secondary)
.setEmoji("4⃣"),
new ButtonBuilder()
.setCustomId("5")
.setStyle(ButtonStyle.Secondary)
.setEmoji("5⃣"),
);
const row2 = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId("6")
.setStyle(ButtonStyle.Secondary)
.setEmoji("6⃣"),
new ButtonBuilder()
.setCustomId("7")
.setStyle(ButtonStyle.Secondary)
.setEmoji("7⃣"),
new ButtonBuilder()
.setCustomId("8")
.setStyle(ButtonStyle.Secondary)
.setEmoji("8⃣"),
new ButtonBuilder()
.setCustomId("9")
.setStyle(ButtonStyle.Secondary)
.setEmoji("9⃣"),
new ButtonBuilder()
.setCustomId("10")
.setStyle(ButtonStyle.Secondary)
.setEmoji("🔟"),
);
const row3 = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId("search_cancel")
.setStyle(ButtonStyle.Secondary)
.setEmoji("❌"),
);
const rows = [row1, row2, row3];
const embed = new EmbedBuilder()
.setTitle(interaction.translate("music/play:RESULTS_TITLE", {
query,
}))
.setColor(client.config.embed.color)
.setDescription(searchResult.tracks.map(track => {
let views;
if (track.raw.live) views = "🔴 LIVE";
else views = new Intl.NumberFormat(interaction.client.languages.find(language => language.name === interaction.guild.data.language).moment, {
notation: "compact", compactDisplay: "short",
}).format(track.views);
return `${searchResult.tracks.indexOf(track) + 1}. [${track.title}](${track.url})\n> ${interaction.translate("common:VIEWS")}: **${views}**\n`;
}).join("\n"))
.setTimestamp();
await interaction.editReply({
embeds: [embed],
components: rows,
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (30 * 1000) });
collector.on("collect", async i => {
if (i.isButton()) {
if (i.customId >= 1 && i.customId <= 10) {
i.deferUpdate();
const selected = searchResult.tracks[i.customId - 1];
queue.addTrack(selected);
try {
if (!queue.connection) await queue.connect(interaction.member.voice.channel);
if (!queue.playing) await queue.play();
}
interaction.editReply({
content: interaction.translate("music/play:ADDED_QUEUE", {
songName: selected.title,
}),
components: [],
embeds: [],
});
collector.stop();
return;
} catch (error) {
client.player.deleteQueue(interaction.guildId);
console.log(error);
return interaction.editReply({
content: interaction.translate("music/play:ERR_OCCURRED", {
error,
songName: searchResult.hasPlaylist() ? searchResult.playlist.title : searchResult.tracks[0].title,
}),
});
}
} else if (i.customId === "search_cancel") {
i.deferUpdate();
interaction.editReply({
content: interaction.translate("misc:SELECT_CANCELED"),
embeds: [],
components: [],
});
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").AutocompleteInteraction} interaction
* @returns
*/
async autocompleteRun(client, interaction) {
const query = interaction.options.getString("query", true),
results = await client.player.search(query);
collector.stop();
return;
}
}
});
collector.on("end", async (_, reason) => {
if (reason === "idle") {
rows.forEach(row => {
row.components.forEach(component => {
component.setDisabled(true);
});
});
return interaction.editReply({
components: rows,
});
}
});
return;
}
searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]);
try {
if (!queue.connection) await queue.connect(interaction.member.voice.channel);
if (!queue.playing) await queue.play();
interaction.editReply({
content: interaction.translate("music/play:ADDED_QUEUE", {
songName: searchResult.playlist ? searchResult.playlist.title : searchResult.tracks[0].title,
return interaction.respond(
results.tracks.slice(0, 10).map(track => ({
name: `${track.author} - ${track.title}`.slice(0, 90) + "...",
value: track.url,
}),
});
} catch (error) {
client.player.deleteQueue(interaction.guildId);
console.log(error);
return interaction.editReply({
content: interaction.translate("music/play:ERR_OCCURRED", {
error,
}),
});
}
));
}
}

View file

@ -1,5 +1,5 @@
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"),
{ QueueRepeatMode } = require("discord-player-play-dl");
{ QueueRepeatMode } = require("discord-player");
const BaseCommand = require("../../base/BaseCommand");
class Queue extends BaseCommand {
@ -32,7 +32,7 @@ class Queue extends BaseCommand {
* @param {Object} data
*/
async execute(client, interaction) {
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING");
let currentPage = 0;
@ -151,15 +151,15 @@ class Queue extends BaseCommand {
/**
*
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {import("discord-player-play-dl").Queue} queue
* @param {import("discord-player").GuildQueue} queue
* @returns
*/
function generateQueueEmbeds(interaction, queue) {
const embeds = [];
const currentTrack = queue.current;
const currentTrack = queue.currentTrack;
let k = 10;
if (!queue.tracks.length) {
if (!queue.tracks.size) {
const embed = new EmbedBuilder()
.setTitle(interaction.translate("music/nowplaying:CURRENTLY_PLAYING"))
.setThumbnail(currentTrack.thumbnail)
@ -175,8 +175,8 @@ function generateQueueEmbeds(interaction, queue) {
return embeds;
}
for (let i = 0; i < queue.tracks.length; i += 10) {
const current = queue.tracks.slice(i, k);
for (let i = 0; i < queue.getSize(); i += 10) {
const current = queue.tracks.toArray().slice(i, k);
let j = i;
k += 10;
@ -190,7 +190,7 @@ function generateQueueEmbeds(interaction, queue) {
queue.repeatMode === QueueRepeatMode.AUTOPLAY ? interaction.translate("music/nowplaying:AUTOPLAY") :
queue.repeatMode === QueueRepeatMode.QUEUE ? interaction.translate("music/nowplaying:QUEUE") :
queue.repeatMode === QueueRepeatMode.TRACK ? interaction.translate("music/nowplaying:TRACK") : interaction.translate("common:DISABLED")
}\`\n${interaction.translate("music/queue:DURATION")}: \`${interaction.client.convertTime(Date.now() + queue.totalTime, false, true, interaction.guild.data.language)}\`\n[${currentTrack.title}](${currentTrack.url})\n> ${interaction.translate("music/queue:ADDED")} ${currentTrack.requestedBy}\n\n**${interaction.translate("music/queue:NEXT")}**\n${info}`)
}\`\n${interaction.translate("music/queue:DURATION")}: \`${interaction.client.convertTime(Date.now() + queue.node.streamTime, false, true, interaction.guild.data.language)}\`\n[${currentTrack.title}](${currentTrack.url})\n> ${interaction.translate("music/queue:ADDED")} ${currentTrack.requestedBy}\n\n**${interaction.translate("music/queue:NEXT")}**\n${info}`)
.setTimestamp();
embeds.push(embed);
}

View file

@ -37,10 +37,10 @@ class Seek extends BaseCommand {
voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL");
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING");
queue.seek(time * 1000);
queue.node.seek(time * 1000);
interaction.success("music/seek:SUCCESS", {
time: `**${time}** ${client.getNoun(time, interaction.translate("misc:NOUNS:SECONDS:1"), interaction.translate("misc:NOUNS:SECONDS:2"), interaction.translate("misc:NOUNS:SECONDS:5"))}`,
});

View file

@ -34,10 +34,10 @@ class Shuffle extends BaseCommand {
const voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { ephemeral: true });
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { ephemeral: true });
queue.shuffle();
queue.tracks.shuffle();
interaction.success("music/shuffle:SUCCESS");
}
}

View file

@ -34,10 +34,10 @@ class Skip extends BaseCommand {
const voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL");
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING");
queue.skip();
queue.node.skip();
interaction.success("music/skip:SUCCESS");
}
}

View file

@ -37,14 +37,14 @@ class Skipto extends BaseCommand {
const voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL");
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING");
const position = interaction.options.getInteger("position");
if (position <= 0) return interaction.error("music/skipto:NO_PREV_SONG");
if (queue.tracks[position - 1]) {
queue.skipTo(queue.tracks[position - 1]);
if (queue.tracks.at(position - 1)) {
queue.node.skipTo(queue.tracks.at(position - 1));
interaction.success("music/skipto:SUCCESS", {
position: position,

View file

@ -34,10 +34,10 @@ class Stop extends BaseCommand {
const voice = interaction.member.voice.channel;
if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL");
const queue = client.player.getQueue(interaction.guildId);
const queue = client.player.nodes.get(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING");
queue.destroy();
queue.delete();
interaction.success("music/stop:SUCCESS");
}
}

View file

@ -1,3 +1,21 @@
### JaBa v4.2.0
Я решил отказаться от своего модуля музыки в пользу основного, т.к. он был переписан авторами и теперь работает намного лучше.
Есть идея добавить запись голосовых, нужно или нет? пишите мне куда-нибудь, пожалуйста :crying_cat:\
Бот будет **предупреждать** о том что голосовой будет **записан** в файл и выслан вам, после этого **удалён**.\
Я не буду хранить ваши голосовые, у меня места не хватит на хостинге =)
* Изменения
* Теперь в *play* и *clips* выполняется автозаполнение по написанному вами тексту - намного удобнее чем ждать сообщения от бота и выбирать из огромного столба.
* *seek* теперь работает нормально.
* Переписана команда *clips*.
* Исправление
* Старые баги.
* Добавлено
* Новые баги.
### JaBa v4.1.20
* Добавлено
* Команда *boosters* - Список бустеров с сортировкой по дате буста.

View file

@ -15,8 +15,6 @@ class CommandHandler extends BaseEvent {
* @param {import("discord.js").Interaction} interaction
*/
async execute(client, interaction) {
if (interaction.type !== InteractionType.ApplicationCommand && !interaction.isCommand()) return;
const command = client.commands.get(interaction.commandName);
const data = [];
@ -25,9 +23,6 @@ class CommandHandler extends BaseEvent {
});
data.userData = userData;
if (command.guildOnly && !interaction.inGuild()) return interaction.replyT("misc:GUILD_ONLY", { ephemeral: true });
if (command.ownerOnly && interaction.user.id !== client.config.owner.id) return interaction.replyT("misc:OWNER_ONLY", { ephemeral: true });
if (interaction.inGuild()) {
const guildData = await client.findOrCreateGuild({
id: interaction.guildId,
@ -41,6 +36,14 @@ class CommandHandler extends BaseEvent {
data.memberData = memberData;
}
if (interaction.isAutocomplete()) {
return await command.autocompleteRun(client, interaction);
}
if (interaction.type !== InteractionType.ApplicationCommand && !interaction.isCommand()) return;
if (command.guildOnly && !interaction.inGuild()) return interaction.replyT("misc:GUILD_ONLY", { ephemeral: true });
if (command.ownerOnly && interaction.user.id !== client.config.owner.id) return interaction.replyT("misc:OWNER_ONLY", { ephemeral: true });
if (!userData.achievements.firstCommand.achieved) {
userData.achievements.firstCommand.progress.now = 1;
userData.achievements.firstCommand.achieved = true;

View file

@ -6,7 +6,7 @@
"NO_VOICE_CHANNEL": "Вы должны находиться в голосовом канале!",
"VOICE_CHANNEL_CONNECT": "Я не могу присоедениться к вашему голосовому каналу!",
"RESULTS_TITLE": "Результаты поиска по \"{{query}}\"",
"NO_RESULT": роизошла ошибка при поиске `{{query}}`!\n```{{error}}```",
"NO_RESULT": о запросу `{{query}}` ничего не найдено",
"NOW_PLAYING": "Сейчас играет **{{songName}}**",
"NOT_PLAYING": "На сервере сейчас ничего не воспроизводится",
"QUEUE_ENDED": "Очередь окончена",

View file

@ -4,7 +4,7 @@
"EXAMPLES": "queue",
"QUEUE": "Очередь",
"NO_QUEUE": "Пусто",
"DURATION": "Длительность очереди",
"DURATION": "Играю уже",
"ADDED": "Добавил",
"NEXT_PAGE": "След. страница",
"PREV_PAGE": "Пред. страница",

View file

@ -6,7 +6,7 @@
"NO_VOICE_CHANNEL": "Ви повинні знаходитися в голосовому каналі!",
"VOICE_CHANNEL_CONNECT": "Я не можу приєднатися до вашого голосового каналу!",
"RESULTS_TITLE": "Результати пошуку за \"{{query}}\"",
"NO_RESULT": "Відбулася помилка при пошуку `{{query}}`!\n``{{error}}```",
"NO_RESULT": "За запитом `{{query}}` нічого не знайдено",
"NOW_PLAYING": "Зараз грає **{{songName}}**",
"NOT_PLAYING": "На сервері зараз нічого не відтворюється",
"QUEUE_ENDED": "Черга закінчена",

View file

@ -4,7 +4,7 @@
"EXAMPLES": "queue",
"QUEUE": "Черга",
"NO_QUEUE": "Пусто",
"DURATION": "Тривалість черги",
"DURATION": "Граю вже",
"ADDED": "Додав",
"NEXT_PAGE": "Наступна сторінка",
"PREV_PAGE": "Попередня сторінка",

241
package-lock.json generated
View file

@ -1,15 +1,15 @@
{
"name": "jaba",
"version": "4.1.20",
"version": "4.2.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "jaba",
"version": "4.1.20",
"version": "4.2.0",
"license": "ISC",
"dependencies": {
"@discord-player/extractor": "^4.0.0",
"@discord-player/extractor": "^4.1.2",
"@discordjs/opus": "^0.9.0",
"@discordjs/rest": "^1.6.0",
"@discordjs/voice": "^0.15.0",
@ -20,7 +20,7 @@
"cron": "^2.1.0",
"discord-api-types": "^0.37.36",
"discord-giveaways": "^6.0.1",
"discord-player-play-dl": "^5.3.14",
"discord-player": "^6.1.1",
"discord.js": "^14.8.0",
"ejs": "^3.1.3",
"express": "^4.17.1",
@ -32,7 +32,8 @@
"md5": "^2.2.1",
"moment": "^2.26.0",
"mongoose": "^5.13.15",
"ms": "^2.1.3"
"ms": "^2.1.3",
"play-dl": "^1.9.6"
},
"devDependencies": {
"eslint": "^8.23.0"
@ -50,19 +51,17 @@
}
},
"node_modules/@discord-player/equalizer": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/@discord-player/equalizer/-/equalizer-0.1.4.tgz",
"integrity": "sha512-y87Mwj+38v8sRGfC/jSRykiQhpMV7yUI8Rq+xvczG6u/wBX1bkY53H5RjUZx4of2MLMNnMd9CF+z65E56Ps8DA==",
"peer": true
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/@discord-player/equalizer/-/equalizer-0.2.1.tgz",
"integrity": "sha512-PPjX8TBwzM85YKEdpYYL8aGbdSLIk9RK1h/uU5jeyiF6Uu5CiLH/XctDfcGW8cSgoaU4J0R6a8svCs9yhzHXSw=="
},
"node_modules/@discord-player/extractor": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.0.0.tgz",
"integrity": "sha512-j5Q71j0DHKCgIirRaN8+Vmhlo4+Gb2+Zf18K7oA8nN03oJiUzepw/2f3RIcCf9QbuoD1xUUHlWqqzMBDn1aq1A==",
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.1.2.tgz",
"integrity": "sha512-sG0KG3tC9/t2hnzXP7amaURbZ+7KfIXma+sH2UyAJKqX3LgYnFvUxm1deL29lPrqf8wjR9XEEOt5TOxpsyP74Q==",
"dependencies": {
"file-type": "^16.5.4",
"genius-lyrics": "^4.4.2",
"node-fetch": "cjs",
"node-html-parser": "^6.1.4",
"reverbnation-scraper": "^2.0.0",
"soundcloud-scraper": "^5.0.3",
@ -70,7 +69,6 @@
"youtube-sr": "^4.3.4"
},
"peerDependencies": {
"discord-player": "*",
"play-dl": "1.x",
"ytdl-core": "4.x"
}
@ -135,6 +133,14 @@
"url": "https://github.com/sponsors/Borewit"
}
},
"node_modules/@discord-player/utils": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/@discord-player/utils/-/utils-0.2.1.tgz",
"integrity": "sha512-yPxfdO2N3i2YEEiwlLDNyuBEdnhV1mZaC7im2BI4FKn3ak1UAtVcbKeJhdd/va0A170+PZs3zUKVGldY0z/+ng==",
"dependencies": {
"@discordjs/collection": "^1.1.0"
}
},
"node_modules/@discordjs/builders": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.5.0.tgz",
@ -1474,82 +1480,24 @@
}
},
"node_modules/discord-player": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/discord-player/-/discord-player-5.4.0.tgz",
"integrity": "sha512-Hrab+4aNCZCGJwsGkiQx+nfvJNqMEr9T+vEAzTOybWJ83InJOxUK7t6muVqHlkonmXBM/nVOczWs2qacDlRH6g==",
"peer": true,
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/discord-player/-/discord-player-6.1.1.tgz",
"integrity": "sha512-gIN0V+IBT1xcLmzFqfbq9pM8B7crZvbfTwdey1R99P3DdAfaRbg+F1hw9l5ftK2X492O3uAjev+ZBh1CcFU3pQ==",
"dependencies": {
"@discord-player/equalizer": "^0.1.2",
"@discordjs/voice": "^0.11.0",
"libsodium-wrappers": "^0.7.10",
"tiny-typed-emitter": "^2.1.0",
"tslib": "^2.4.0"
"@discord-player/equalizer": "*",
"@discord-player/utils": "*",
"@discordjs/voice": "latest",
"libsodium-wrappers": "^0.7.10"
},
"funding": {
"url": "https://github.com/Androz2091/discord-player?sponsor=1"
},
"peerDependencies": {
"soundcloud-scraper": "5.x",
"spotify-url-info": "3.x",
"youtube-sr": "4.x",
"ytdl-core": "4.x"
"@discord-player/extractor": "*",
"discord.js": "14.x",
"youtube-sr": "4.x"
}
},
"node_modules/discord-player-play-dl": {
"version": "5.3.14",
"resolved": "https://registry.npmjs.org/discord-player-play-dl/-/discord-player-play-dl-5.3.14.tgz",
"integrity": "sha512-kN0tOno4iI2GD7zZB4Ro/QpUp4+lclecl71TCw7BZGR0t/0yIezY3ix0QNq+XjCOFrBl0XlU3poJWe2lRRsmMw==",
"dependencies": {
"@discordjs/voice": "^0.11.0",
"libsodium-wrappers": "^0.7.10",
"play-dl": "^1.9.6",
"spotify-url-info": "^3.1.2",
"tiny-typed-emitter": "^2.1.0",
"tslib": "^2.4.0"
}
},
"node_modules/discord-player-play-dl/node_modules/@discordjs/voice": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz",
"integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==",
"dependencies": {
"@types/ws": "^8.5.3",
"discord-api-types": "^0.36.2",
"prism-media": "^1.3.4",
"tslib": "^2.4.0",
"ws": "^8.8.1"
},
"engines": {
"node": ">=16.9.0"
}
},
"node_modules/discord-player-play-dl/node_modules/discord-api-types": {
"version": "0.36.3",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz",
"integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg=="
},
"node_modules/discord-player/node_modules/@discordjs/voice": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz",
"integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==",
"peer": true,
"dependencies": {
"@types/ws": "^8.5.3",
"discord-api-types": "^0.36.2",
"prism-media": "^1.3.4",
"tslib": "^2.4.0",
"ws": "^8.8.1"
},
"engines": {
"node": ">=16.9.0"
}
},
"node_modules/discord-player/node_modules/discord-api-types": {
"version": "0.36.3",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz",
"integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==",
"peer": true
},
"node_modules/discord.js": {
"version": "14.8.0",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.8.0.tgz",
@ -2766,16 +2714,16 @@
}
},
"node_modules/libsodium": {
"version": "0.7.10",
"resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz",
"integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ=="
"version": "0.7.11",
"resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.11.tgz",
"integrity": "sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A=="
},
"node_modules/libsodium-wrappers": {
"version": "0.7.10",
"resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz",
"integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==",
"version": "0.7.11",
"resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz",
"integrity": "sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q==",
"dependencies": {
"libsodium": "^0.7.0"
"libsodium": "^0.7.11"
}
},
"node_modules/locate-path": {
@ -4283,11 +4231,6 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"node_modules/tiny-typed-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
"integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@ -4560,19 +4503,17 @@
}
},
"@discord-player/equalizer": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/@discord-player/equalizer/-/equalizer-0.1.4.tgz",
"integrity": "sha512-y87Mwj+38v8sRGfC/jSRykiQhpMV7yUI8Rq+xvczG6u/wBX1bkY53H5RjUZx4of2MLMNnMd9CF+z65E56Ps8DA==",
"peer": true
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/@discord-player/equalizer/-/equalizer-0.2.1.tgz",
"integrity": "sha512-PPjX8TBwzM85YKEdpYYL8aGbdSLIk9RK1h/uU5jeyiF6Uu5CiLH/XctDfcGW8cSgoaU4J0R6a8svCs9yhzHXSw=="
},
"@discord-player/extractor": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.0.0.tgz",
"integrity": "sha512-j5Q71j0DHKCgIirRaN8+Vmhlo4+Gb2+Zf18K7oA8nN03oJiUzepw/2f3RIcCf9QbuoD1xUUHlWqqzMBDn1aq1A==",
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.1.2.tgz",
"integrity": "sha512-sG0KG3tC9/t2hnzXP7amaURbZ+7KfIXma+sH2UyAJKqX3LgYnFvUxm1deL29lPrqf8wjR9XEEOt5TOxpsyP74Q==",
"requires": {
"file-type": "^16.5.4",
"genius-lyrics": "^4.4.2",
"node-fetch": "cjs",
"node-html-parser": "^6.1.4",
"reverbnation-scraper": "^2.0.0",
"soundcloud-scraper": "^5.0.3",
@ -4615,6 +4556,14 @@
}
}
},
"@discord-player/utils": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/@discord-player/utils/-/utils-0.2.1.tgz",
"integrity": "sha512-yPxfdO2N3i2YEEiwlLDNyuBEdnhV1mZaC7im2BI4FKn3ak1UAtVcbKeJhdd/va0A170+PZs3zUKVGldY0z/+ng==",
"requires": {
"@discordjs/collection": "^1.1.0"
}
},
"@discordjs/builders": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.5.0.tgz",
@ -5587,69 +5536,14 @@
}
},
"discord-player": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/discord-player/-/discord-player-5.4.0.tgz",
"integrity": "sha512-Hrab+4aNCZCGJwsGkiQx+nfvJNqMEr9T+vEAzTOybWJ83InJOxUK7t6muVqHlkonmXBM/nVOczWs2qacDlRH6g==",
"peer": true,
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/discord-player/-/discord-player-6.1.1.tgz",
"integrity": "sha512-gIN0V+IBT1xcLmzFqfbq9pM8B7crZvbfTwdey1R99P3DdAfaRbg+F1hw9l5ftK2X492O3uAjev+ZBh1CcFU3pQ==",
"requires": {
"@discord-player/equalizer": "^0.1.2",
"@discordjs/voice": "^0.11.0",
"libsodium-wrappers": "^0.7.10",
"tiny-typed-emitter": "^2.1.0",
"tslib": "^2.4.0"
},
"dependencies": {
"@discordjs/voice": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz",
"integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==",
"peer": true,
"requires": {
"@types/ws": "^8.5.3",
"discord-api-types": "^0.36.2",
"prism-media": "^1.3.4",
"tslib": "^2.4.0",
"ws": "^8.8.1"
}
},
"discord-api-types": {
"version": "0.36.3",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz",
"integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==",
"peer": true
}
}
},
"discord-player-play-dl": {
"version": "5.3.14",
"resolved": "https://registry.npmjs.org/discord-player-play-dl/-/discord-player-play-dl-5.3.14.tgz",
"integrity": "sha512-kN0tOno4iI2GD7zZB4Ro/QpUp4+lclecl71TCw7BZGR0t/0yIezY3ix0QNq+XjCOFrBl0XlU3poJWe2lRRsmMw==",
"requires": {
"@discordjs/voice": "^0.11.0",
"libsodium-wrappers": "^0.7.10",
"play-dl": "^1.9.6",
"spotify-url-info": "^3.1.2",
"tiny-typed-emitter": "^2.1.0",
"tslib": "^2.4.0"
},
"dependencies": {
"@discordjs/voice": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz",
"integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==",
"requires": {
"@types/ws": "^8.5.3",
"discord-api-types": "^0.36.2",
"prism-media": "^1.3.4",
"tslib": "^2.4.0",
"ws": "^8.8.1"
}
},
"discord-api-types": {
"version": "0.36.3",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz",
"integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg=="
}
"@discord-player/equalizer": "*",
"@discord-player/utils": "*",
"@discordjs/voice": "latest",
"libsodium-wrappers": "^0.7.10"
}
},
"discord.js": {
@ -6582,16 +6476,16 @@
}
},
"libsodium": {
"version": "0.7.10",
"resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz",
"integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ=="
"version": "0.7.11",
"resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.11.tgz",
"integrity": "sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A=="
},
"libsodium-wrappers": {
"version": "0.7.10",
"resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz",
"integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==",
"version": "0.7.11",
"resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz",
"integrity": "sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q==",
"requires": {
"libsodium": "^0.7.0"
"libsodium": "^0.7.11"
}
},
"locate-path": {
@ -7675,11 +7569,6 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"tiny-typed-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
"integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",

View file

@ -1,6 +1,6 @@
{
"name": "jaba",
"version": "4.1.20",
"version": "4.2.0",
"description": "My Discord Bot",
"main": "index.js",
"private": true,
@ -12,7 +12,7 @@
"author": "Jonny_Bro#4226",
"license": "ISC",
"dependencies": {
"@discord-player/extractor": "^4.0.0",
"@discord-player/extractor": "^4.1.2",
"@discordjs/opus": "^0.9.0",
"@discordjs/rest": "^1.6.0",
"@discordjs/voice": "^0.15.0",
@ -23,7 +23,7 @@
"cron": "^2.1.0",
"discord-api-types": "^0.37.36",
"discord-giveaways": "^6.0.1",
"discord-player-play-dl": "^5.3.14",
"discord-player": "^6.1.1",
"discord.js": "^14.8.0",
"ejs": "^3.1.3",
"express": "^4.17.1",
@ -35,7 +35,8 @@
"md5": "^2.2.1",
"moment": "^2.26.0",
"mongoose": "^5.13.15",
"ms": "^2.1.3"
"ms": "^2.1.3",
"play-dl": "^1.9.6"
},
"devDependencies": {
"eslint": "^8.23.0"