aboutsummaryrefslogtreecommitdiff
path: root/AudioBackend
diff options
context:
space:
mode:
Diffstat (limited to 'AudioBackend')
-rw-r--r--AudioBackend/AudioControl.js20
-rw-r--r--AudioBackend/PlayAudio.js52
-rw-r--r--AudioBackend/QueueSystem.js8
-rw-r--r--AudioBackend/Shutdown.js11
-rw-r--r--AudioBackend/VoiceInitialization.js14
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);
});