diff --git a/html/src/app.js b/html/src/app.js index dcacfc37..8c4b51c8 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -3875,7 +3875,7 @@ speechSynthesis.getVoices(); } return 0; }); - notyFeed.splice(5); + notyFeed.splice(1); sharedRepository.setArray('wristFeed', wristFeed); sharedRepository.setArray('notyFeed', notyFeed); if (this.userDialog.visible) { @@ -3979,7 +3979,7 @@ speechSynthesis.getVoices(); }); ++w; } - if ((n < 5) && (notyFilter[ctx.type]) && + if ((n < 1) && (notyFilter[ctx.type]) && ((notyFilter[ctx.type] === 'On') || (notyFilter[ctx.type] === 'Everyone') || ((notyFilter[ctx.type] === 'Friends') && (isFriend)) || @@ -4074,7 +4074,7 @@ speechSynthesis.getVoices(); }); ++w; } - if ((n < 5) && (notyFilter[ctx.type]) && + if ((n < 1) && (notyFilter[ctx.type]) && ((notyFilter[ctx.type] === 'Friends') || ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) { notyArr.push({ @@ -4131,7 +4131,7 @@ speechSynthesis.getVoices(); }); ++w; } - if ((n < 5) && (notyFilter[ctx.type]) && + if ((n < 1) && (notyFilter[ctx.type]) && ((notyFilter[ctx.type] === 'On') || (notyFilter[ctx.type] === 'Friends') || ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) { @@ -4189,7 +4189,7 @@ speechSynthesis.getVoices(); }); ++w; } - if ((n < 5) && (notyFilter[ctx.type]) && + if ((n < 1) && (notyFilter[ctx.type]) && ((notyFilter[ctx.type] === 'On') || (notyFilter[ctx.type] === 'Friends') || ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) { @@ -4206,65 +4206,33 @@ speechSynthesis.getVoices(); this.sharedFeed.pendingUpdate = true; }; - $app.methods.updateSharedFeedPlayerModerationTable = function (forceUpdate) { - // showAvatar, hideAvatar, block, mute, unmute - var { data } = this.playerModerationTable; - var i = data.length; - if (i > 0) { - if ((data[i - 1].created === this.sharedFeed.playerModerationTable.lastEntryDate) && - (forceUpdate === false)) { - return; - } - this.sharedFeed.playerModerationTable.lastEntryDate = data[i - 1].created; - } else { - return; - } - var bias = new Date(Date.now() - 86400000).toJSON(); //24 hours - var wristArr = []; - var notyArr = []; - var w = 0; - var n = 0; - var wristFilter = this.sharedFeedFilters.wrist; - var notyFilter = this.sharedFeedFilters.noty; - for (var i = data.length - 1; i > -1; i--) { - var ctx = data[i]; - if (ctx.created < bias) { - break; - } - if (ctx.sourceUserId === API.currentUser.id) { - continue; - } - var isFriend = this.friends.has(ctx.sourceUserId); - var isFavorite = API.cachedFavoritesByObjectId.has(ctx.sourceUserId); - if ((w < 20) && (wristFilter[ctx.type]) && - (wristFilter[ctx.type] === 'On')) { - wristArr.push({ - ...ctx, - created_at: ctx.created, - isFriend, - isFavorite - }); - ++w; - } - if ((n < 5) && (notyFilter[ctx.type]) && - (notyFilter[ctx.type] === 'On')) { - notyArr.push({ - ...ctx, - created_at: ctx.created, - isFriend, - isFavorite - }); - ++n; - } - } - this.sharedFeed.playerModerationTable.wrist = wristArr; - this.sharedFeed.playerModerationTable.noty = notyArr; - this.sharedFeed.pendingUpdate = true; - }; - $app.data.notyMap = []; - $app.methods.playNoty = async function (notyFeed) { + $app.methods.playNoty = function (notyFeed) { + var playNotificationTTS = false; + if ((this.notificationTTS === 'Always') || + ((this.notificationTTS === 'Outside VR') && ((this.isGameNoVR) || (!this.isGameRunning))) || + ((this.notificationTTS === 'Inside VR') && (!this.isGameNoVR) && (this.isGameRunning)) || + ((this.notificationTTS === 'Game Closed') && (!this.isGameRunning)) || + ((this.notificationTTS === 'Desktop Mode') && (this.isGameNoVR) && (this.isGameRunning))) { + playNotificationTTS = true; + } + var playDesktopToast = false; + if ((this.desktopToast === 'Always') || + ((this.desktopToast === 'Outside VR') && ((this.isGameNoVR) || (!this.isGameRunning))) || + ((this.desktopToast === 'Inside VR') && (!this.isGameNoVR) && (this.isGameRunning)) || + ((this.desktopToast === 'Game Closed') && (!this.isGameRunning)) || + ((this.desktopToast === 'Desktop Mode') && (this.isGameNoVR) && (this.isGameRunning))) { + playDesktopToast = true; + } + var playXSNotification = false; + if ((this.xsNotifications) && (this.isGameRunning) && (!this.isGameNoVR)) { + playXSNotification = true; + } + if ((this.currentUserStatus === 'busy') || + (!this.notyInit)) { + return; + } var notyToPlay = []; notyFeed.forEach((feed) => { var displayName = ''; @@ -4285,10 +4253,6 @@ speechSynthesis.getVoices(); notyToPlay.push(feed); } }); - // disable notifications when busy - if ((this.currentUserStatus === 'busy') || (!this.notyInit)) { - return; - } var bias = new Date(Date.now() - 60000).toJSON(); var noty = {}; var messageList = ['inviteMessage', 'requestMessage', 'responseMessage']; @@ -4306,48 +4270,18 @@ speechSynthesis.getVoices(); if (message) { message = `, ${message}`; } - if ((this.notificationTTS) && (this.isGameRunning)) { + if (playNotificationTTS) { this.playNotyTTS(noty, message); } - var imageURL = await this.notyGetImage(noty); - var image = false; - if ((imageURL) && - (((this.desktopToast === 'Always') || - ((this.desktopToast === 'Game Closed') && (!this.isGameRunning)) || - ((this.desktopToast === 'Desktop Mode') && (this.isGameNoVR) && (this.isGameRunning))) || - ((this.xsNotifications) && (this.isGameRunning) && (!this.isGameNoVR)))) { - try { - await fetch(imageURL, { - method: 'GET', - redirect: 'follow', - headers: { - 'User-Agent': appVersion - } - }).then(response => { - return response.arrayBuffer(); - }).then(buffer => { - var binary = ''; - var bytes = new Uint8Array(buffer); - var length = bytes.byteLength; - for (var i = 0; i < length; i++) { - binary += String.fromCharCode(bytes[i]); - } - var imageData = btoa(binary); - AppApi.CacheImage(imageData); - }); - image = true; - } catch (err) { - console.error(err); - image = false; - } - } - if ((this.xsNotifications) && (this.isGameRunning) && (!this.isGameNoVR)) { - this.displayXSNotification(noty, message, image); - } - if ((this.desktopToast === 'Always') || - ((this.desktopToast === 'Game Closed') && (!this.isGameRunning)) || - ((this.desktopToast === 'Desktop Mode') && (this.isGameNoVR) && (this.isGameRunning))) { - this.displayDesktopToast(noty, message, image); + if ((playDesktopToast) || (playXSNotification)) { + this.notyGetImage(noty).then((image) => { + if (playXSNotification) { + this.displayXSNotification(noty, message, image); + } + if (playDesktopToast) { + this.displayDesktopToast(noty, message, image); + } + }); } } }; @@ -4375,7 +4309,8 @@ speechSynthesis.getVoices(); imageURL = await API.getCachedUser({ userId: userId }).catch((err) => { - throw err; + console.error(err); + return false; }).then((args) => { if ((this.displayVRCPlusIconsAsAvatar) && (args.json.userIcon)) { return args.json.userIcon; @@ -4383,7 +4318,33 @@ speechSynthesis.getVoices(); return args.json.currentAvatarThumbnailImageUrl; }); } - return imageURL; + if (!imageURL) { + return false; + } + try { + await fetch(imageURL, { + method: 'GET', + redirect: 'follow', + headers: { + 'User-Agent': appVersion + } + }).then(response => { + return response.arrayBuffer(); + }).then(buffer => { + var binary = ''; + var bytes = new Uint8Array(buffer); + var length = bytes.byteLength; + for (var i = 0; i < length; i++) { + binary += String.fromCharCode(bytes[i]); + } + var imageData = btoa(binary); + AppApi.CacheImage(imageData); + }); + return true; + } catch (err) { + console.error(err); + return false; + } }; $app.methods.playNotyTTS = async function (noty, message) { @@ -6898,7 +6859,7 @@ speechSynthesis.getVoices(); $app.data.desktopToast = configRepository.getString('VRCX_desktopToast'); $app.data.minimalFeed = configRepository.getBool('VRCX_minimalFeed'); $app.data.displayVRCPlusIconsAsAvatar = configRepository.getBool('displayVRCPlusIconsAsAvatar'); - $app.data.notificationTTS = configRepository.getBool('VRCX_notificationTTS'); + $app.data.notificationTTS = configRepository.getString('VRCX_notificationTTS'); $app.data.notificationTTSVoice = configRepository.getString('VRCX_notificationTTSVoice'); $app.data.notificationTimeout = configRepository.getString('VRCX_notificationTimeout'); var saveOpenVROption = function () { @@ -6918,11 +6879,11 @@ speechSynthesis.getVoices(); }; $app.data.TTSvoices = speechSynthesis.getVoices(); var saveNotificationTTS = function () { - configRepository.setBool('VRCX_notificationTTS', this.notificationTTS); speechSynthesis.cancel(); - if (this.notificationTTS) { + if ((configRepository.getString('VRCX_notificationTTS') === 'Never') && (this.notificationTTS !== 'Never')) { this.speak('Notification text-to-speech enabled'); } + configRepository.setString('VRCX_notificationTTS', this.notificationTTS); this.updateVRConfigVars(); }; $app.watch.openVR = saveOpenVROption; @@ -6982,6 +6943,10 @@ speechSynthesis.getVoices(); $app.data.desktopToast = 'Never'; configRepository.setString('VRCX_desktopToast', $app.data.desktopToast); } + if (!configRepository.getString('VRCX_notificationTTS')) { + $app.data.notificationTTS = 'Never'; + configRepository.setString('VRCX_notificationTTS', $app.data.notificationTTS); + } if (!configRepository.getString('sharedFeedFilters')) { var sharedFeedFilters = { noty: { @@ -7081,16 +7046,16 @@ speechSynthesis.getVoices(); labels: [{ name: 'Off' }, { name: 'On' }] } }; - $app.data.desktopToastToggleSwitchOption = { + $app.data.whenToPlayToggleSwitchOption = { layout: toggleSwitchLayout, size: { height: 1.5, - width: 22, + width: 33, padding: 0.1, fontSize: 0.75 }, items: { - labels: [{ name: 'Never' }, { name: 'Desktop Mode' }, { name: 'Game Closed' }, { name: 'Always' }] + labels: [{ name: 'Never' }, { name: 'Desktop Mode' }, { name: 'Outside VR' }, { name: 'Inside VR' }, { name: 'Game Closed' }, { name: 'Always' }] } }; diff --git a/html/src/index.pug b/html/src/index.pug index 230c0341..25fadd04 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -791,14 +791,15 @@ html div.options-container-item span.name Desktop Notifications, When to display: br - toggle-switch(:options="desktopToastToggleSwitchOption" group="desktopToastToggleSwitchOption" v-model="desktopToast" class="toggle-switch") + toggle-switch(:options="whenToPlayToggleSwitchOption" group="whenToPlayDesktopNotificationsToggleSwitchOption" v-model="desktopToast" class="toggle-switch") div.options-container-item el-button(size="small" icon="el-icon-chat-square" @click="showNotyFeedFiltersDialog()") Notification Filters br span.sub-header TTS Options div.options-container-item - span.name Notification TTS - el-switch(v-model="notificationTTS") + span.name Notification TTS, When to play: + br + toggle-switch(:options="whenToPlayToggleSwitchOption" group="whenToPlayNotificationTTSToggleSwitchOption" v-model="notificationTTS" class="toggle-switch") div.options-container-item span.name Text-to-Speech Voice el-dropdown(@command="(voice) => changeTTSVoice(voice)" trigger="click" size="small")