From babc6e21f7da4e59dda50c173f140dd5febaf364 Mon Sep 17 00:00:00 2001 From: Natsumi Date: Fri, 3 Sep 2021 16:51:16 +1200 Subject: [PATCH] Base64 notification images --- AppApi.cs | 25 ++++++----- html/src/app.js | 88 ++++++++++++++++++------------------- html/src/index.pug | 51 +++++++++++---------- html/src/service/gamelog.js | 4 ++ html/src/vr.js | 6 +-- 5 files changed, 90 insertions(+), 84 deletions(-) diff --git a/AppApi.cs b/AppApi.cs index e8aee4a3..f2f0b088 100644 --- a/AppApi.cs +++ b/AppApi.cs @@ -229,20 +229,15 @@ namespace VRCX return CpuMonitor.Instance.CpuUsage; } - public void CacheImage(string Base64File) - { - String Icon = Path.Combine(Program.AppDataDirectory, "cache\\toast"); - File.WriteAllBytes(Icon, Convert.FromBase64String(Base64File)); - } - - public void DesktopNotification(string BoldText, string Text, bool Image) + public void DesktopNotification(string BoldText, string Text, string Image) { XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastImageAndText02); XmlNodeList stringElements = toastXml.GetElementsByTagName("text"); String imagePath = Path.Combine(Program.BaseDirectory, "VRCX.ico"); - if (Image) + if (!String.IsNullOrEmpty(Image)) { imagePath = Path.Combine(Program.AppDataDirectory, "cache\\toast"); + File.WriteAllBytes(imagePath, Convert.FromBase64String(Image)); } stringElements[0].AppendChild(toastXml.CreateTextNode(BoldText)); stringElements[1].AppendChild(toastXml.CreateTextNode(Text)); @@ -268,14 +263,20 @@ namespace VRCX public string sourceApp { get; set; } } - public void XSNotification(string Title, string Content, int Timeout, bool Image) + public void XSNotification(string Title, string Content, int Timeout, string Image) { - bool UseBase64Icon = true; - String Icon = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHaGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA0LTA4VDE0OjU3OjAxKzEyOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNC0wOFQxNjozMzoxMCsxMjowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wNC0wOFQxNjozMzoxMCsxMjowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2YTY5MmQzYi03ZTJkLTNiNGUtYTMzZC1hN2MwOTNlOGU0OTkiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1NTE2MWIyMi1hYzgxLTY3NDYtODAyYi1kODIzYWFmN2RjYjciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZjJjNTA2ZS02YTVhLWRhNGEtOTg5Mi02NDZiMzQ0MGQxZTgiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NmJmOGE5MTgtY2QzZS03OTRjLTk3NzktMzM0YjYwZWJiNTYyPC9yZGY6bGk+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6N2YyYzUwNmUtNmE1YS1kYTRhLTk4OTItNjQ2YjM0NDBkMWU4IiBzdEV2dDp3aGVuPSIyMDIxLTA0LTA4VDE0OjU3OjAxKzEyOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJhM2ZjODI3LTM0ZjQtYjU0OC05ZGFiLTZhMTZlZmQzZjAxMSIgc3RFdnQ6d2hlbj0iMjAyMS0wNC0wOFQxNTowMTozMSsxMjowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2YTY5MmQzYi03ZTJkLTNiNGUtYTMzZC1hN2MwOTNlOGU0OTkiIHN0RXZ0OndoZW49IjIwMjEtMDQtMDhUMTY6MzM6MTArMTI6MDAiIHN0RXZ0OnNv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"; - if (Image) + bool UseBase64Icon; + string Icon; + if (!String.IsNullOrEmpty(Image)) { UseBase64Icon = false; + Icon = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHaGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA0LTA4VDE0OjU3OjAxKzEyOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNC0wOFQxNjozMzoxMCsxMjowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wNC0wOFQxNjozMzoxMCsxMjowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2YTY5MmQzYi03ZTJkLTNiNGUtYTMzZC1hN2MwOTNlOGU0OTkiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1NTE2MWIyMi1hYzgxLTY3NDYtODAyYi1kODIzYWFmN2RjYjciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZjJjNTA2ZS02YTVhLWRhNGEtOTg5Mi02NDZiMzQ0MGQxZTgiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NmJmOGE5MTgtY2QzZS03OTRjLTk3NzktMzM0YjYwZWJiNTYyPC9yZGY6bGk+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6N2YyYzUwNmUtNmE1YS1kYTRhLTk4OTItNjQ2YjM0NDBkMWU4IiBzdEV2dDp3aGVuPSIyMDIxLTA0LTA4VDE0OjU3OjAxKzEyOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJhM2ZjODI3LTM0ZjQtYjU0OC05ZGFiLTZhMTZlZmQzZjAxMSIgc3RFdnQ6d2hlbj0iMjAyMS0wNC0wOFQxNTowMTozMSsxMjowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2YTY5MmQzYi03ZTJkLTNiNGUtYTMzZC1hN2MwOTNlOGU0OTkiIHN0RXZ0OndoZW49IjIwMjEtMDQtMDhUMTY6MzM6MTArMTI6MDAiIHN0RXZ0OnNv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"; + } + else + { + UseBase64Icon = true; Icon = Path.Combine(Program.AppDataDirectory, "cache\\toast"); + File.WriteAllBytes(Icon, Convert.FromBase64String(Image)); } IPAddress broadcastIP = IPAddress.Parse("127.0.0.1"); diff --git a/html/src/app.js b/html/src/app.js index 696019a6..81d4ae85 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -4305,7 +4305,10 @@ speechSynthesis.getVoices(); return; } } - if (noty.type === 'Notification' || noty.type === 'LocationDestination') { + if ( + noty.type === 'Notification' || + noty.type === 'LocationDestination' + ) { return; } // remove current user @@ -4638,20 +4641,30 @@ speechSynthesis.getVoices(); if (playNotificationTTS) { this.playNotyTTS(noty, message); } - if (playOverlayNotification) { - this.notyGetImage(noty).then((imageUrl) => { - this.displayOverlayNotification(noty, message, imageUrl); - }); - } - if (playDesktopToast || playXSNotification) { - this.notySaveImage(noty).then((image) => { + if (playDesktopToast || playXSNotification || playOverlayNotification) { + if (this.imageNotifications) { + this.notySaveImage(noty).then((image) => { + if (playXSNotification) { + this.displayXSNotification(noty, message, image); + } + if (playDesktopToast) { + this.displayDesktopToast(noty, message, image); + } + if (playOverlayNotification) { + this.displayOverlayNotification(noty, message, image); + } + }); + } else { if (playXSNotification) { - this.displayXSNotification(noty, message, image); + this.displayXSNotification(noty, message, ''); } if (playDesktopToast) { - this.displayDesktopToast(noty, message, image); + this.displayDesktopToast(noty, message, ''); } - }); + if (playOverlayNotification) { + this.displayOverlayNotification(noty, message, ''); + } + } } }; @@ -4702,8 +4715,9 @@ speechSynthesis.getVoices(); $app.methods.notySaveImage = async function (noty) { var imageUrl = await this.notyGetImage(noty); + var base64Image = ''; try { - await fetch(imageUrl, { + base64Image = await fetch(imageUrl, { method: 'GET', redirect: 'follow', headers: { @@ -4718,24 +4732,18 @@ speechSynthesis.getVoices(); for (var i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); } - var imageData = btoa(binary); - AppApi.CacheImage(imageData); + return btoa(binary); }); - return true; } catch (err) { console.error(err); - return false; } + return base64Image; }; - $app.methods.displayOverlayNotification = function ( - noty, - message, - imageUrl - ) { + $app.methods.displayOverlayNotification = function (noty, message, image) { AppApi.ExecuteVrOverlayFunction( 'playNoty', - JSON.stringify({noty, message, imageUrl}) + JSON.stringify({noty, message, image}) ); }; @@ -6806,7 +6814,6 @@ speechSynthesis.getVoices(); this.getAuth(); $app.updateSharedFeed(true); - $app.notyInit = true; if ($app.isGameRunning) { $app.loadPlayerList(); @@ -7144,7 +7151,9 @@ speechSynthesis.getVoices(); { prop: 'type', value: true, - filterFn: (row) => row.type !== 'Notification' || row.type !== 'LocationDestination' + filterFn: (row) => + row.type !== 'Notification' && + row.type !== 'LocationDestination' } ], tableProps: { @@ -8602,6 +8611,9 @@ speechSynthesis.getVoices(); $app.data.xsNotifications = configRepository.getBool( 'VRCX_xsNotifications' ); + $app.data.imageNotifications = configRepository.getBool( + 'VRCX_imageNotifications' + ); $app.data.desktopToast = configRepository.getString('VRCX_desktopToast'); $app.data.minimalFeed = configRepository.getBool('VRCX_minimalFeed'); $app.data.displayVRCPlusIconsAsAvatar = configRepository.getBool( @@ -8640,7 +8652,7 @@ speechSynthesis.getVoices(); 'VRCX_autoUpdateVRCX' ); $app.data.branch = configRepository.getString('VRCX_branch'); - var saveOpenVROption = function () { + $app.methods.saveOpenVROption = function () { configRepository.setBool('openVR', this.openVR); configRepository.setBool('openVRAlways', this.openVRAlways); configRepository.setBool('VRCX_overlaybutton', this.overlaybutton); @@ -8658,6 +8670,10 @@ speechSynthesis.getVoices(); ); configRepository.setBool('VRCX_overlayWrist', this.overlayWrist); configRepository.setBool('VRCX_xsNotifications', this.xsNotifications); + configRepository.setBool( + 'VRCX_imageNotifications', + this.imageNotifications + ); configRepository.setString('VRCX_desktopToast', this.desktopToast); configRepository.setBool('VRCX_minimalFeed', this.minimalFeed); configRepository.setBool( @@ -8693,7 +8709,7 @@ speechSynthesis.getVoices(); this.updateVRConfigVars(); }; $app.data.TTSvoices = speechSynthesis.getVoices(); - var saveNotificationTTS = function () { + $app.methods.saveNotificationTTS = function () { speechSynthesis.cancel(); if ( configRepository.getString('VRCX_notificationTTS') === 'Never' && @@ -8707,25 +8723,6 @@ speechSynthesis.getVoices(); ); this.updateVRConfigVars(); }; - $app.watch.openVR = saveOpenVROption; - $app.watch.openVRAlways = saveOpenVROption; - $app.watch.overlaybutton = saveOpenVROption; - $app.watch.hidePrivateFromFeed = saveOpenVROption; - $app.watch.hideDevicesFromFeed = saveOpenVROption; - $app.watch.overlayNotifications = saveOpenVROption; - $app.watch.overlayWrist = saveOpenVROption; - $app.watch.xsNotifications = saveOpenVROption; - $app.watch.desktopToast = saveOpenVROption; - $app.watch.minimalFeed = saveOpenVROption; - $app.watch.displayVRCPlusIconsAsAvatar = saveOpenVROption; - $app.watch.hideTooltips = saveOpenVROption; - $app.watch.worldAutoCacheInvite = saveOpenVROption; - $app.watch.worldAutoCacheGPS = saveOpenVROption; - $app.watch.worldAutoCacheInviteFilter = saveOpenVROption; - $app.watch.worldAutoCacheGPSFilter = saveOpenVROption; - $app.watch.autoSweepVRChatCache = saveOpenVROption; - $app.watch.vrBackgroundEnabled = saveOpenVROption; - $app.watch.notificationTTS = saveNotificationTTS; $app.data.themeMode = configRepository.getString('VRCX_ThemeMode'); if (!$app.data.themeMode) { $app.data.themeMode = 'system'; @@ -9342,6 +9339,7 @@ speechSynthesis.getVoices(); 'VRCX_notificationTimeout', this.notificationTimeout ); + this.updateVRConfigVars(); } } }); diff --git a/html/src/index.pug b/html/src/index.pug index f37ff754..3f8553ee 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -719,10 +719,10 @@ html el-radio-button(label="dark") Dark div.options-container-item span.name VRCPlus Profile Icons - el-switch(v-model="displayVRCPlusIconsAsAvatar") + el-switch(v-model="displayVRCPlusIconsAsAvatar" @change="saveOpenVROption") div.options-container-item span.name Disable Tooltips - el-switch(v-model="hideTooltips") + el-switch(v-model="hideTooltips" @change="saveOpenVROption") div.options-container span.header Side Panel br @@ -805,61 +805,64 @@ html br div.options-container-item span.name Enable - el-switch(v-model="openVR") + el-switch(v-model="openVR" @change="saveOpenVROption") div.options-container-item span.name Force Run (Opens SteamVR) - el-switch(v-model="openVRAlways" :disabled="!openVR") + el-switch(v-model="openVRAlways" @change="saveOpenVROption" :disabled="!openVR") div.options-container-item span.name Hide Private Worlds - el-switch(v-model="hidePrivateFromFeed") + el-switch(v-model="hidePrivateFromFeed" @change="saveOpenVROption") br span.sub-header Wrist Feed div.options-container-item span.name Wrist Feed Overlay - el-switch(v-model="overlayWrist" :disabled="!openVR") + el-switch(v-model="overlayWrist" @change="saveOpenVROption" :disabled="!openVR") div.options-container-item span.name(style="min-width:137px") Overlay Button - el-switch(v-model="overlaybutton" inactive-text="Grip" active-text="Menu" :disabled="!openVR || !overlayWrist") + el-switch(v-model="overlaybutton" @change="saveOpenVROption" inactive-text="Grip" active-text="Menu" :disabled="!openVR || !overlayWrist") div.options-container-item span.name Background Color - el-switch(v-model="vrBackgroundEnabled" :disabled="!openVR || !overlayWrist") + el-switch(v-model="vrBackgroundEnabled" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist") div.options-container-item span.name Minimal Feed Icons - el-switch(v-model="minimalFeed" :disabled="!openVR || !overlayWrist") + el-switch(v-model="minimalFeed" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist") div.options-container-item span.name Hide VR Devices - el-switch(v-model="hideDevicesFromFeed" :disabled="!openVR || !overlayWrist") + el-switch(v-model="hideDevicesFromFeed" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist") div.options-container-item - el-button(size="small" icon="el-icon-notebook-2" @click="showWristFeedFiltersDialog()" :disabled="!openVR || !overlayWrist") Wrist Feed Filters + el-button(size="small" icon="el-icon-notebook-2" @click="showWristFeedFiltersDialog" :disabled="!openVR || !overlayWrist") Wrist Feed Filters br span.sub-header Notifications div.options-container-item span.name Overlay Notifications - el-switch(v-model="overlayNotifications" :disabled="!openVR") + el-switch(v-model="overlayNotifications" @change="saveOpenVROption" :disabled="!openVR") div.options-container-item - el-button(size="small" icon="el-icon-rank" @click="showNotificationPositionDialog()" :disabled="!overlayNotifications || !openVR") Notification Position + el-button(size="small" icon="el-icon-rank" @click="showNotificationPositionDialog" :disabled="!overlayNotifications || !openVR") Notification Position div.options-container-item span.name XSOverlay Notifications - el-switch(v-model="xsNotifications") + el-switch(v-model="xsNotifications" @change="saveOpenVROption") div.options-container-item - el-button(size="small" icon="el-icon-time" @click="promptNotificationTimeout()" :disabled="(!overlayNotifications || !openVR) && !xsNotifications") Notification Timeout + span.name User images (slower) + el-switch(v-model="imageNotifications" @change="saveOpenVROption") + div.options-container-item + el-button(size="small" icon="el-icon-time" @click="promptNotificationTimeout" :disabled="(!overlayNotifications || !openVR) && !xsNotifications") Notification Timeout div.options-container-item span.name Desktop Notifications, When to display: br - el-radio-group(v-model="desktopToast" size="mini") + el-radio-group(v-model="desktopToast" @change="saveOpenVROption" size="mini") el-radio-button(label="Never") el-radio-button(label="Inside VR") el-radio-button(label="Game Closed") el-radio-button(label="Game Running") el-radio-button(label="Always") div.options-container-item - el-button(size="small" icon="el-icon-chat-square" @click="showNotyFeedFiltersDialog()") Notification Filters + el-button(size="small" icon="el-icon-chat-square" @click="showNotyFeedFiltersDialog") Notification Filters br span.sub-header Text-To-Speech Options div.options-container-item span.name Notification TTS, When to play: br - el-radio-group(v-model="notificationTTS" size="mini") + el-radio-group(v-model="notificationTTS" @change="saveNotificationTTS" size="mini") el-radio-button(label="Never") el-radio-button(label="Inside VR") el-radio-button(label="Game Closed") @@ -880,31 +883,31 @@ html div.options-container-item span.name Download on invite: br - el-radio-group(v-model="worldAutoCacheInvite" size="mini") + el-radio-group(v-model="worldAutoCacheInvite" @change="saveOpenVROption" size="mini") el-radio-button(label="Never") el-radio-button(label="Game Closed") el-radio-button(label="Game Running") el-radio-button(label="Always") div.options-container-item - el-switch(v-model="worldAutoCacheInviteFilter" inactive-text="VIP" active-text="Everyone" :disabled="worldAutoCacheInvite == 'Never'") + el-switch(v-model="worldAutoCacheInviteFilter" @change="saveOpenVROption" inactive-text="VIP" active-text="Everyone" :disabled="worldAutoCacheInvite === 'Never'") div.options-container-item span.name Download on GPS: br - el-radio-group(v-model="worldAutoCacheGPS" size="mini") + el-radio-group(v-model="worldAutoCacheGPS" @change="saveOpenVROption" size="mini") el-radio-button(label="Never") el-radio-button(label="Game Closed") el-radio-button(label="Game Running") el-radio-button(label="Always") div.options-container-item - el-switch(v-model="worldAutoCacheGPSFilter" inactive-text="VIP" active-text="Everyone" :disabled="worldAutoCacheGPS == 'Never'") + el-switch(v-model="worldAutoCacheGPSFilter" @change="saveOpenVROption" inactive-text="VIP" active-text="Everyone" :disabled="worldAutoCacheGPS === 'Never'") div.options-container-item el-button-group - el-button(size="small" icon="el-icon-download" @click="showDownloadDialog()") Download History + el-button(size="small" icon="el-icon-download" @click="showDownloadDialog") Download History br span.sub-header Automatically Manage Cache When Closing VRChat div.options-container-item span.name(style="min-width:300px") Auto delete old versions from cache - el-switch(v-model="autoSweepVRChatCache") + el-switch(v-model="autoSweepVRChatCache" @change="saveOpenVROption") div.options-container span.header Application div.options-container-item diff --git a/html/src/service/gamelog.js b/html/src/service/gamelog.js index 20c4c015..e1e56af4 100644 --- a/html/src/service/gamelog.js +++ b/html/src/service/gamelog.js @@ -13,6 +13,10 @@ class GameLogService { gameLog.worldName = args[1]; break; + case 'location-destination': + gameLog.location = args[0]; + break; + case 'player-joined': gameLog.userDisplayName = args[0]; gameLog.userType = args[1]; diff --git a/html/src/vr.js b/html/src/vr.js index 87117845..c33ad7dd 100644 --- a/html/src/vr.js +++ b/html/src/vr.js @@ -318,11 +318,11 @@ speechSynthesis.getVoices(); }; $app.methods.playNoty = function (json) { - var {noty, message, imageUrl} = JSON.parse(json); + var {noty, message, image} = JSON.parse(json); var text = ''; var img = ''; - if (imageUrl) { - img = ``; + if (image) { + img = ``; } switch (noty.type) { case 'OnPlayerJoined':