Страницы в queue
Спасибо старым исходникам Жабы
This commit is contained in:
JonnyBro 2022-08-26 18:22:02 +05:00
parent 9d3001eaba
commit 46d38e74c6
6 changed files with 178 additions and 33 deletions

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"); const BaseCommand = require("../../base/BaseCommand");
class Queue extends BaseCommand { class Queue extends BaseCommand {
@ -34,38 +34,175 @@ class Queue extends BaseCommand {
const queue = client.player.getQueue(interaction.guildId); const queue = client.player.getQueue(interaction.guildId);
if (!queue) return interaction.error("music/play:NOT_PLAYING"); if (!queue) return interaction.error("music/play:NOT_PLAYING");
const currentTrack = queue.current; let currentPage = 0;
const tracks = queue.tracks.slice(0, 5).map((track, i) => { const embeds = generateQueueEmbed(interaction, queue);
return `${i + 1}. [${track.title}](${track.url})\n> ${interaction.translate("music/queue:ADDED")} ${track.requestedBy}`;
});
const embed = new EmbedBuilder() const row = new ActionRowBuilder()
.setAuthor({ .addComponents(
name: interaction.translate("music/queue:TITLE"), new ButtonBuilder()
iconURL: interaction.guild.iconURL() .setCustomId("queue_prev_page")
}) .setLabel(interaction.translate("music/queue:PREV_PAGE"))
.setColor(client.config.embed.color) .setStyle(ButtonStyle.Primary)
.addFields( .setEmoji("⬅️"),
{ new ButtonBuilder()
name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), .setCustomId("queue_next_page")
value: `[${currentTrack.title}](${currentTrack.url})\n> ${interaction.translate("music/queue:ADDED")} ${currentTrack.requestedBy}\n` .setLabel(interaction.translate("music/queue:NEXT_PAGE"))
}, .setStyle(ButtonStyle.Primary)
{ .setEmoji("➡️"),
name: interaction.translate("music/queue:QUEUE"), new ButtonBuilder()
value: tracks.length > 0 ? tracks.join("\n") : interaction.translate("music/queue:NO_QUEUE") .setCustomId("queue_jump_page")
}, .setLabel(interaction.translate("music/queue:JUMP_PAGE"))
{ .setStyle(ButtonStyle.Secondary)
name: "\u200b", .setEmoji("↗️"),
value: `${interaction.translate("music/queue:MORE", { new ButtonBuilder()
tracks: `${queue.tracks.length - tracks.length} ${client.getNoun(queue.tracks.length - tracks.length, interaction.translate("misc:NOUNS:TRACKS:1"), interaction.translate("misc:NOUNS:TRACKS:2"), interaction.translate("misc:NOUNS:TRACKS:5"))}` .setCustomId("queue_stop")
})}` .setLabel(interaction.translate("common:CANCEL"))
} .setStyle(ButtonStyle.Danger)
.setEmoji("⏹️"),
); );
interaction.reply({ await interaction.reply({
embeds: [embed] content: interaction.translate("music/queue:PAGE", {
current: currentPage + 1,
length: embeds.length
}),
embeds: [embeds[currentPage]],
components: [row]
});
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (60 * 1000) });
collector.on("collect", async i => {
if (i.isButton()) {
if (i.customId === "queue_prev_page") {
i.deferUpdate();
if (currentPage !== 0) {
--currentPage;
interaction.editReply({
content: interaction.translate("music/queue:PAGE", {
current: currentPage + 1,
length: embeds.length
}),
embeds: [embeds[currentPage]],
components: [row]
}); });
} }
} else if (i.customId === "queue_next_page") {
i.deferUpdate();
if (currentPage < embeds.length - 1) {
currentPage++;
interaction.editReply({
content: interaction.translate("music/queue:PAGE", {
current: currentPage + 1,
length: embeds.length
}),
embeds: [embeds[currentPage]],
components: [row]
});
}
} else if (i.customId === "queue_jump_page") {
i.deferUpdate();
const msg = await interaction.followUp({
content: interaction.translate("music/queue:PAGE_TO_JUMP", {
length: embeds.length
}),
fetchReply: true
});
const filter = res => {
return res.author.id === interaction.user.id && !isNaN(res.content);
};
interaction.channel.awaitMessages({ filter, max: 1, time: (30 * 1000) }).then(collected => {
if (embeds[Number(collected.first().content) - 1]) {
currentPage = Number(collected.first().content) - 1;
interaction.editReply({
content: interaction.translate("music/queue:PAGE", {
current: currentPage + 1,
length: 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 === "queue_stop") {
i.deferUpdate();
collector.stop(true);
}
}
});
collector.on("end", async (_, reason) => {
if (reason) {
const row = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId("queue_prev_page")
.setLabel(interaction.translate("music/queue:PREV_PAGE"))
.setStyle(ButtonStyle.Primary)
.setEmoji("⬅️")
.setDisabled(true),
new ButtonBuilder()
.setCustomId("queue_next_page")
.setLabel(interaction.translate("music/queue:NEXT_PAGE"))
.setStyle(ButtonStyle.Primary)
.setEmoji("➡️")
.setDisabled(true),
new ButtonBuilder()
.setCustomId("queue_jump_page")
.setLabel(interaction.translate("music/queue:JUMP_PAGE"))
.setStyle(ButtonStyle.Secondary)
.setEmoji("↗️")
.setDisabled(true),
new ButtonBuilder()
.setCustomId("queue_stop")
.setLabel(interaction.translate("common:CANCEL"))
.setStyle(ButtonStyle.Danger)
.setEmoji("⏹️")
.setDisabled(true),
);
return interaction.editReply({
components: [row]
});
}
});
}
}
function generateQueueEmbed(interaction, queue) {
const embeds = [];
const currentTrack = queue.current;
let k = 10;
for (let i = 0; i < queue.tracks.length; i += 10) {
const current = queue.tracks.slice(i, k);
let j = i;
k += 10;
const info = current.map(track => `${++j}. [${track.title}](${track.url})\n> ${interaction.translate("music/queue:ADDED")} ${track.requestedBy}`).join("\n");
const embed = new EmbedBuilder()
.setTitle(interaction.translate("music/nowplaying:CURRENTLY_PLAYING"))
.setThumbnail(currentTrack.thumbnail)
.setColor(interaction.client.config.embed.color)
.setDescription(`[${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);
}
return embeds;
} }
module.exports = Queue; module.exports = Queue;

View file

@ -1,3 +1,6 @@
### JaBa v4.1.1
* Добавлено
* Страницы в *queue*.
### JaBa v4.1 ### JaBa v4.1
* Изменения * Изменения

View file

@ -3,7 +3,12 @@
"USAGE": "", "USAGE": "",
"EXAMPLES": "queue", "EXAMPLES": "queue",
"QUEUE": "Очередь", "QUEUE": "Очередь",
"PAGE": "Страница **{{current}}**/**{{length}}**",
"NO_QUEUE": "Пусто", "NO_QUEUE": "Пусто",
"ADDED": "Добавил", "ADDED": "Добавил",
"MORE": "и ещё {{tracks}}" "NEXT_PAGE": "След. страница",
"PREV_PAGE": "Пред. страница",
"JUMP_PAGE": "Перейти к странице",
"PAGE_TO_JUMP": "Укажите страницу к которой хотите перейти (максимум **{{length}}**):",
"NEXT": "Далее"
} }

View file

@ -3,7 +3,7 @@
"USAGE": "[номер]", "USAGE": "[номер]",
"EXAMPLES": "skipto 3", "EXAMPLES": "skipto 3",
"POSITION": "Номер трека в очереди", "POSITION": "Номер трека в очереди",
"SUCCESS": "Выполнен переход на позицию {{position}}", "SUCCESS": "Выполнен переход на трек под номером **{{position}}**",
"ERROR": "На позиции {{position}} ничего не найдено", "ERROR": "На позиции {{position}} ничего не найдено",
"NO_PREV_SONG": "Вы не можете перейти назад, для этого используйте команду `back`!" "NO_PREV_SONG": "Вы не можете перейти назад, для этого используйте команду `back`!"
} }

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "jaba", "name": "jaba",
"version": "4.1", "version": "4.1.1",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "jaba", "name": "jaba",
"version": "4.1", "version": "4.1.1",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@discord-player/extractor": "^3.0.2", "@discord-player/extractor": "^3.0.2",

View file

@ -1,6 +1,6 @@
{ {
"name": "jaba", "name": "jaba",
"version": "4.1", "version": "4.1.1",
"description": "My Discord Bot", "description": "My Discord Bot",
"main": "index.js", "main": "index.js",
"private": true, "private": true,