aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Lee <alee14498@protonmail.com>2022-07-05 18:16:06 -0400
committerAndrew Lee <alee14498@protonmail.com>2022-07-05 18:16:06 -0400
commita8ec9fe1b8e25af4e1faa6548ee74bfa0643831f (patch)
tree70960f5366f1a8542cb58b1e5a181ae4a4d306f7
parent219b64b51b0297469c7a0401767d7f533c8ac7c3 (diff)
downloadDLAP-a8ec9fe1b8e25af4e1faa6548ee74bfa0643831f.tar.gz
DLAP-a8ec9fe1b8e25af4e1faa6548ee74bfa0643831f.tar.bz2
DLAP-a8ec9fe1b8e25af4e1faa6548ee74bfa0643831f.zip
The start of scrapping the control panel feature
-rw-r--r--AudioBackend.js134
-rw-r--r--bot.js8
-rw-r--r--commands/control.js122
-rw-r--r--commands/help.js2
-rw-r--r--commands/leave.js32
-rw-r--r--commands/pause.js35
-rw-r--r--commands/play.js2
-rw-r--r--commands/skip.js31
-rw-r--r--commands/status.js32
-rw-r--r--config.json.bday9
-rw-r--r--deploy-command.js2
-rw-r--r--package.json2
12 files changed, 281 insertions, 130 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.
diff --git a/bot.js b/bot.js
index 476138d..78b9308 100644
--- a/bot.js
+++ b/bot.js
@@ -89,12 +89,12 @@ bot.on('interactionCreate', async interaction => {
try {
await command.execute(interaction, bot);
- } catch (error) {
- console.error(error);
- if (error == null) {
+ } catch (e) {
+ console.error(e);
+ if (e == null) {
await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true });
} else {
- await interaction.reply({ content: `There was an error while executing this command! Share this to the bot owner!\n\nDetails:\`\`\`${error}\`\`\``, ephemeral: true });
+ await interaction.reply({ content: `There was an error while executing this command! Share this to the bot owner!\n\nDetails:\`\`\`${e}\`\`\``, ephemeral: true });
}
}
});
diff --git a/commands/control.js b/commands/control.js
index 6007dcc..435c102 100644
--- a/commands/control.js
+++ b/commands/control.js
@@ -20,14 +20,9 @@
***************************************************************************/
import { SlashCommandBuilder } from '@discordjs/builders'
-import { MessageEmbed, MessageActionRow, MessageButton } from 'discord.js'
-import { audio, player, destroyAudio, voiceInit, stopBot, searchAudio, playerState, audioState } from '../AudioBackend.js'
+import { controlPanel } from '../AudioBackend.js'
import config from '../config.json' assert {type: 'json'}
-export let controlEmbed
-export let controlButtons
-export let controlButtons2
-
let runOnce = false
export default {
@@ -36,119 +31,6 @@ export default {
.setDescription('Controlling the music'),
async execute(interaction, bot) {
if (![config.botOwner].includes(interaction.user.id)) return await interaction.reply({ content: "You do not have permissions to execute this command.", ephemeral: true });
- 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')
- .setDisabled(true),
- new MessageButton()
- .setStyle('SECONDARY')
- .setLabel('Play')
- .setCustomId('play')
- .setDisabled(true),
- new MessageButton()
- .setStyle('SECONDARY')
- .setLabel('Pause')
- .setCustomId('pause'),
- new MessageButton()
- .setStyle('SECONDARY')
- .setLabel('Skip')
- .setCustomId('skip'),
- new MessageButton()
- .setStyle('PRIMARY')
- .setLabel('>>')
- .setCustomId('next'),
- );
-
- controlButtons2 = new MessageActionRow()
- .addComponents(
- new MessageButton()
- .setStyle('PRIMARY')
- .setLabel('<<')
- .setCustomId('back'),
- new MessageButton()
- .setStyle('DANGER')
- .setLabel('Leave')
- .setCustomId('leave'),
- new MessageButton()
- .setStyle('DANGER')
- .setLabel('Power Off')
- .setCustomId('stop')
- )
-
- const filter = i => i.user.id === config.botOwner;
-
- const collector = interaction.channel.createMessageComponentCollector({filter});
-
- collector.on('collect', async ctlButton => {
- if (ctlButton.customId === 'join') {
- await ctlButton.reply({content:'Joining voice channel', ephemeral:true});
- 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]});
- return await voiceInit(bot);
- }
- if (ctlButton.customId === 'play') {
- controlButtons.components[2].setDisabled(false);
- controlButtons.components[1].setDisabled(true);
- await interaction.editReply({components:[controlButtons]});
- await ctlButton.reply({content:'Resuming music', ephemeral:true});
- audioState();
- return player.unpause();
- }
- if (ctlButton.customId === 'pause') {
- controlButtons.components[2].setDisabled(true);
- controlButtons.components[1].setDisabled(false);
- await interaction.editReply({components:[controlButtons]});
- await ctlButton.reply({content:'Pausing music', ephemeral:true});
- audioState();
- return player.pause();
- }
- if (ctlButton.customId === 'skip') {
- await ctlButton.reply({content:`Skipping ${audio}`, ephemeral:true});
- player.stop();
- return await searchAudio(bot, interaction);
- }
- 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') {
- await ctlButton.reply({content:'Leaving voice channel', ephemeral:true});
- 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]});
- return await destroyAudio(interaction);
- }
- if (ctlButton.customId === 'stop') {
- await ctlButton.reply({content:`Powering off ${bot.user.username}...`, ephemeral:true});
- await interaction.deleteReply();
- 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]});
+ await controlPanel(interaction, bot);
},
}; \ No newline at end of file
diff --git a/commands/help.js b/commands/help.js
index 11d9d60..ec0283c 100644
--- a/commands/help.js
+++ b/commands/help.js
@@ -36,6 +36,6 @@ export default {
.setFooter({text:'© Copyright 2020-2022 Andrew Lee'})
.setColor('#0066ff')
- return await interaction.reply({ embeds: [helpEmbed]});
+ return await interaction.reply({ embeds: [helpEmbed] });
},
}; \ No newline at end of file
diff --git a/commands/leave.js b/commands/leave.js
new file mode 100644
index 0000000..e1fa67d
--- /dev/null
+++ b/commands/leave.js
@@ -0,0 +1,32 @@
+/**************************************************************************
+ *
+ * DLAP Bot: A Discord bot that plays local audio tracks.
+ * (C) Copyright 2022
+ * Programmed by Andrew Lee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ ***************************************************************************/
+
+import { SlashCommandBuilder } from '@discordjs/builders'
+
+export default {
+ data: new SlashCommandBuilder()
+ .setName('leave')
+ .setDescription('Leaves the voice chat'),
+ async execute(interaction) {
+
+
+ },
+}; \ No newline at end of file
diff --git a/commands/pause.js b/commands/pause.js
new file mode 100644
index 0000000..c0edeeb
--- /dev/null
+++ b/commands/pause.js
@@ -0,0 +1,35 @@
+/**************************************************************************
+ *
+ * DLAP Bot: A Discord bot that plays local audio tracks.
+ * (C) Copyright 2022
+ * Programmed by Andrew Lee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ ***************************************************************************/
+
+import { SlashCommandBuilder } from '@discordjs/builders'
+import config from '../config.json' assert {type: 'json'}
+
+export let integer;
+
+export default {
+ data: new SlashCommandBuilder()
+ .setName('pause')
+ .setDescription('Pauses the player'),
+ async execute(interaction, bot) {
+ if (![config.botOwner].includes(interaction.user.id)) return await interaction.reply({ content: "You do not have permissions to execute this command.", ephemeral: true });
+
+ },
+}; \ No newline at end of file
diff --git a/commands/play.js b/commands/play.js
index cc88bb3..a6d3453 100644
--- a/commands/play.js
+++ b/commands/play.js
@@ -28,7 +28,7 @@ export let integer;
export default {
data: new SlashCommandBuilder()
.setName('play')
- .setDescription('Plays the audio by number')
+ .setDescription('Plays the player')
.addIntegerOption(option =>
option.setName('int')
.setDescription('Input a number for the selection for the audio file.'),
diff --git a/commands/skip.js b/commands/skip.js
new file mode 100644
index 0000000..11a0c83
--- /dev/null
+++ b/commands/skip.js
@@ -0,0 +1,31 @@
+/**************************************************************************
+ *
+ * DLAP Bot: A Discord bot that plays local audio tracks.
+ * (C) Copyright 2022
+ * Programmed by Andrew Lee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ ***************************************************************************/
+
+import { SlashCommandBuilder } from '@discordjs/builders'
+
+export default {
+ data: new SlashCommandBuilder()
+ .setName('skip')
+ .setDescription('Skips the track'),
+ async execute(interaction) {
+
+ },
+}; \ No newline at end of file
diff --git a/commands/status.js b/commands/status.js
new file mode 100644
index 0000000..f36f994
--- /dev/null
+++ b/commands/status.js
@@ -0,0 +1,32 @@
+/**************************************************************************
+ *
+ * DLAP Bot: A Discord bot that plays local audio tracks.
+ * (C) Copyright 2022
+ * Programmed by Andrew Lee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ ***************************************************************************/
+
+import { SlashCommandBuilder } from '@discordjs/builders'
+import { readdirSync, readdir } from 'fs'
+
+export default {
+ data: new SlashCommandBuilder()
+ .setName('status')
+ .setDescription('Checks what audio file is playing currently'),
+ async execute(interaction) {
+
+ },
+}; \ No newline at end of file
diff --git a/config.json.bday b/config.json.bday
new file mode 100644
index 0000000..638749f
--- /dev/null
+++ b/config.json.bday
@@ -0,0 +1,9 @@
+{
+ "token": "NzM0MTgyMjQzNzI3MzEwOTQx.XxN-fw.6cNeekrzUzSlBIqPl_JOXKNSLRc",
+ "botOwner": "242775871059001344",
+ "voiceChannel": "949346341828579362",
+ "statusChannel": "957105448694198293",
+ "guildID": "949346341828579358",
+ "clientID": "734182243727310941",
+ "txtFile": true
+}
diff --git a/deploy-command.js b/deploy-command.js
index 9386556..c85637f 100644
--- a/deploy-command.js
+++ b/deploy-command.js
@@ -11,7 +11,7 @@ for (const file of commandFiles) {
commands.push(command.data.toJSON());
}
-const rest = new REST({ version: '10' }).setToken(config.token);
+const rest = new REST({ version: '9' }).setToken(config.token);
rest.put(Routes.applicationGuildCommands(config.clientID, config.guildID), { body: commands })
.then(() => console.log('Successfully registered application commands.'))
diff --git a/package.json b/package.json
index 9a07e1f..f595ad0 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"@discordjs/rest": "^0.3.0",
"@discordjs/voice": "^0.8.0",
"discord-api-types": "^0.30.0",
- "discord.js": "^13.6.0",
+ "discord.js": "^13.8.1",
"ffmpeg-static": "^5.0.0",
"libsodium-wrappers": "^0.7.10"
},