diff options
| author | Andrew Lee <alee14498@protonmail.com> | 2022-07-05 18:16:06 -0400 |
|---|---|---|
| committer | Andrew Lee <alee14498@protonmail.com> | 2022-07-05 18:16:06 -0400 |
| commit | a8ec9fe1b8e25af4e1faa6548ee74bfa0643831f (patch) | |
| tree | 70960f5366f1a8542cb58b1e5a181ae4a4d306f7 | |
| parent | 219b64b51b0297469c7a0401767d7f533c8ac7c3 (diff) | |
| download | DLAP-a8ec9fe1b8e25af4e1faa6548ee74bfa0643831f.tar.gz DLAP-a8ec9fe1b8e25af4e1faa6548ee74bfa0643831f.tar.bz2 DLAP-a8ec9fe1b8e25af4e1faa6548ee74bfa0643831f.zip | |
The start of scrapping the control panel feature
| -rw-r--r-- | AudioBackend.js | 134 | ||||
| -rw-r--r-- | bot.js | 8 | ||||
| -rw-r--r-- | commands/control.js | 122 | ||||
| -rw-r--r-- | commands/help.js | 2 | ||||
| -rw-r--r-- | commands/leave.js | 32 | ||||
| -rw-r--r-- | commands/pause.js | 35 | ||||
| -rw-r--r-- | commands/play.js | 2 | ||||
| -rw-r--r-- | commands/skip.js | 31 | ||||
| -rw-r--r-- | commands/status.js | 32 | ||||
| -rw-r--r-- | config.json.bday | 9 | ||||
| -rw-r--r-- | deploy-command.js | 2 | ||||
| -rw-r--r-- | package.json | 2 |
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. @@ -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" }, |
