LoquendoBot/src/js/settings.js
2024-01-05 04:14:49 +01:00

792 lines
31 KiB
JavaScript

/* global settings,main sttModels, setZoomLevel, webFrame, theme, fs, settingsPath, ini, startVoiceRecognition,notificationSoundAudioDevices, ttsAudioDevices, notificationSound, path, resourcesPath, ipcRenderer, auth, shell, sound, twitch, server, backend */
function getGeneralSettings() {
// General
document.body.querySelector('#PORT').value = settings.GENERAL.PORT;
document.body.querySelector('#ZOOMLEVEL').value = settings.GENERAL.ZOOMLEVEL * 100;
webFrame.setZoomFactor(parseFloat(settings.GENERAL.ZOOMLEVEL));
// Theme
document.querySelector('#USE_CUSTOM_THEME').value = settings.THEME.USE_CUSTOM_THEME;
document.body.querySelector('#USE_CUSTOM_THEME').checked = settings.THEME.USE_CUSTOM_THEME === true ? 1 : 0;
theme.setTheme();
// STT
document.body.querySelector('#USE_STT').checked = settings.STT.USE_STT;
// Language detection
document.body.querySelector('#USE_DETECTION').checked = settings.LANGUAGE.USE_DETECTION;
document.body.querySelector('#OUTPUT_TO_TTS').checked = settings.LANGUAGE.OUTPUT_TO_TTS;
document.body.querySelector('#SEND_TRANSLATION').checked = settings.LANGUAGE.SEND_TRANSLATION;
document.body.querySelector('#BROADCAST_TRANSLATION').checked = settings.LANGUAGE.BROADCAST_TRANSLATION;
// TTS
document.body.querySelector('#USE_TTS').checked = settings.TTS.USE_TTS;
// Notification sounds
document.body.querySelector('#USE_NOTIFICATION_SOUNDS').checked = settings.AUDIO.USE_NOTIFICATION_SOUNDS;
// Twitch
document.body.querySelector('#USE_TWITCH').checked = settings.TWITCH.USE_TWITCH;
document.body.querySelector('#TWITCH_CHANNEL_NAME').value = settings.TWITCH.CHANNEL_NAME;
document.body.querySelector('#TWITCH_OAUTH_TOKEN').value = settings.TWITCH.OAUTH_TOKEN;
// Modules
document.body.querySelector('#USE_MODULES').checked = settings.MODULES.USE_MODULES;
document.body.querySelector('#USE_VTUBER').checked = settings.MODULES.USE_VTUBER;
document.body.querySelector('#VTUBER_URL').value = `http://localhost:${settings.GENERAL.PORT}/vtuber/`;
showMenuButton('#btnBrowsersourceVtuber', settings.MODULES.USE_VTUBER);
document.body.querySelector('#USE_CHATBUBBLE').checked = settings.MODULES.USE_CHATBUBBLE;
document.body.querySelector('#CHATBUBBLE_URL').value = `http://localhost:${settings.GENERAL.PORT}/chat/`;
showMenuButton('#btnBrowsersourceChat', settings.GENERAL.USE_CHATBUBBLE);
// Amazon
document.body.querySelector('#USE_AMAZON').checked = settings.AMAZON.USE_AMAZON;
document.body.querySelector('#AMAZON_ACCESS_KEY').value = settings.AMAZON.ACCESS_KEY;
document.body.querySelector('#AMAZON_ACCESS_SECRET').value = settings.AMAZON.ACCESS_SECRET;
// Google
document.body.querySelector('#USE_GOOGLE').checked = settings.GOOGLE.USE_GOOGLE;
document.body.querySelector('#GOOGLE_API_KEY').value = settings.GOOGLE.API_KEY;
}
document.body.querySelector('#primaryAmazonVoice').addEventListener('change', () => {
const select = document.querySelector('#primaryAmazonVoice');
settings.AMAZON.PRIMARY_VOICE = select.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Amazon primary voice!', 'success');
});
document.body.querySelector('#secondaryAmazonVoice').addEventListener('change', () => {
const select = document.querySelector('#secondaryAmazonVoice');
settings.AMAZON.SECONDARY_VOICE = select.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Amazon secondary voice!', 'success');
});
document.body.querySelector('#primaryGoogleVoice').addEventListener('change', () => {
const select = document.querySelector('#primaryGoogleVoice');
settings.GOOGLE.PRIMARY_VOICE = select.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Google primary voice!', 'success');
});
document.body.querySelector('#secondaryGoogleVoice').addEventListener('change', () => {
const select = document.querySelector('#secondaryGoogleVoice');
settings.GOOGLE.SECONDARY_VOICE = select.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Google secondary voice!', 'success');
});
document.body.querySelector('#primaryVoice').addEventListener('change', () => {
const select = document.querySelector('#primaryVoice');
settings.TTS.PRIMARY_VOICE = select.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved primary voice!', 'success');
});
document.body.querySelector('#microphone').addEventListener('change', () => {
const select = document.querySelector('#microphone');
settings.STT.MICROPHONE = select.value;
settings.STT.MICROPHONE_ID = select.options[select.selectedIndex].text;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved microphone!', 'success');
startVoiceRecognition();
});
document.body.querySelector('#sttModel').addEventListener('change', () => {
const select = document.querySelector('#sttModel');
settings.STT.LANGUAGE = select.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved voice detection language!', 'success');
});
document.body.querySelector('#defaultLanguage').addEventListener('change', () => {
const select = document.querySelector('#defaultLanguage');
settings.TTS.PRIMARY_TTS_LANGUAGE_INDEX = select.selectedIndex;
settings.TTS.PRIMARY_TTS_LANGUAGE = select.options[select.selectedIndex].value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved default language!', 'success');
});
document.body.querySelector('#secondaryVoice').addEventListener('change', () => {
const select = document.querySelector('#secondaryVoice');
settings.TTS.SECONDARY_VOICE = select.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved secondary voice!', 'success');
});
document.body.querySelector('#secondaryLanguage').addEventListener('change', () => {
const select = document.querySelector('#secondaryLanguage');
settings.TTS.SECONDARY_TTS_LANGUAGE_INDEX = select.selectedIndex;
settings.TTS.SECONDARY_TTS_LANGUAGE = select.options[select.selectedIndex].value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved secondary language!', 'success');
});
document.body.querySelector('#language').addEventListener('change', () => {
const select = document.querySelector('#language');
settings.GENERAL.LANGUAGE_INDEX = select.selectedIndex;
settings.GENERAL.LANGUAGE = select.options[select.selectedIndex].value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved language!', 'success');
});
function setTranslateToOptions() {
const options = document.querySelectorAll('.TRANSLATE_TO');
const index = parseInt(settings.LANGUAGE.TRANSLATE_TO_INDEX);
if (index === 0) {
settings.LANGUAGE.BROADCAST_TRANSLATION = false;
settings.LANGUAGE.OUTPUT_TO_TTS = false;
options.forEach(item => {
item.style.visibility = 'hidden';
item.style.height = '0px';
item.checked = false;
});
} else {
options.forEach(item => {
item.style.visibility = '';
item.style.height = '';
});
}
}
setTranslateToOptions();
document.body.querySelector('#TRANSLATE_TO').addEventListener('change', () => {
const select = document.querySelector('#TRANSLATE_TO');
settings.LANGUAGE.TRANSLATE_TO_INDEX = select.selectedIndex;
settings.LANGUAGE.TRANSLATE_TO = select.options[select.selectedIndex].value;
setTranslateToOptions();
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved primary voice!', 'success');
});
document.body.querySelector('#ttsAudioDevice').addEventListener('change', () => {
settings.AUDIO.TTS_AUDIO_DEVICE = ttsAudioDevices.value;
settings.AUDIO.SELECTED_TTS_AUDIO_DEVICE = ttsAudioDevices.selectedIndex;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved audio device!', 'success');
});
document.body.querySelector('#notificationSoundAudioDevice').addEventListener('change', () => {
settings.AUDIO.SELECTED_NOTIFICATION_AUDIO_DEVICE = notificationSoundAudioDevices.value;
settings.AUDIO.NOTIFICATION_AUDIO_DEVICE = notificationSoundAudioDevices.selectedIndex;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved audio device!', 'success');
});
document.body.querySelector('#TWITCH_CHANNEL_NAME').addEventListener('change', () => {
settings.TWITCH.CHANNEL_NAME = document.body.querySelector('#TWITCH_CHANNEL_NAME').value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Channel name, please restart the application to reset twitch service', 'warning');
twitch.getTwitchChannelId();
});
document.body.querySelector('#TWITCH_OAUTH_TOKEN').addEventListener('change', () => {
settings.TWITCH.OAUTH_TOKEN = document.body.querySelector('#TWITCH_OAUTH_TOKEN').value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved OAuth token, please restart the application to reset twitch service', 'warning');
});
setInputFilter(
document.body.querySelector('#PORT'),
function (value) {
return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp.
},
"Only digits and '.' are allowed"
);
document.body.querySelector('#PORT').addEventListener('change', () => {
settings.GENERAL.PORT = document.body.querySelector('#PORT').value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved port, please restart the application to reset the port', 'warning');
});
document.body.querySelector('#AMAZON_ACCESS_KEY').addEventListener('change', () => {
settings.AMAZON.ACCESS_KEY = document.body.querySelector('#AMAZON_ACCESS_KEY').value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Amazon access key!', 'success');
});
document.body.querySelector('#AMAZON_ACCESS_SECRET').addEventListener('change', () => {
settings.AMAZON.ACCESS_SECRET = document.body.querySelector('#AMAZON_ACCESS_SECRET').value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Amazon access secret!', 'success');
});
document.body.querySelector('#GOOGLE_API_KEY').addEventListener('change', () => {
settings.GOOGLE.API_KEY = document.body.querySelector('#GOOGLE_API_KEY').value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved Google api key!', 'success');
});
document.body.querySelector('#notification').addEventListener('change', () => {
settings.AUDIO.NOTIFICATION_SOUND = notificationSound.selectedIndex;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification('Saved notification sound!', 'success');
});
function showMenuButton(menuButton, toggle) {
const option = document.body.querySelector(menuButton);
if (!toggle) {
option.style.display = 'none';
} else {
option.style.display = '';
}
}
const notificationToasts = document.querySelector('#toasts'); // toast messages
function createNotification(message = null, type = null) {
const notification = document.createElement('div');
notification.classList.add('toast');
notification.classList.add(type);
notification.innerText = message;
notificationToasts.appendChild(notification);
let alertSound = 'info.mp3';
if (type === 'error') {
alertSound = 'error.mp3';
}
if (settings.AUDIO.USE_NOTIFICATION_SOUNDS) {
const notfication = new Audio(
path.join(resourcesPath, main.isPackaged ? `./sounds/notifications/${alertSound}` : `../sounds/notifications/${alertSound}`)
);
notfication.volume = settings.AUDIO.NOTIFICATION_VOLUME / 100;
notfication.play();
}
setTimeout(() => notification.remove(), 3000);
}
// Check for configs
if (!settings.TWITCH.USE_TWITCH) {
const text = 'Please setup a service to connect to in Configuration > Show Advanced';
createNotification(text, 'warning');
}
if (settings.TWITCH.USE_TWITCH && !settings.TWITCH.CHANNEL_NAME) {
const text = 'No channel name inserted in the Twitch service';
createNotification(text, 'warning');
}
if (settings.TWITCH.USE_TWITCH && !settings.TWITCH.USERNAME) {
const text = 'No username inserted in the Twitch service';
createNotification(text, 'warning');
}
function toggleRadio(toggle, inputs) {
const element = inputs;
if (toggle === true) {
for (let i = 0; i < inputs.length; i += 1) {
element[i].style.display = '';
}
} else {
for (let i = 0; i < inputs.length; i += 1) {
element[i].style.display = 'none';
}
}
}
document.body.querySelector('#OPEN_SETTINGS_FILE').addEventListener('click', () => {
shell.openExternal(settingsPath);
});
document.body.querySelector('#Info_VOICE_MODELS_FOLDER').addEventListener('click', () => {
shell.openExternal(sttModels);
});
// #region Use Custom theme toggle logic
document.body.querySelector('#USE_CUSTOM_THEME').addEventListener('click', () => {
const toggle = document.getElementById('USE_CUSTOM_THEME').checked;
const inputs = document.getElementsByClassName('inputTheme');
toggleRadio(toggle, inputs);
settings.THEME.USE_CUSTOM_THEME = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
theme.setTheme();
createNotification(`${toggle ? 'Enabled' : 'Disabled'} custom theme!`, 'success');
});
// #region Top bar buttons
document.body.querySelector('#min-button').addEventListener('click', () => {
ipcRenderer.send('minimize-window');
});
// #region Top bar buttons
document.body.querySelector('#Info_USERNAME').addEventListener('click', async () => {
const element = document.body.querySelector('#TWITCH_OAUTH_TOKEN');
element.value = await auth.getTwitchOauthToken();
twitch.checkIfTokenIsValid();
createNotification('Saved OAuth token!', 'success');
});
document.body.querySelector('#GetBetterTtvEmotes').addEventListener('click', async () => {
twitch.getBetterTtvGLobalEmotes();
createNotification('Saved BetterTTV emotes!', 'success');
});
const hideInputToggleButton = document.body.querySelectorAll('.password-toggle-btn .password-toggle-icon .fa-eye-slash');
hideInputToggleButton.forEach(item => {
item.addEventListener('click', () => {
if (item.classList.contains('fa-eye')) {
item.classList.remove('fa-eye');
item.classList.add('fa-eye-slash');
} else {
item.classList.remove('fa-eye-slash');
item.classList.add('fa-eye');
}
});
});
function hideOrShowViewerPanel() {
const menu = document.body.querySelector('.sidepanel-right');
const leftCircle = document.body.querySelector('.circle-right');
if (!settings.GENERAL.VIEWERS_PANEL) {
menu.classList.add('collapse-menu-right');
leftCircle.classList.add('collapse-circle-right');
} else {
menu.classList.remove('collapse-menu-right');
leftCircle.classList.remove('collapse-circle-right');
}
fs.writeFileSync(settingsPath, ini.stringify(settings));
}
hideOrShowViewerPanel();
document.body.querySelector('#VIEWERS_PANEL').addEventListener('click', () => {
if (settings.GENERAL.VIEWERS_PANEL) {
settings.GENERAL.VIEWERS_PANEL = false;
} else {
settings.GENERAL.VIEWERS_PANEL = true;
}
hideOrShowViewerPanel();
});
document.body.querySelector('#Info_VTUBER').addEventListener('click', () => {
shell.openExternal(`http://localhost:${settings.GENERAL.PORT}/vtuber/`);
});
document.body.querySelector('#Info_CHATBUBBLE').addEventListener('click', () => {
shell.openExternal(`http://localhost:${settings.GENERAL.PORT}/chat/`);
});
document.body.querySelector('#max-button').addEventListener('click', () => {
ipcRenderer.send('maximize-window');
});
document.body.querySelector('#close-button').addEventListener('click', () => {
ipcRenderer.send('close-window');
});
// #endregion
// #region Notification sound test
document.body.querySelector('#SoundTestButton').addEventListener('click', () => {
sound.playNotificationSound();
});
document.body.querySelector('#TestTwitchCredentials').addEventListener('click', () => {
twitch.ping('#TestTwitchCredentials');
// resetTwitch(;
});
function toggleTwitch() {
const toggle = settings.TWITCH.USE_TWITCH;
const inputs = document.getElementsByClassName('inputTwitch');
toggleRadio(toggle, inputs);
}
toggleTwitch();
document.body.querySelector('#USE_TWITCH').addEventListener('click', () => {
const toggle = document.getElementById('USE_TWITCH').checked;
settings.TWITCH.USE_TWITCH = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('inputTwitch');
toggleRadio(toggle, inputs);
twitch = settings.TWITCH.USE_TWITCH ? require(path.join(__dirname, './twitch')) : null;
createNotification(`${toggle ? 'Enabled' : 'Disabled'} Twitch settings!`, 'success');
});
function toggleGoogle() {
const toggle = settings.GOOGLE.USE_GOOGLE;
const inputs = document.getElementsByClassName('inputGoogle');
toggleRadio(toggle, inputs);
}
toggleGoogle();
document.body.querySelector('#USE_GOOGLE').addEventListener('click', () => {
const toggle = document.getElementById('USE_GOOGLE').checked;
settings.GOOGLE.USE_GOOGLE = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('inputGoogle');
toggleRadio(toggle, inputs);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} Google settings!`, 'success');
});
function toggleAmazon() {
const toggle = settings.AMAZON.USE_AMAZON;
const inputs = document.getElementsByClassName('inputAmazon');
toggleRadio(toggle, inputs);
}
toggleAmazon();
document.body.querySelector('#USE_AMAZON').addEventListener('click', () => {
const toggle = document.getElementById('USE_AMAZON').checked;
settings.AMAZON.USE_AMAZON = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('inputAmazon');
toggleRadio(toggle, inputs);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} Amazon settings!`, 'success');
});
function toggleServer() {
const toggle = settings.MODULES.USE_MODULES;
const inputs = document.getElementsByClassName('inputServer');
toggleRadio(toggle, inputs);
}
toggleServer();
document.body.querySelector('#USE_MODULES').addEventListener('click', () => {
const toggle = document.getElementById('USE_MODULES').checked;
settings.MODULES.USE_MODULES = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('inputServer');
toggleRadio(toggle, inputs);
createNotification(
`${toggle ? 'Enabled' : 'Disabled'} server settings!, the service will stop working after restarting the application
${toggle ? '' : ', the service will stop working after restarting the application'}`,
'success'
);
});
document.body.querySelector('#USE_VTUBER').addEventListener('change', () => {
const toggle = document.getElementById('USE_VTUBER').checked;
settings.MODULES.USE_VTUBER = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
showMenuButton('#btnBrowsersourceVtuber', toggle);
createNotification(
`${toggle ? 'Enabled' : 'Disabled'} Vtuber setting!
${toggle ? '' : ', the service will stop working after restarting the application'}`,
'success'
);
server.startVtuberModule();
});
document.body.querySelector('#USE_CHATBUBBLE').addEventListener('change', () => {
const toggle = document.getElementById('USE_CHATBUBBLE').checked;
settings.MODULES.USE_CHATBUBBLE = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
showMenuButton('#btnBrowsersourceChat', toggle);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} chatbubble setting!`, 'success');
server.startChatBubbleModule();
});
function toggleTTS() {
const toggle = settings.TTS.USE_TTS;
const inputs = document.getElementsByClassName('inputTTS');
toggleRadio(toggle, inputs);
}
toggleTTS();
document.body.querySelector('#USE_TTS').addEventListener('change', () => {
const toggle = document.getElementById('USE_TTS').checked;
settings.TTS.USE_TTS = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('inputTTS');
toggleRadio(toggle, inputs);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} text to speech!`, 'success');
});
function toggleSTT() {
const toggle = settings.STT.USE_STT;
const inputs = document.getElementsByClassName('inputSTT');
toggleRadio(toggle, inputs);
}
toggleSTT();
document.body.querySelector('#USE_STT').addEventListener('change', () => {
const toggle = document.getElementById('USE_STT').checked;
settings.STT.USE_STT = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('inputSTT');
toggleRadio(toggle, inputs);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} speech to text!`, 'success');
});
function toggleSendTranslation() {
const toggle = settings.LANGUAGE.SEND_TRANSLATION;
const inputs = document.getElementsByClassName('send-translation');
toggleRadio(toggle, inputs);
}
toggleSendTranslation();
document.body.querySelector('#SEND_TRANSLATION').addEventListener('change', () => {
const toggle = document.getElementById('SEND_TRANSLATION').checked;
settings.LANGUAGE.SEND_TRANSLATION = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('send-translation');
toggleRadio(toggle, inputs);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} Sending translations!`, 'success');
});
document.body.querySelector('#OUTPUT_TO_TTS').addEventListener('change', () => {
let toggle = document.getElementById('OUTPUT_TO_TTS').checked;
if (!settings.TTS.USE_TTS) {
toggle = false;
createNotification('Enable TTS first', 'error');
return;
}
settings.LANGUAGE.OUTPUT_TO_TTS = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification(`${toggle ? 'Enabled' : 'Disabled'} Outputting translations to TTS!`, 'success');
});
document.body.querySelector('#BROADCAST_TRANSLATION').addEventListener('change', () => {
const toggle = document.getElementById('BROADCAST_TRANSLATION').checked;
settings.LANGUAGE.BROADCAST_TRANSLATION = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
createNotification(`${toggle ? 'Enabled' : 'Disabled'} Language detection!`, 'success');
});
function toggleLanguageDetection() {
const toggle = settings.LANGUAGE.USE_DETECTION;
const inputs = document.getElementsByClassName('languageDetectionInput');
toggleRadio(toggle, inputs);
}
toggleLanguageDetection();
document.body.querySelector('#USE_DETECTION').addEventListener('change', () => {
const toggle = document.getElementById('USE_DETECTION').checked;
settings.LANGUAGE.USE_DETECTION = toggle;
if (!toggle) {
settings.LANGUAGE.BROADCAST_TRANSLATION = false;
document.body.querySelector('#BROADCAST_TRANSLATION').checked = false;
settings.LANGUAGE.OUTPUT_TO_TTS = false;
document.body.querySelector('#OUTPUT_TO_TTS').checked = false;
}
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('languageDetectionInput');
toggleRadio(toggle, inputs);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} Language detection!`, 'success');
});
function toggleNotificationSounds() {
const toggle = settings.AUDIO.USE_NOTIFICATION_SOUNDS;
const inputs = document.getElementsByClassName('inputNotificationSound');
toggleRadio(toggle, inputs);
}
toggleNotificationSounds();
document.body.querySelector('#USE_NOTIFICATION_SOUNDS').addEventListener('change', () => {
const toggle = document.getElementById('USE_NOTIFICATION_SOUNDS').checked;
settings.AUDIO.USE_NOTIFICATION_SOUNDS = toggle;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const inputs = document.getElementsByClassName('inputNotificationSound');
toggleRadio(toggle, inputs);
createNotification(`${toggle ? 'Enabled' : 'Disabled'} notification sounds!`, 'success');
});
document.body.querySelector('#notificationVolume').addEventListener('change', () => {
const element = document.body.querySelector('#notificationVolume');
settings.AUDIO.NOTIFICATION_VOLUME = element.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const slider = document.querySelector('#notificationVolumeSlider');
slider.value = settings.AUDIO.NOTIFICATION_VOLUME;
slider.style.setProperty('--tiempotemporal', settings.AUDIO.NOTIFICATION_VOLUME);
createNotification('Saved notification volume!', 'success');
});
document.body.querySelector('#notificationVolumeSlider').addEventListener('change', () => {
const e = document.querySelector('#notificationVolumeSlider');
e.style.setProperty('--tiempotemporal', e.value);
e.style.setProperty('--min', e.min === '' ? '0' : e.min);
e.style.setProperty('--max', e.max === '' ? '100' : e.max);
document.querySelector('#notificationVolume').value = e.value;
e.addEventListener('input', () => {
e.style.setProperty('--tiempotemporal', e.value);
document.querySelector('#notificationVolume').value = e.value;
settings.AUDIO.NOTIFICATION_VOLUME = e.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
});
});
document.body.querySelector('#notificationVolumeSlider').addEventListener('mouseup', () => {
createNotification('Saved notification volume!', 'success');
});
if (settings.AUDIO.NOTIFICATION_VOLUME) {
document.querySelector('#notificationVolumeSlider').value = settings.AUDIO.NOTIFICATION_VOLUME;
document.querySelector('#notificationVolumeSlider').dispatchEvent(new Event('change'));
} else {
document.querySelector('#notificationVolumeSlider').dispatchEvent(new Event('change', { value: 50 }));
}
document.body.querySelector('#ttsVolume').addEventListener('change', () => {
const element = document.body.querySelector('#ttsVolume');
settings.AUDIO.TTS_VOLUME = element.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const slider = document.querySelector('#ttsVolumeSlider');
slider.value = settings.AUDIO.TTS_VOLUME;
slider.style.setProperty('--tiempotemporal', settings.AUDIO.TTS_VOLUME);
createNotification('Saved TTS volume!', 'success');
});
document.body.querySelector('#ttsVolumeSlider').addEventListener('change', () => {
const e = document.querySelector('#ttsVolumeSlider');
e.style.setProperty('--tiempotemporal', e.value);
e.style.setProperty('--min', e.min === '' ? '0' : e.min);
e.style.setProperty('--max', e.max === '' ? '100' : e.max);
document.querySelector('#ttsVolume').value = e.value;
e.addEventListener('input', () => {
e.style.setProperty('--tiempotemporal', e.value);
document.querySelector('#ttsVolume').value = e.value;
settings.AUDIO.TTS_VOLUME = e.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
});
});
document.body.querySelector('#ttsVolumeSlider').addEventListener('mouseup', () => {
createNotification('Saved TTS volume!', 'success');
});
if (settings.AUDIO.TTS_VOLUME) {
document.querySelector('#ttsVolumeSlider').value = settings.AUDIO.TTS_VOLUME;
document.querySelector('#ttsVolumeSlider').dispatchEvent(new Event('change'));
} else {
document.querySelector('#ttsVolumeSlider').dispatchEvent(new Event('change', { value: 50 }));
}
document.body.querySelector('#ttsVolume').addEventListener('change', () => {
const element = document.body.querySelector('#ttsVolume');
settings.AUDIO.TTS_VOLUME = element.value;
fs.writeFileSync(settingsPath, ini.stringify(settings));
const slider = document.querySelector('#ttsVolumeSlider');
slider.value = settings.AUDIO.TTS_VOLUME;
slider.style.setProperty('--tiempotemporal', settings.AUDIO.TTS_VOLUME);
});
document.body.querySelector('#TestDefaultTTSButton').addEventListener('click', async () => {
if (!settings.TTS.PRIMARY_VOICE) {
return;
}
const text = document.getElementById('testPrimaryTTS').value;
const requestData = {
message: `user: ${text}`,
voice: settings.TTS.PRIMARY_VOICE
};
const count = await backend.getInternalTTSAudio(requestData);
const textObject = { filtered: text, formatted: text };
sound.playAudio({ service: 'Internal', message: textObject, count });
});
document.body.querySelector('#TestSecondaryTTSButton').addEventListener('click', async () => {
if (!settings.TTS.SECONDARY_VOICE) {
return;
}
const text = document.getElementById('testSecondaryTTS').value;
const requestData = {
message: `user: ${text}`,
voice: settings.TTS.SECONDARY_VOICE
};
const count = await backend.getInternalTTSAudio(requestData);
const textObject = { filtered: text, formatted: text };
sound.playAudio({ service: 'Internal', message: textObject, count });
});
// Restricts input for the given textbox to the given inputFilter function.
function setInputFilter(textbox, inputFilter, errMsg) {
['input', 'keydown', 'keyup', 'mousedown', 'mouseup', 'select', 'contextmenu', 'drop', 'focusout'].forEach(function (event) {
textbox.addEventListener(event, function (e) {
if (inputFilter(this.value)) {
// Accepted value.
if (['keydown', 'mousedown', 'focusout'].indexOf(e.type) >= 0) {
this.classList.remove('input-error');
this.setCustomValidity('');
}
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
} else if (Object.prototype.hasOwnProperty.call(this, 'oldValue')) {
// Rejected value: restore the previous one.
this.classList.add('input-error');
this.setCustomValidity(errMsg);
this.reportValidity();
this.value = this.oldValue;
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
} else {
// Rejected value: nothing to restore.
this.value = '';
}
});
});
}
webFrame.setVisualZoomLevelLimits(1, 5);
document.body.addEventListener('wheel', e => {
if (e.ctrlKey) {
const currentZoom = webFrame.getZoomFactor();
const zoomIn = Boolean(e.deltaY < 0);
setZoomLevel(currentZoom, zoomIn);
}
});
setInputFilter(
document.body.querySelector('#ZOOMLEVEL'),
function (value) {
return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp.
},
"Only digits and '.' are allowed"
);
document.body.querySelector('#ZOOMLEVEL').addEventListener('change', () => {
const newZoom = parseInt(document.body.querySelector('#ZOOMLEVEL').value) / 100;
settings.GENERAL.ZOOMLEVEL = newZoom;
fs.writeFileSync(settingsPath, ini.stringify(settings));
setZoomLevel(newZoom, null);
createNotification('Saved zoom new level', 'warning');
});
document.body.querySelector('emoji-picker').addEventListener('emoji-click', e => {
// console.log(e.detail);
const div = document.getElementById('textInput');
if (e.detail.unicode === undefined) {
div.value += e.detail.name + ' ';
} else {
div.value += e.detail.unicode + ' ';
}
div.focus();
});
module.exports = {
getGeneralSettings,
createNotification
};