diff --git a/html/src/app.js b/html/src/app.js index d29a61b3..19753115 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -2124,6 +2124,7 @@ speechSynthesis.getVoices(); API.$on('LOGIN', function () { this.cachedPlayerModerations.clear(); this.isPlayerModerationsLoading = false; + this.refreshPlayerModerations(); }); API.$on('PLAYER-MODERATION', function (args) { @@ -2229,6 +2230,11 @@ speechSynthesis.getVoices(); this.isPlayerModerationsLoading = false; }).then(() => { this.deleteExpiredPlayerModerations(); + if (($app.playerModerationTable.data.length !== $app.playerModerationTable.lastRunLength) && + ($app.playerModerationTable.lastRunLength > 0)) { + $app.notifyMenu('moderation'); + } + $app.playerModerationTable.lastRunLength = $app.playerModerationTable.data.length; }); }; @@ -3411,6 +3417,11 @@ speechSynthesis.getVoices(); API.getCurrentUser().catch((err1) => { throw err1; }); + if (this.isGameRunning) { + API.refreshPlayerModerations().catch((err1) => { + throw err1; + }); + } } this.checkActiveFriends(); AppApi.CheckGameRunning().then(([isGameRunning, isGameNoVR]) => { @@ -3511,6 +3522,25 @@ speechSynthesis.getVoices(); ++j; } } + var { data } = this.playerModerationTable; + var i = data.length; + var j = 0; + while (j < 10) { + if (i <= 0) { + break; + } + var ctx = data[--i]; + // showAvatar, hideAvatar, block, mute, unmute + if (ctx.sourceUserId !== API.currentUser.id) { + arr.push({ + ...ctx, + created_at: ctx.created, + isFriend: this.friends.has(ctx.sourceUserId), + isFavorite: API.cachedFavoritesByObjectId.has(ctx.sourceUserId) + }); + ++j; + } + } arr.sort(function (a, b) { if (a.created_at < b.created_at) { return 1; @@ -4634,12 +4664,10 @@ speechSynthesis.getVoices(); if (API.isLoggedIn === true) { await this.updateGameLog(); this.sweepGameLog(); - - if (this.gameLogTable.data.length > this.gameLogTable.lastRunLength) { + if (this.gameLogTable.data.length !== this.gameLogTable.lastRunLength) { this.notifyMenu('gameLog'); } this.gameLogTable.lastRunLength = this.gameLogTable.data.length; - this.updateSharedFeed(); } } catch (err) { @@ -5475,6 +5503,7 @@ speechSynthesis.getVoices(); $app.data.playerModerationTable = { data: [], + lastRunLength: 0, filters: [ { prop: 'type', @@ -5530,7 +5559,6 @@ speechSynthesis.getVoices(); } if (ref.$isDeleted === false) { $app.playerModerationTable.data.push(ref); - $app.notifyMenu('moderation'); } }); @@ -5801,6 +5829,11 @@ speechSynthesis.getVoices(); sharedFeedFilters.noty.Unfriend = 'On'; sharedFeedFilters.noty.DisplayName = 'VIP'; sharedFeedFilters.noty.TrustLevel = 'VIP'; + sharedFeedFilters.noty.showAvatar = 'On'; + sharedFeedFilters.noty.hideAvatar = 'On'; + sharedFeedFilters.noty.block = 'On'; + sharedFeedFilters.noty.mute = 'On'; + sharedFeedFilters.noty.unmute = 'On'; sharedFeedFilters.wrist.Location = 'On'; sharedFeedFilters.wrist.OnPlayerJoined = 'Everyone'; sharedFeedFilters.wrist.OnPlayerLeft = 'Everyone'; @@ -5816,6 +5849,12 @@ speechSynthesis.getVoices(); sharedFeedFilters.wrist.Unfriend = 'On'; sharedFeedFilters.wrist.DisplayName = 'Friends'; sharedFeedFilters.wrist.TrustLevel = 'Friends'; + sharedFeedFilters.wrist.showAvatar = 'On'; + sharedFeedFilters.wrist.hideAvatar = 'On'; + sharedFeedFilters.wrist.block = 'On'; + sharedFeedFilters.wrist.mute = 'On'; + sharedFeedFilters.wrist.unmute = 'On'; + configRepository.setString('sharedFeedFilters', JSON.stringify(sharedFeedFilters)); } $app.data.sharedFeedFilters = JSON.parse(configRepository.getString('sharedFeedFilters')); diff --git a/html/src/index.pug b/html/src/index.pug index 8176f857..fd7c2560 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -1244,11 +1244,26 @@ html span.toggle-name Unfriend toggle-switch(:options="toggleSwitchOptionsOn" group="switchNotyGrouprequestUnfriend" v-model="sharedFeedFilters.noty.Unfriend" class="toggle-switch") div - span.toggle-name DisplayName + span.toggle-name Display Name toggle-switch(:options="toggleSwitchOptionsFriends" group="switchNotyGrouprequestDisplayName" v-model="sharedFeedFilters.noty.DisplayName" class="toggle-switch") div - span.toggle-name TrustLevel + span.toggle-name Trust Level toggle-switch(:options="toggleSwitchOptionsFriends" group="switchNotyGrouprequestTrustLevel" v-model="sharedFeedFilters.noty.TrustLevel" class="toggle-switch") + div + span.toggle-name Show Avatar + toggle-switch(:options="toggleSwitchOptionsOn" group="switchNotyGrouprequestShowAvatar" v-model="sharedFeedFilters.noty.showAvatar" class="toggle-switch") + div + span.toggle-name Hide Avatar + toggle-switch(:options="toggleSwitchOptionsOn" group="switchNotyGrouprequestHideAvatar" v-model="sharedFeedFilters.noty.hideAvatar" class="toggle-switch") + div + span.toggle-name Block + toggle-switch(:options="toggleSwitchOptionsOn" group="switchNotyGrouprequestblock" v-model="sharedFeedFilters.noty.block" class="toggle-switch") + div + span.toggle-name Mute + toggle-switch(:options="toggleSwitchOptionsOn" group="switchNotyGrouprequestmute" v-model="sharedFeedFilters.noty.mute" class="toggle-switch") + div + span.toggle-name Unmute + toggle-switch(:options="toggleSwitchOptionsOn" group="switchNotyGrouprequestunmute" v-model="sharedFeedFilters.noty.unmute" class="toggle-switch") template(#footer) el-button(type="small" @click="cancelSharedFeedFilters") Cancel el-button(type="primary" size="small" style="margin-left:10px" @click="saveSharedFeedFilters") Save @@ -1296,11 +1311,26 @@ html span.toggle-name Unfriend toggle-switch(:options="toggleSwitchOptionsOn" group="switchWristGrouprequestUnfriend" v-model="sharedFeedFilters.wrist.Unfriend" class="toggle-switch") div - span.toggle-name DisplayName + span.toggle-name Display Name toggle-switch(:options="toggleSwitchOptionsFriends" group="switchWristGrouprequestDisplayName" v-model="sharedFeedFilters.wrist.DisplayName" class="toggle-switch") div - span.toggle-name TrustLevel + span.toggle-name Trust Level toggle-switch(:options="toggleSwitchOptionsFriends" group="switchWristGrouprequestTrustLevel" v-model="sharedFeedFilters.wrist.TrustLevel" class="toggle-switch") + div + span.toggle-name Show Avatar + toggle-switch(:options="toggleSwitchOptionsOn" group="switchWristGrouprequestShowAvatar" v-model="sharedFeedFilters.wrist.showAvatar" class="toggle-switch") + div + span.toggle-name Hide Avatar + toggle-switch(:options="toggleSwitchOptionsOn" group="switchWristGrouprequestHideAvatar" v-model="sharedFeedFilters.wrist.hideAvatar" class="toggle-switch") + div + span.toggle-name Block + toggle-switch(:options="toggleSwitchOptionsOn" group="switchWristGrouprequestblock" v-model="sharedFeedFilters.wrist.block" class="toggle-switch") + div + span.toggle-name Mute + toggle-switch(:options="toggleSwitchOptionsOn" group="switchWristGrouprequestmute" v-model="sharedFeedFilters.wrist.mute" class="toggle-switch") + div + span.toggle-name Unmute + toggle-switch(:options="toggleSwitchOptionsOn" group="switchWristGrouprequestunmute" v-model="sharedFeedFilters.wrist.unmute" class="toggle-switch") template(#footer) el-button(type="small" @click="cancelSharedFeedFilters") Cancel el-button(type="primary" size="small" @click="saveSharedFeedFilters") Save diff --git a/html/src/vr.js b/html/src/vr.js index d31ba3fe..20aa678a 100644 --- a/html/src/vr.js +++ b/html/src/vr.js @@ -769,12 +769,16 @@ speechSynthesis.getVoices(); ((filter[feed.type] === 'Friends') && (feed.isFriend)) || ((filter[feed.type] === 'VIP') && (feed.isFavorite)))) { var displayName = ''; - if (feed.data) { - displayName = feed.data; - } else if (feed.displayName) { + if (feed.displayName) { displayName = feed.displayName; } else if (feed.senderUsername) { displayName = feed.senderUsername; + } else if (feed.sourceDisplayName) { + displayName = feed.sourceDisplayName; + } else if (feed.data) { + displayName = feed.data; + } else { + console.error('missing displayName'); } if ((displayName) && (!this.notyMap[displayName]) || (this.notyMap[displayName] < feed.created_at)) { @@ -943,6 +947,8 @@ speechSynthesis.getVoices(); displayName = feed.displayName; } else if (feed.senderUsername) { displayName = feed.senderUsername; + } else if (feed.sourceDisplayName) { + displayName = feed.sourceDisplayName; } else if (feed.data) { displayName = feed.data; } else { @@ -1011,6 +1017,21 @@ speechSynthesis.getVoices(); case 'DisplayName': text = `${noty.previousDisplayName} changed their name to ${noty.displayName}`; break; + case 'showAvatar': + text = `${noty.sourceDisplayName} has shown your avatar`; + break; + case 'hideAvatar': + text = `${noty.sourceDisplayName} has hidden your avatar`; + break; + case 'block': + text = `${noty.sourceDisplayName} has blocked you`; + break; + case 'mute': + text = `${noty.sourceDisplayName} has muted you`; + break; + case 'unmute': + text = `${noty.sourceDisplayName} has unmuted you`; + break; } if (text) { new Noty({ @@ -1066,6 +1087,21 @@ speechSynthesis.getVoices(); case 'DisplayName': this.speak(`${noty.previousDisplayName} changed their name to ${noty.displayName}`); break; + case 'showAvatar': + this.speak(`${noty.sourceDisplayName} has shown your avatar`); + break; + case 'hideAvatar': + this.speak(`${noty.sourceDisplayName} has hidden your avatar`); + break; + case 'block': + this.speak(`${noty.sourceDisplayName} has blocked you`); + break; + case 'mute': + this.speak(`${noty.sourceDisplayName} has muted you`); + break; + case 'unmute': + this.speak(`${noty.sourceDisplayName} has unmuted you`); + break; } } if ((this.desktopToastToggle) && (this.isGameNoVR)) { diff --git a/html/src/vr.pug b/html/src/vr.pug index 6ce58908..c2829b35 100644 --- a/html/src/vr.pug +++ b/html/src/vr.pug @@ -93,6 +93,31 @@ html span.extra span.time {{ feed.created_at | formatDate('HH:MI') }} | 🤝 #[span.name(v-text="feed.displayName")] {{ feed.previousTrustLevel }} #[i.el-icon-right] {{ feed.trustLevel }} + div(v-else-if="feed.type === 'showAvatar'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | 👀 #[span.name(v-text="feed.sourceDisplayName")] + div(v-else-if="feed.type === 'hideAvatar'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | 🙈 #[span.name(v-text="feed.sourceDisplayName")] + div(v-else-if="feed.type === 'block'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | 🛑 #[span.name(v-text="feed.sourceDisplayName")] has blocked you + div(v-else-if="feed.type === 'mute'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | 🔇 #[span.name(v-text="feed.sourceDisplayName")] has muted you + div(v-else-if="feed.type === 'unmute'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | 🎤 #[span.name(v-text="feed.sourceDisplayName")] has unmuted you template(v-else) template(v-for="feed in wristFeed") .x-friend-item(v-if="feed.type === 'GPS'" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") @@ -170,6 +195,31 @@ html span.extra span.time {{ feed.created_at | formatDate('HH:MI') }} | #[span.name(v-text="feed.displayName")] trust level is now {{ feed.trustLevel }} + div(v-else-if="feed.type === 'showAvatar'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | #[span.name(v-text="feed.sourceDisplayName")] has shown your avatar + div(v-else-if="feed.type === 'hideAvatar'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | #[span.name(v-text="feed.sourceDisplayName")] has hidden your avatar + div(v-else-if="feed.type === 'block'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | #[span.name(v-text="feed.sourceDisplayName")] has blocked you + div(v-else-if="feed.type === 'mute'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | #[span.name(v-text="feed.sourceDisplayName")] has muted you + div(v-else-if="feed.type === 'unmute'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | #[span.name(v-text="feed.sourceDisplayName")] has unmuted you .x-container div(style="display:flex;flex-direction:row") template(v-if="devices.length")