Skip to content

Commit

Permalink
Created AmazonSetChannelSettingsCommand.
Browse files Browse the repository at this point in the history
  • Loading branch information
moonstar-x committed Mar 25, 2022
1 parent 7567f52 commit 816a36f
Show file tree
Hide file tree
Showing 6 changed files with 209 additions and 3 deletions.
6 changes: 6 additions & 0 deletions src/classes/tts/CachedTTSSettings.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ class CachedTTSSettings {
return merge(ProviderManager.DEFAULT_SETTINGS, guildSettings);
}

async getCurrentForChannel(channel) {
const channelSettings = await this.get(channel);

return merge(ProviderManager.DEFAULT_SETTINGS, channelSettings);
}

async _set(key, settings, cache, guild) {
const stored = await this._get(key, cache, guild);
const newSettings = merge(stored, settings);
Expand Down
5 changes: 2 additions & 3 deletions src/classes/tts/TTSChannelHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
const logger = require('@greencoast/logger');
const { cleanMessage } = require('../../utils/mentions');
const { getCantConnectToChannelReason } = require('../../utils/channel');
const ProviderManager = require('./providers/ProviderManager');

class TTSChannelHandler {
constructor(client) {
Expand Down Expand Up @@ -36,8 +35,8 @@ class TTSChannelHandler {
const ttsPlayer = this.client.getTTSPlayer(message.guild);
const connection = ttsPlayer.voice.getConnection();

const extras = channelSettings[channelSettings.provider] ||
ProviderManager.DEFAULT_SETTINGS[channelSettings.provider];
const settings = await this.client.ttsSettings.getCurrentForChannel(message.channel);
const extras = settings[channelSettings.provider];

const { me: { voice: myVoice }, name: guildName, members, channels, roles } = message.guild;
const { channel: memberChannel } = message.member.voice;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
const { SlashCommand } = require('@greencoast/discord.js-extended');
const { SlashCommandBuilder } = require('@discordjs/builders');
const logger = require('@greencoast/logger');
const AmazonProvider = require('../../../../classes/tts/providers/AmazonProvider');
const languageData = require('../../../../../provider-data/ttstool_amazon_languages.json');

class AmazonSetChannelSettingsCommand extends SlashCommand {
constructor(client) {
super(client, {
name: 'amazon_set_channel',
description: 'Sets the settings to be used with message-only based TTS from Amazon.',
emoji: ':pencil2:',
group: 'amazon-tts',
guildOnly: true,
userPermissions: ['MANAGE_CHANNELS'],
dataBuilder: new SlashCommandBuilder()
.addSubcommand((input) => {
return input
.setName('language')
.setDescription('Sets the language to be used by the message-only based TTS.')
.addStringOption((input) => {
return input
.setName('value')
.setDescription('The language to use from now. Use /amazon_langs to see a list of supported languages.')
.setRequired(true);
});
})
.addSubcommand((input) => {
return input
.setName('voice')
.setDescription('Sets the voice to be used by the message-only based TTS.')
.addStringOption((input) => {
return input
.setName('value')
.setDescription('The voice to be used from now. Use /amazon_voices to see a list of supported voices.')
.setRequired(true);
});
})
.addSubcommand((input) => {
return input
.setName('volume')
.setDescription('Sets the volume to be used used by the message-only based TTS.')
.addStringOption((input) => {
return input
.setName('value')
.setDescription('The volume to be used from now.')
.setRequired(true)
.setChoices(AmazonProvider.getSupportedVolumeChoices());
});
})
.addSubcommand((input) => {
return input
.setName('rate')
.setDescription('Sets the rate to be used by the message-only based TTS.')
.addStringOption((input) => {
return input
.setName('value')
.setDescription('The rate to be used from now.')
.setRequired(true)
.setChoices(AmazonProvider.getSupportedRateChoices());
});
})
.addSubcommand((input) => {
return input
.setName('pitch')
.setDescription('Sets the pitch to be used by the message-only based TTS.')
.addStringOption((input) => {
return input
.setName('value')
.setDescription('The pitch to be used from now.')
.setRequired(true)
.setChoices(AmazonProvider.getSupportedPitchChoices());
});
})
});
}

async handleLanguage(interaction, localizer) {
const language = interaction.options.getString('value');
const languageInfo = languageData[language];

if (!languageInfo) {
return interaction.reply({ content: localizer.t('channel_commands.amazon.settings.language.unsupported', { language }) });
}

const [defaultVoice] = languageInfo.voices;

await this.client.ttsSettings.set(interaction.channel, {
[AmazonProvider.NAME]: {
language,
voice: defaultVoice.id
}
});

logger.info(`${interaction.guild.name} has changed the amazon language for the channel ${interaction.channel.name} to ${language} with voice ${defaultVoice.name}.`);
return interaction.reply({ content: localizer.t('channel_commands.amazon.settings.language.success', { language, voice: defaultVoice.name }) });
}

async handleVoice(interaction, localizer) {
const voice = interaction.options.getString('value').toLowerCase();

const settings = await this.client.ttsSettings.getCurrentForChannel(interaction.channel);
const { language } = settings[AmazonProvider.NAME];
const languageInfo = languageData[language];

const voiceInfo = languageInfo.voices.find((v) => v.name.toLowerCase() === voice);

if (!voiceInfo) {
return interaction.reply({ content: localizer.t('channel_commands.amazon.settings.voice.unsupported', { voice }) });
}

await this.client.ttsSettings.set(interaction.channel, {
[AmazonProvider.NAME]: {
language,
voice: voiceInfo.id
}
});

logger.info(`${interaction.channel.name} has changed the amazon voice for the channel ${interaction.channel.name} to ${voiceInfo.name}.`);
return interaction.reply({ content: localizer.t('channel_commands.amazon.settings.voice.success', { voice: voiceInfo.name }) });
}

async handleVolume(interaction, localizer) {
const volume = interaction.options.getString('value');

await this.client.ttsSettings.set(interaction.channel, { [AmazonProvider.NAME]: { volume } });

logger.info(`${interaction.guild.name} has changed the amazon volume for the channel ${interaction.channel.name} to ${volume}.`);
return interaction.reply({ content: localizer.t('channel_commands.amazon.settings.volume.success', { volume }) });
}

async handleRate(interaction, localizer) {
const rate = interaction.options.getString('value');

await this.client.ttsSettings.set(interaction.channel, { [AmazonProvider.NAME]: { rate } });

logger.info(`${interaction.guild.name} has changed the amazon rate for the channel ${interaction.channel.name} to ${rate}.`);
return interaction.reply({ content: localizer.t('channel_commands.amazon.settings.rate.success', { rate }) });
}

async handlePitch(interaction, localizer) {
const pitch = interaction.options.getString('value');

await this.client.ttsSettings.set(interaction.channel, { [AmazonProvider.NAME]: { pitch } });

logger.info(`${interaction.guild.name} has changed the amazon pitch for the channel ${interaction.channel.name} to ${pitch}.`);
return interaction.reply({ content: localizer.t('channel_commands.amazon.settings.pitch.success', { pitch }) });
}

async run(interaction) {
const localizer = this.client.localizer.getLocalizer(interaction.guild);
const subCommand = interaction.options.getSubcommand();

switch (subCommand) {
case 'language':
return this.handleLanguage(interaction, localizer);
case 'voice':
return this.handleVoice(interaction, localizer);
case 'volume':
return this.handleVolume(interaction, localizer);
case 'rate':
return this.handleRate(interaction, localizer);
case 'pitch':
return this.handlePitch(interaction, localizer);
default:
throw new Error(`Invalid subcommand ${subCommand} supplied to AmazonSetChannelSettingsCommand.`);
}
}
}

module.exports = AmazonSetChannelSettingsCommand;
10 changes: 10 additions & 0 deletions src/locales/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,16 @@ const CHANNEL_COMMANDS = {
'channel_commands.delete.already_disabled': 'Message-only based TTS is already disabled on this channel.',
'channel_commands.delete.success': 'Message-only based TTS has been disabled on this channel and its settings have been removed.',

'channel_commands.amazon.settings.language.unsupported': 'Language **{language}** is not supported by the Amazon provider. Use **/amazon_langs** to check the languages available.',
'channel_commands.amazon.settings.language.success': "You have successfully changed the language for this channel to **{language}** with **{voice}**'s voice.",

'channel_commands.amazon.settings.voice.unsupported': 'The voice **{voice}** is not supported for the language of this channel. Use **/amazon_voices** to check the voices available.',
'channel_commands.amazon.settings.voice.success': "You have successfully changed this channel's voice to **{voice}**.",

'channel_commands.amazon.settings.volume.success': "You have successfully changed this channel's volume to **{volume}**.",
'channel_commands.amazon.settings.rate.success': "You have successfully changed this channel's rate to **{rate}**.",
'channel_commands.amazon.settings.pitch.success': "You have successfully changed this channel's pitch to **{pitch}**.",

'channel_commands.google.settings.language.invalid': "That's not a valid language. Type **/google_langs** for a list of available languages.",
'channel_commands.google.settings.language.success': 'You have successfully changed the language for this channel to **{language}**.',
'channel_commands.google.settings.speed.success': 'You have successfully changed the speed for this channel to **{speed}**.'
Expand Down
10 changes: 10 additions & 0 deletions src/locales/es.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,16 @@ const CHANNEL_COMMANDS = {
'channel_commands.delete.already_disabled': 'TTS basado en solo mensajes ya está desactivado en este canal.',
'channel_commands.delete.success': 'TTS basado en solo mensajes ha sido desactivado en este canal y su configuración ha sido eliminada.',

'channel_commands.amazon.settings.language.unsupported': 'El idioma **{language}** no está disponible en el proveedor de Amazon. Utiliza **/amazon_langs** para obtener una lista de los idiomas disponibles.',
'channel_commands.amazon.settings.language.success': 'Has cambiado con éxito el idioma de este canal a **{language}** con la voz de **{voice}**.',

'channel_commands.amazon.settings.voice.unsupported': 'La voz **{voice}** no está disponible para el idioma de este canal. Utiliza **/amazon_voices** para obtener una lista de los idiomas disponibles.',
'channel_commands.amazon.settings.voice.success': 'Has cambiado la voz de este canal a **{voice}** con éxito.',

'channel_commands.amazon.settings.volume.success': 'Has cambiado el volumen de este canal a **{volume}** con éxito.',
'channel_commands.amazon.settings.rate.success': 'Has cambiado el ritmo de este canal a **{rate}** con éxito.',
'channel_commands.amazon.settings.pitch.success': 'Has cambiado el tono de este canal a **{pitch}** con éxito.',

'channel_commands.google.settings.language.invalid': 'Ese no es un idioma válido. Escribe **/google_langs** para obtener una lista de los idiomas disponibles.',
'channel_commands.google.settings.language.success': 'Has cambiado el idioma de este canal a **{language}** con éxito.',
'channel_commands.google.settings.speed.success': 'Has cambiado la velocidad de este canal a **{speed}** con éxito.'
Expand Down
10 changes: 10 additions & 0 deletions src/locales/fr.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,16 @@ const CHANNEL_COMMANDS = {
'channel_commands.delete.already_disabled': 'TTS basé uniquement en messages est déjà désactivé dans ce canal.',
'channel_commands.delete.success': 'TTS basé uniquement en messages est désormais désactivé et ses réglages sont éliminés.',

'channel_commands.amazon.settings.language.unsupported': "La langue **{language}** n'est pas disponible pour le fournisseur d'Amazon. Utilisez **/amazon_langs** pour obtenir une liste des langues disponibles.",
'channel_commands.amazon.settings.language.success': 'Vous avez changé la langue de ce canal à **{language}** avec la voix de **{voice}**.',

'channel_commands.amazon.settings.voice.unsupported': "La voix **{voice}** n'est pas disponible pour la langue de ce canal. Utilisez **/amazon_voices** pour obtenir une liste des voix disponibles.",
'channel_commands.amazon.settings.voice.success': 'Vous avez changé la voix de ce canal à **{voice}** avec succès.',

'channel_commands.amazon.settings.volume.success': 'Vous avez changé le volume de ce canal à **{volume}** avec succès.',
'channel_commands.amazon.settings.rate.success': 'Vous avez changé le rythme de ce canal à **{rate}** avec succès.',
'channel_commands.amazon.settings.pitch.success': 'Vous avez changé le ton de voix de ce canal à **{pitch}** avec succès.',

'channel_commands.google.settings.language.invalid': "Cela n'est pas une langue valide. Utilisez **/google_langs** pour obtenir une liste de toutes les langues disponibles.",
'channel_commands.google.settings.language.success': 'Vous avez changé la langue de ce canal à **{language}** avec succès.',
'channel_commands.google.settings.speed.success': 'Vous avez changé la vitesse de ce canal à **{speed}** avec succès.'
Expand Down

0 comments on commit 816a36f

Please sign in to comment.