feat(bot): add NodeJS implementation and deploy script
This commit is contained in:
74
src/commands/join.js
Normal file
74
src/commands/join.js
Normal file
@@ -0,0 +1,74 @@
|
||||
const { SlashCommandBuilder, PermissionFlagsBits, ChannelType } = require('discord.js');
|
||||
const logger = require('../utils/logger');
|
||||
|
||||
module.exports = {
|
||||
data: new SlashCommandBuilder()
|
||||
.setName('join')
|
||||
.setDescription('Joins your current voice channel'),
|
||||
async execute(interaction, client) { // Added client parameter
|
||||
await interaction.deferReply({ ephemeral: true }); // Defer reply as joining might take time
|
||||
|
||||
const member = interaction.member;
|
||||
const voiceChannel = member?.voice?.channel;
|
||||
|
||||
// 1. Check if user is in a voice channel
|
||||
if (!voiceChannel) {
|
||||
return interaction.editReply('You need to be in a voice channel to use this command!');
|
||||
}
|
||||
|
||||
// 2. Check bot permissions
|
||||
const permissions = voiceChannel.permissionsFor(client.user);
|
||||
if (!permissions.has(PermissionFlagsBits.Connect)) {
|
||||
return interaction.editReply('I need permission to **connect** to your voice channel!');
|
||||
}
|
||||
if (!permissions.has(PermissionFlagsBits.Speak)) {
|
||||
return interaction.editReply('I need permission to **speak** in your voice channel!');
|
||||
}
|
||||
// Ensure it's a voice channel (not stage, etc.) although erela might handle this
|
||||
if (voiceChannel.type !== ChannelType.GuildVoice) {
|
||||
return interaction.editReply('I can only join standard voice channels.');
|
||||
}
|
||||
|
||||
// 3. Create or get the player and connect
|
||||
let player = client.manager.get(interaction.guildId);
|
||||
|
||||
if (!player) {
|
||||
try {
|
||||
player = client.manager.create({
|
||||
guild: interaction.guildId,
|
||||
voiceChannel: voiceChannel.id,
|
||||
textChannel: interaction.channelId, // Store the channel where command was used
|
||||
selfDeafen: true, // Automatically deafen the bot
|
||||
// selfMute: false, // Bot starts unmuted
|
||||
});
|
||||
player.connect();
|
||||
logger.info(`Created player and connected to voice channel ${voiceChannel.name} (${voiceChannel.id}) in guild ${interaction.guild.name} (${interaction.guildId})`);
|
||||
await interaction.editReply(`Joined ${voiceChannel.name}! Ready to play music.`);
|
||||
|
||||
} catch (error) {
|
||||
logger.error(`Failed to create/connect player for guild ${interaction.guildId}: ${error.message}`, error);
|
||||
// Try to destroy player if partially created
|
||||
if (player) player.destroy();
|
||||
return interaction.editReply('An error occurred while trying to join the voice channel.');
|
||||
}
|
||||
} else {
|
||||
// If player exists but is not connected or in a different channel
|
||||
if (player.voiceChannel !== voiceChannel.id) {
|
||||
player.setVoiceChannel(voiceChannel.id);
|
||||
if (!player.playing && !player.paused && !player.queue.size) {
|
||||
player.connect(); // Connect if not already playing/paused/queued
|
||||
}
|
||||
logger.info(`Moved player to voice channel ${voiceChannel.name} (${voiceChannel.id}) in guild ${interaction.guildId}`);
|
||||
await interaction.editReply(`Moved to ${voiceChannel.name}!`);
|
||||
} else {
|
||||
// Already in the correct channel
|
||||
await interaction.editReply(`I'm already in ${voiceChannel.name}!`);
|
||||
}
|
||||
// Update text channel if needed
|
||||
if (player.textChannel !== interaction.channelId) {
|
||||
player.setTextChannel(interaction.channelId);
|
||||
logger.debug(`Updated player text channel to ${interaction.channel.name} (${interaction.channelId}) in guild ${interaction.guildId}`);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user