Merge branch 'Development' of https://github.com/MinazukiAmane/Kiera-Bot into Development

This commit is contained in:
frostice482 2025-01-04 07:04:31 +07:00
commit 42ff721678
5 changed files with 152 additions and 6 deletions

View File

@ -0,0 +1,84 @@
const { EmbedBuilder } = require("discord.js");
const Queue = require("@src/database/schemas/Queue");
const { MUSIC } = require("@root/config");
module.exports = {
name: "join",
description: "Join the voice channel and resume playback if there is a saved queue.",
category: "MUSIC",
validations: [], // Add any validations if necessary
command: {
enabled: true,
},
slashCommand: {
enabled: true,
},
async messageRun(message, args) {
const response = await executeJoinCommand(message);
await message.safeReply(response);
},
async interactionRun(interaction) {
const response = await executeJoinCommand(interaction);
await interaction.followUp(response);
},
};
async function executeJoinCommand(interaction) {
const { guild, member } = interaction;
const voiceChannel = member.voice.channel;
if (!voiceChannel) {
return "You need to be in a voice channel to use this command.";
}
// Get or create the player for the guild
let player = guild.client.musicManager.getPlayer(guild.id);
if (!player) {
player = await guild.client.musicManager.createPlayer({
guildId: guild.id,
voiceChannelId: voiceChannel.id,
textChannelId: interaction.channel.id,
selfMute: false,
selfDeaf: true,
volume: MUSIC.DEFAULT_VOLUME,
});
}
// Check for saved queue in the database
const queueData = await Queue.findOne({ guildId: guild.id });
if (queueData) {
// Restore the queue
player.queue.add(queueData.tracks.map(track => ({
info: {
title: track.title,
uri: track.uri,
duration: track.duration,
},
requester: { id: track.requester },
})));
if (queueData.currentTrack) {
player.queue.current = {
info: {
title: queueData.currentTrack.title,
uri: queueData.currentTrack.uri,
duration: queueData.currentTrack.duration,
},
requester: { id: queueData.currentTrack.requester },
};
// Set the current position if available
player.position = queueData.currentTrack.position || 0; // Default to 0 if not set
}
// Join the voice channel and play the current track
await player.connect(voiceChannel.id);
await player.play({ paused: false });
return `Joined ${voiceChannel.name} and resumed playback of **${player.queue.current.info.title}**.`;
} else {
return "No saved queue found.";
}
}

View File

@ -0,0 +1,11 @@
const joinCommand = require("@src/commands/music/join");
client.on("interactionCreate", async (interaction) => {
if (!interaction.isButton()) return;
const { customId } = interaction;
if (customId === "resume") {
await joinCommand.execute(interaction);
}
});

View File

@ -1,4 +1,5 @@
const Queue = require("@src/database/schemas/Queue"); const Queue = require("@src/database/schemas/Queue");
const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require("discord.js");
module.exports = async (client, player) => { module.exports = async (client, player) => {
const guild = client.guilds.cache.get(player.guildId); const guild = client.guilds.cache.get(player.guildId);
@ -18,6 +19,7 @@ module.exports = async (client, player) => {
uri: player.queue.current.info.uri, uri: player.queue.current.info.uri,
duration: player.queue.current.info.duration, duration: player.queue.current.info.duration,
requester: player.queue.current.requester.id, requester: player.queue.current.requester.id,
position: player.position || 0,
} : null, } : null,
}; };
@ -35,4 +37,24 @@ module.exports = async (client, player) => {
if (msg && msg.deletable) { if (msg && msg.deletable) {
await msg.delete().catch(() => {}); await msg.delete().catch(() => {});
} }
// Send a message with a button to resume playback
const channel = guild.channels.cache.get(player.textChannelId);
if (channel) {
const row = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId("resume")
.setLabel("Resume Music")
.setStyle(ButtonStyle.Primary)
);
await channel.safeSend({
embeds: [
new EmbedBuilder()
.setColor(EMBED_COLORS.BOT_EMBED)
.setDescription("The music has stopped due to a disconnection. You can resume it by clicking the button below.")
],
components: [row]
});
}
}; };

View File

@ -25,6 +25,11 @@ module.exports = async (client, player, track) => {
{ guildId: player.guildId }, { guildId: player.guildId },
{ tracks: updatedTracks, currentTrack: null } { tracks: updatedTracks, currentTrack: null }
); );
// If there are no more tracks left, consider cleaning up the database entry
if (updatedTracks.length === 0) {
await Queue.deleteOne({ guildId: player.guildId });
}
} }
if (player.get("autoplay") === true) { if (player.get("autoplay") === true) {

View File

@ -1,6 +1,7 @@
const { EmbedBuilder, ButtonBuilder, ButtonStyle, ActionRowBuilder } = require("discord.js"); const { EmbedBuilder, ButtonBuilder, ButtonStyle, ActionRowBuilder } = require("discord.js");
const { EMBED_COLORS } = require("@root/config"); const { EMBED_COLORS } = require("@root/config");
const Queue = require("@src/database/schemas/Queue"); const Queue = require("@src/database/schemas/Queue");
const joinCommand = require("@src/commands/music/join");
module.exports = async (client, player, track) => { module.exports = async (client, player, track) => {
const guild = client.guilds.cache.get(player.guildId); const guild = client.guilds.cache.get(player.guildId);
@ -28,12 +29,15 @@ module.exports = async (client, player, track) => {
}, },
requester: { id: queueData.currentTrack.requester }, requester: { id: queueData.currentTrack.requester },
}; };
}
// Clear the database entry after restoring // Set the current position if available
await Queue.deleteOne({ guildId: player.guildId }); player.position = queueData.currentTrack.position || 0; // Default to 0 if not set
}
} }
// Save the current track to the database
await saveCurrentTrackToDatabase(player, track);
if (!player.textChannelId || !track) return; if (!player.textChannelId || !track) return;
const channel = guild.channels.cache.get(player.textChannelId); const channel = guild.channels.cache.get(player.textChannelId);
@ -44,7 +48,7 @@ module.exports = async (client, player, track) => {
} }
if (player.voiceChannelId) { if (player.voiceChannelId) {
await client.utils.setVoiceStatus(client, player.voiceChannelId, `Paying: **${track.info.title}**`); await client.utils.setVoiceStatus(client, player.voiceChannelId, `Playing: **${track.info.title}**`);
} }
const previous = await player.queue.shiftPrevious(); const previous = await player.queue.shiftPrevious();
@ -240,3 +244,23 @@ module.exports = async (client, player, track) => {
}); });
}); });
}; };
// Function to save the current track to the database
async function saveCurrentTrackToDatabase(player, track) {
const queueData = {
guildId: player.guildId,
currentTrack: {
title: track.info.title,
uri: track.info.uri,
duration: track.info.duration,
requester: track.requester.id,
position: player.position || 0, // Save the current position
},
};
await Queue.findOneAndUpdate(
{ guildId: player.guildId },
queueData,
{ upsert: true, new: true }
);
}