// Debug const { DebugBuilder } = require("../utilities/debugBuilder"); const log = new DebugBuilder("client", "ping"); // Modules const { joinVoiceChannel, VoiceConnectionStatus } = require("@discordjs/voice"); const {replyToInteraction} = require("../utilities/messageHandler.js"); const { SlashCommandBuilder } = require('discord.js'); const {createAudioInstance} = require("../controllers/audioController.js"); const OpusEncoderPkg = require("@discordjs/opus"); // Declare the encoder (module is incompatible modern import method) const { OpusEncoder } = OpusEncoderPkg; const encoder = new OpusEncoder(48000, 2); module.exports = { data: new SlashCommandBuilder() .setName('join') .setDescription('Join a voice channel'), example: "join", isPrivileged: false, async execute(interaction) { await this.join({ interaction: interaction }); } } /** * Join the specified voice channel * * @param interaction Message interaction from discord * @param {string||any} guildID The specified Guild ID if this function is run from the client instead of from an interaction in Discord * @param {string||any} channelID The channel ID to join * @param guild The guild object to be used to create a voice adapter * @param {function} callback The callback that will be needed if this function is run with a Guild ID instead of an interaction */ exports.join = async function join({interaction= undefined, guildID= undefined, channelID = undefined, guildObj = undefined, callback = undefined}){ if (interaction){ const voiceChannel = interaction.options.getChannel('voicechannel'); channelID = voiceChannel.id; guildID = interaction.guildId; guildObj = interaction.guild; if (interaction) replyToInteraction(interaction, `Ok, Joining ${voiceChannel.name}`); } log.DEBUG("Channel ID: ", channelID) log.DEBUG("Guild ID: ", guildID) const voiceConnection = joinVoiceChannel({ channelId: channelID, guildId: guildID, adapterCreator: guildObj.voiceAdapterCreator, selfMute: false, selfDeaf: false, }); const audioInstance = await createAudioInstance(); audioInstance.on('audio', (buffer) => { buffer = Buffer.from(buffer); log.DEBUG("Audio buffer: ", buffer); const encoded = encoder.encode(buffer); // TODO Add a function here to check the volume of either buffer and only play audio to discord when there is audio to be played voiceConnection.playOpusPacket(encoded); }) // Exit the audio handler when the bot disconnects voiceConnection.on(VoiceConnectionStatus.Destroyed, () => { audioInstance.quit(); }) if (guildID && callback) callback(); else return; }