aboutsummaryrefslogtreecommitdiff
path: root/AudioBackend.js
diff options
context:
space:
mode:
Diffstat (limited to 'AudioBackend.js')
-rw-r--r--AudioBackend.js134
1 files changed, 132 insertions, 2 deletions
diff --git a/AudioBackend.js b/AudioBackend.js
index f552a67..bf4210f 100644
--- a/AudioBackend.js
+++ b/AudioBackend.js
@@ -26,7 +26,7 @@ import {
joinVoiceChannel,
VoiceConnectionStatus
} from '@discordjs/voice'
-import { MessageEmbed } from 'discord.js'
+import { MessageActionRow, MessageButton, MessageEmbed } from 'discord.js'
import config from './config.json' assert {type: 'json'}
import { readdirSync, writeFile } from 'node:fs'
@@ -35,6 +35,7 @@ export let audio;
export let files = readdirSync('music');
let fileData;
+let runOnce = false
export let playerState;
let isAudioStatePaused;
@@ -51,7 +52,7 @@ export async function voiceInit(bot) {
});
connection.on(VoiceConnectionStatus.Destroyed, () => {
- console.log('Destroying beats...');
+ console.log('Destroyed the beats...');
});
player.on('idle', () => {
@@ -64,6 +65,135 @@ export async function voiceInit(bot) {
}).catch(e => { console.error(e) })
}
+export async function controlPanel(interaction, bot) {
+ let controlEmbed
+ let controlButtons
+ let controlButtons2
+
+ if (runOnce === true) return await interaction.reply({content:'You already executed this command', ephemeral:true})
+
+ controlEmbed = new MessageEmbed()
+ .setAuthor({name: `${bot.user.username} Control Panel`, iconURL: bot.user.avatarURL()})
+ .addField('State', playerState)
+ .addField('Currently Playing', audio)
+ //.addField('Next Music', '(a possible feature when queue system is implemented?)')
+ .setColor('#0066ff')
+
+ controlButtons = new MessageActionRow()
+ .addComponents(
+ new MessageButton()
+ .setStyle('SUCCESS')
+ .setLabel('Join')
+ .setCustomId('join')
+ .setEmoji('⬆️')
+ .setDisabled(true),
+ new MessageButton()
+ .setStyle('SECONDARY')
+ .setLabel('Play')
+ .setCustomId('play')
+ .setEmoji('▶️')
+ .setDisabled(true),
+ new MessageButton()
+ .setStyle('SECONDARY')
+ .setLabel('Pause')
+ .setCustomId('pause')
+ .setEmoji('⏸️'),
+ new MessageButton()
+ .setStyle('SECONDARY')
+ .setLabel('Skip')
+ .setCustomId('skip')
+ .setEmoji('⏭️'),
+ new MessageButton()
+ .setStyle('PRIMARY')
+ .setEmoji('⏩')
+ .setCustomId('next'),
+ );
+
+ controlButtons2 = new MessageActionRow()
+ .addComponents(
+ new MessageButton()
+ .setStyle('PRIMARY')
+ .setEmoji('⏪')
+ .setCustomId('back'),
+ new MessageButton()
+ .setStyle('DANGER')
+ .setLabel('Leave')
+ .setCustomId('leave')
+ .setEmoji('⏏️'),
+ new MessageButton()
+ .setStyle('DANGER')
+ .setLabel('Power Off')
+ .setCustomId('stop')
+ .setEmoji('🛑')
+ )
+
+ const filter = i => i.user.id === config.botOwner;
+
+ const collector = interaction.channel.createMessageComponentCollector({filter});
+
+ collector.on('collect', async ctlButton => {
+ if (ctlButton.customId === 'join') {
+ controlButtons.components[0].setDisabled(true);
+ controlButtons.components[1].setDisabled(true);
+ controlButtons.components[2].setDisabled(false);
+ controlButtons.components[3].setDisabled(false);
+ controlButtons2.components[1].setDisabled(false);
+ await interaction.editReply({components:[controlButtons]});
+ await voiceInit(bot);
+ return await ctlButton.reply({content:'Joining voice channel', ephemeral:true});
+ }
+ if (ctlButton.customId === 'play') {
+ controlButtons.components[2].setDisabled(false);
+ controlButtons.components[1].setDisabled(true);
+ await interaction.editReply({components:[controlButtons]});
+ audioState();
+ player.unpause();
+ return await ctlButton.reply({content:'Resuming music', ephemeral:true});
+ }
+ if (ctlButton.customId === 'pause') {
+ controlButtons.components[2].setDisabled(true);
+ controlButtons.components[1].setDisabled(false);
+ await interaction.editReply({components:[controlButtons]});
+ audioState();
+ player.pause();
+ return await ctlButton.reply({content:'Pausing music', ephemeral:true});
+ }
+ if (ctlButton.customId === 'skip') {
+ player.stop();
+ await searchAudio(bot, interaction);
+ return await ctlButton.reply({content:`Skipping ${audio}`, ephemeral:true});
+ }
+ if (ctlButton.customId === 'next') {
+ return await interaction.editReply({ components: [controlButtons2] }).then(ctlButton.deferUpdate());
+ }
+ if (ctlButton.customId === 'back') {
+ return await interaction.editReply({ components: [controlButtons] }).then(ctlButton.deferUpdate());
+ }
+ if (ctlButton.customId === 'leave') {
+ console.log('Leaving voice channel...');
+ controlButtons.components[0].setDisabled(false);
+ controlButtons.components[1].setDisabled(true);
+ controlButtons.components[2].setDisabled(true);
+ controlButtons.components[3].setDisabled(true);
+ controlButtons2.components[1].setDisabled(true);
+ await interaction.editReply({components:[controlButtons2]});
+ await destroyAudio(interaction);
+ return await ctlButton.reply({content:'Leaving voice channel', ephemeral:true});
+ }
+ if (ctlButton.customId === 'stop') {
+ await ctlButton.reply({content:`Powering off ${bot.user.username}...`, ephemeral:true});
+ await interaction.deleteReply();
+ await collector.stop();
+ return await stopBot(bot, interaction);
+ }
+ });
+
+ collector.on('end', collected => console.log(`Collected ${collected.size} items`));
+
+ runOnce = true
+ return await interaction.reply({embeds:[controlEmbed], components:[controlButtons]});
+}
+
export async function searchAudio(bot){
//TODO: Eventually this system will need a rework so it won't repeat the same files.