diff options
| author | Andrew Lee <alee14498@protonmail.com> | 2024-02-17 00:07:31 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-17 00:07:31 -0500 |
| commit | 214a83c0f696ac731c54b00bf7503f87e497afa6 (patch) | |
| tree | 15d57b08e69d19fb4c2f3effb9937aec8d042bdc /AudioBackend | |
| parent | b29ab06623fd24cfc2a611bdd658b4d2ef934335 (diff) | |
| parent | c848f1d90fef40ffa81915d7dd875a2ee6d6c8d5 (diff) | |
| download | DLAP-214a83c0f696ac731c54b00bf7503f87e497afa6.tar.gz DLAP-214a83c0f696ac731c54b00bf7503f87e497afa6.tar.bz2 DLAP-214a83c0f696ac731c54b00bf7503f87e497afa6.zip | |
Merge pull request #17 from Alee14/testing
Merging testing branch
Diffstat (limited to 'AudioBackend')
| -rw-r--r-- | AudioBackend/AudioControl.js | 20 | ||||
| -rw-r--r-- | AudioBackend/PlayAudio.js | 52 | ||||
| -rw-r--r-- | AudioBackend/QueueSystem.js | 8 | ||||
| -rw-r--r-- | AudioBackend/Shutdown.js | 11 | ||||
| -rw-r--r-- | AudioBackend/VoiceInitialization.js | 14 |
5 files changed, 70 insertions, 35 deletions
diff --git a/AudioBackend/AudioControl.js b/AudioBackend/AudioControl.js index 3a9c7a5..57d8ed7 100644 --- a/AudioBackend/AudioControl.js +++ b/AudioBackend/AudioControl.js @@ -22,21 +22,24 @@ import { readdirSync, readFileSync } from 'node:fs'; import { shufflePlaylist, orderPlaylist } from './QueueSystem.js'; import { playAudio, currentTrack, updatePlaylist } from './PlayAudio.js'; import { player } from './VoiceInitialization.js'; +import i18next from '../Utilities/i18n.js'; +const t = i18next.t; const { shuffle, repeat } = JSON.parse(readFileSync('./config.json', 'utf-8')); export const files = readdirSync('music'); export let playerState; +export let playerStatus; export let isAudioStatePaused; let totalTrack = files.length; async function repeatCheck(bot) { if (repeat) { - console.log('All beats in the playlist has finished, repeating beats...'); + console.log(t('musicRepeatingFinished')); totalTrack = files.length; return (shuffle) ? await shufflePlaylist(bot) : await orderPlaylist(bot); } else { - console.log('All beats in the playlist has finished.'); + console.log(t('musicPlaylistFinished')); updatePlaylist('stop'); audioState(2); } @@ -53,9 +56,9 @@ export async function nextAudio(bot) { export async function previousAudio(bot, interaction) { if (currentTrack <= 0) { - return await interaction.reply({ content: 'You are at the beginning of the playlist, cannot go further than this', ephemeral: true }); + return await interaction.reply({ content: t('previousBeginningPlaylist'), ephemeral: true }); } else { - await interaction.reply({ content: 'Playing previous music' }); + await interaction.reply({ content: t('musicPrevious') }); player.stop(); updatePlaylist('back'); return await playAudio(bot); @@ -73,17 +76,20 @@ export function toggleAudioState() { export function audioState(state) { switch (state) { case 0: - playerState = 'Playing'; + playerState = t('playPlayerState'); + playerStatus = 0; isAudioStatePaused = false; player.unpause(); break; case 1: - playerState = 'Paused'; + playerState = t('pausePlayerState'); + playerStatus = 1; isAudioStatePaused = true; player.pause(); break; case 2: - playerState = 'Stopped'; + playerState = t('stopPlayerState'); + playerStatus = 2; totalTrack = files.length; isAudioStatePaused = true; player.stop(); diff --git a/AudioBackend/PlayAudio.js b/AudioBackend/PlayAudio.js index e8a0f3a..d671e5a 100644 --- a/AudioBackend/PlayAudio.js +++ b/AudioBackend/PlayAudio.js @@ -21,11 +21,14 @@ import { createAudioResource } from '@discordjs/voice'; import { parseFile } from 'music-metadata'; import { readdirSync, readFileSync, writeFile } from 'node:fs'; -import { EmbedBuilder } from 'discord.js'; +import { EmbedBuilder, AttachmentBuilder } from 'discord.js'; import { player } from './VoiceInitialization.js'; import { audioState, files } from './AudioControl.js'; import { integer } from '../Commands/play.js'; +import i18next from '../Utilities/i18n.js'; + const { statusChannel, txtFile } = JSON.parse(readFileSync('./config.json', 'utf-8')); +const t = i18next.t; let fileData; @@ -38,6 +41,7 @@ export let audioTitle; export let audioArtist; export let audioYear; export let audioAlbum; +export let audioPicture; export let duration; const inputFiles = readdirSync('music'); @@ -45,9 +49,10 @@ export async function playAudio(bot) { const resource = createAudioResource('music/' + audio); player.play(resource); - console.log(`Now playing: ${audio}`); + console.log(t('nowPlayingFile', { audio })); audioState(0); + audioPicture = null; const audioFile = audio; @@ -59,6 +64,13 @@ export async function playAudio(bot) { audioArtist = common.artist; audioYear = common.year; audioAlbum = common.album; + if (common.picture) { + // Convert base64 image to a buffer + const imageBuffer = Buffer.from(common.picture[0].data, 'base64'); + + // Create a new attachment using the buffer + audioPicture = new AttachmentBuilder(imageBuffer, { name: 'albumArt.png' }); + } } else { metadataEmpty = true; } @@ -70,34 +82,44 @@ export async function playAudio(bot) { audio = audio.split('.').slice(0, -1).join('.'); if (txtFile) { - fileData = `Now Playing: ${audio}`; + fileData = t('nowPlayingFile', { audio }); writeFile('./now-playing.txt', fileData, (err) => { if (err) { console.log(err); } }); } const statusEmbed = new EmbedBuilder(); + if (metadataEmpty) { - statusEmbed.setTitle('Now Playing'); + statusEmbed.setTitle(t('nowPlaying')); statusEmbed.addFields( - { name: 'Title', value: `${audio}` }, - { name: 'Duration', value: `${duration}` } + { name: t('musicTitle'), value: `${audio}` }, + { name: t('musicDuration'), value: `${duration}` } ); statusEmbed.setColor('#0066ff'); } else { - statusEmbed.setTitle('Now Playing'); + statusEmbed.setTitle(t('nowPlaying')); statusEmbed.addFields( - { name: 'Title', value: `${audioTitle}`, inline: true }, - { name: 'Artist', value: `${audioArtist}`, inline: true }, - { name: 'Year', value: `${audioYear}` }, - { name: 'Duration', value: `${duration}` } + { name: t('musicTitle'), value: `${audioTitle}`, inline: true }, + { name: t('musicArtist'), value: `${audioArtist}`, inline: true }, + { name: t('musicYear'), value: `${audioYear}` }, + { name: t('musicDuration'), value: `${duration}` } ); - statusEmbed.setFooter({ text: `Album: ${audioAlbum}\nFilename: ${audioFile}` }); + + if (audioPicture) { + statusEmbed.setThumbnail('attachment://albumArt.png'); + } + + statusEmbed.setFooter({ text: t('playerFooter', { audioAlbum, audioFile }) }); statusEmbed.setColor('#0066ff'); } const channel = bot.channels.cache.get(statusChannel); - if (!channel) return console.error('The status channel does not exist! Skipping.'); - return await channel.send({ embeds: [statusEmbed] }); + if (!channel) return console.error(t('statusChannelError')); + if (audioPicture) { + return await channel.send({ embeds: [statusEmbed], files: [audioPicture] }); + } else { + return await channel.send({ embeds: [statusEmbed] }); + } } export function updatePlaylist(option) { @@ -118,7 +140,7 @@ export function updatePlaylist(option) { audio = inputFiles[integer]; break; case 'stop': - audio = 'Not Playing'; + audio = t('notPlaying'); break; } } diff --git a/AudioBackend/QueueSystem.js b/AudioBackend/QueueSystem.js index 0cd6ded..2bab8eb 100644 --- a/AudioBackend/QueueSystem.js +++ b/AudioBackend/QueueSystem.js @@ -20,6 +20,8 @@ ***************************************************************************/ import { playAudio, updatePlaylist } from './PlayAudio.js'; import { files } from './AudioControl.js'; +import i18next from '../Utilities/i18n.js'; +const t = i18next.t; function shuffleArray(array) { // Durstenfeld Shuffle @@ -29,16 +31,16 @@ function shuffleArray(array) { } } export async function orderPlaylist(bot) { - console.log('Playing beats by order...'); + console.log(t('musicPlayOrder')); updatePlaylist('reset'); console.log(files); return await playAudio(bot); } export async function shufflePlaylist(bot) { - console.log('Shuffling beats...'); + console.log(t('musicShuffling')); shuffleArray(files); - console.log('Playing beats by shuffle...'); + console.log(t('musicPlayShuffle')); updatePlaylist('reset'); console.log(files); return await playAudio(bot); diff --git a/AudioBackend/Shutdown.js b/AudioBackend/Shutdown.js index fb89505..dcc57f7 100644 --- a/AudioBackend/Shutdown.js +++ b/AudioBackend/Shutdown.js @@ -24,12 +24,15 @@ import { updatePlaylist } from './PlayAudio.js'; import { audioState } from './AudioControl.js'; import { readFileSync, writeFile } from 'node:fs'; import { getVoiceConnection, VoiceConnectionStatus } from '@discordjs/voice'; +import i18next from '../Utilities/i18n.js'; + const { statusChannel, txtFile } = JSON.parse(readFileSync('./config.json', 'utf-8')); let fileData; +const t = i18next.t; export async function destroyAudio(interaction) { if (txtFile) { - fileData = 'Now Playing: Nothing'; + fileData = t('txtNothing'); writeFile('now-playing.txt', fileData, (err) => { if (err) { console.log(err); } }); @@ -47,13 +50,13 @@ export async function destroyAudio(interaction) { export async function stopBot(bot, interaction) { const statusEmbed = new EmbedBuilder() .setAuthor({ name: bot.user.username, iconURL: bot.user.avatarURL() }) - .setDescription(`That's all folks! Powering down ${bot.user.username}...`) + .setDescription(t('statusShutdown', { bot: bot.user.username })) .setColor('#0066ff'); const channel = bot.channels.cache.get(statusChannel); - if (!channel) return console.error('The status channel does not exist! Skipping.'); + if (!channel) return console.error(t('statusChannelError')); await channel.send({ embeds: [statusEmbed] }); - console.log(`Powering off ${bot.user.username}...`); + console.log(t('powerOff', { bot: bot.user.username })); await destroyAudio(interaction); await bot.destroy(); return process.exit(0); diff --git a/AudioBackend/VoiceInitialization.js b/AudioBackend/VoiceInitialization.js index ae1241b..0088fbd 100644 --- a/AudioBackend/VoiceInitialization.js +++ b/AudioBackend/VoiceInitialization.js @@ -19,13 +19,15 @@ * ***************************************************************************/ import { readFileSync } from 'node:fs'; -import { createAudioPlayer, joinVoiceChannel, VoiceConnectionStatus } from '@discordjs/voice'; +import { createAudioPlayer, joinVoiceChannel, VoiceConnectionStatus, AudioPlayerStatus } from '@discordjs/voice'; import { nextAudio } from './AudioControl.js'; import { shufflePlaylist, orderPlaylist } from './QueueSystem.js'; import { votes } from '../Utilities/Voting.js'; +import i18next from '../Utilities/i18n.js'; const { voiceChannel, shuffle } = JSON.parse(readFileSync('./config.json', 'utf-8')); export const player = createAudioPlayer(); +const t = i18next.t; export async function voiceInit(bot) { bot.channels.fetch(voiceChannel).then(async channel => { const connection = joinVoiceChannel({ @@ -35,16 +37,16 @@ export async function voiceInit(bot) { }); connection.on(VoiceConnectionStatus.Connecting, () => { - console.log(`Connecting to ${channel.name}...`); + console.log(t('voiceConnecting', { channel: channel.name })); }); connection.on(VoiceConnectionStatus.Ready, async() => { - console.log('Ready to blast some beats!'); + console.log(t('voiceReady')); return (shuffle) ? await shufflePlaylist(bot) : await orderPlaylist(bot); }); connection.on(VoiceConnectionStatus.Destroyed, () => { - console.log('Destroyed the beats...'); + console.log(t('voiceDestroyed')); }); player.on('error', error => { @@ -52,8 +54,8 @@ export async function voiceInit(bot) { nextAudio(bot); }); - player.on('idle', () => { - console.log('Beat has finished playing, now playing next beat...'); + player.on(AudioPlayerStatus.Idle, () => { + console.log(t('musicsFinished')); votes.clear(); nextAudio(bot); }); |
