diff --git a/html/src/app.js b/html/src/app.js index 031b2889..01bfc60e 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -3698,6 +3698,9 @@ speechSynthesis.getVoices(); if (--this.nextFriendsRefresh <= 0) { this.nextFriendsRefresh = 7200; // 1hour API.refreshFriends(); + if (this.isGameRunning) { + API.refreshPlayerModerations(); + } } AppApi.CheckGameRunning().then(([isGameRunning, isGameNoVR]) => { if (isGameRunning !== this.isGameRunning) { @@ -3948,6 +3951,49 @@ speechSynthesis.getVoices(); } } } + if ((ctx.type === 'OnPlayerJoined') || + (ctx.type === 'OnPlayerLeft')) { + for (var ref of this.playerModerationTable.data) { + if (ref.targetDisplayName === ctx.data) { + if (ref.type === 'block') { + var type = `Blocked${ctx.type}`; + } else if (ref.type === 'mute') { + var type = `Muted${ctx.type}`; + } else { + continue; + } + var displayName = ref.targetDisplayName; + var userId = ref.targetUserId; + var created_at = ctx.created_at; + if ((wristFilter[type]) && + ((wristFilter[type] === 'Everyone') || + ((wristFilter[type] === 'Friends') && (isFriend)) || + ((wristFilter[type] === 'VIP') && (isFavorite)))) { + wristArr.unshift({ + created_at, + type, + displayName, + userId, + isFriend, + isFavorite + }); + } + if ((notyFilter[type]) && + ((notyFilter[type] === 'Everyone') || + ((notyFilter[type] === 'Friends') && (isFriend)) || + ((notyFilter[type] === 'VIP') && (isFavorite)))) { + notyArr.unshift({ + created_at, + type, + displayName, + userId, + isFriend, + isFavorite + }); + } + } + } + } if ((w < 20) && (wristFilter[ctx.type]) && ((wristFilter[ctx.type] === 'On') || (wristFilter[ctx.type] === 'Everyone') || @@ -4288,7 +4334,7 @@ speechSynthesis.getVoices(); imageURL = noty.details.imageUrl; } else if (userId) { imageURL = await API.getCachedUser({ - userId: userId + userId }).catch((err) => { console.error(err); return false; @@ -4387,6 +4433,18 @@ speechSynthesis.getVoices(); case 'VideoPlay': this.speak(`Now playing: ${noty.data}`); break; + case 'BlockedOnPlayerJoined': + this.speak(`Blocked user ${noty.displayName} has joined`); + break; + case 'BlockedOnPlayerLeft': + this.speak(`Blocked user ${noty.displayName} has left`); + break; + case 'MutedOnPlayerJoined': + this.speak(`Muted user ${noty.displayName} has joined`); + break; + case 'MutedOnPlayerLeft': + this.speak(`Muted user ${noty.displayName} has left`); + break; default: break; } @@ -4452,6 +4510,18 @@ speechSynthesis.getVoices(); case 'VideoPlay': AppApi.XSNotification('VRCX', `Now playing: ${noty.data}`, timeout, image); break; + case 'BlockedOnPlayerJoined': + AppApi.XSNotification('VRCX', `Blocked user ${noty.displayName} has joined`, timeout, image); + break; + case 'BlockedOnPlayerLeft': + AppApi.XSNotification('VRCX', `Blocked user ${noty.displayName} has left`, timeout, image); + break; + case 'MutedOnPlayerJoined': + AppApi.XSNotification('VRCX', `Muted user ${noty.displayName} has joined`, timeout, image); + break; + case 'MutedOnPlayerLeft': + AppApi.XSNotification('VRCX', `Muted user ${noty.displayName} has left`, timeout, image); + break; default: break; } @@ -4516,6 +4586,18 @@ speechSynthesis.getVoices(); case 'VideoPlay': AppApi.DesktopNotification('Now playing', noty.data, image); break; + case 'BlockedOnPlayerJoined': + AppApi.DesktopNotification(noty.displayName, 'blocked user has joined', image); + break; + case 'BlockedOnPlayerLeft': + AppApi.DesktopNotification(noty.displayName, 'blocked user has left', image); + break; + case 'MutedOnPlayerJoined': + AppApi.DesktopNotification(noty.displayName, 'muted user has joined', image); + break; + case 'MutedOnPlayerLeft': + AppApi.DesktopNotification(noty.displayName, 'muted user has left', image); + break; default: break; } @@ -7063,9 +7145,12 @@ speechSynthesis.getVoices(); DisplayName: 'VIP', TrustLevel: 'VIP', PortalSpawn: 'Everyone', - ItemDestroy: 'Off', Event: 'On', - VideoPlay: 'On' + VideoPlay: 'On', + BlockedOnPlayerJoined: 'Off', + BlockedOnPlayerLeft: 'Off', + MutedOnPlayerJoined: 'Off', + MutedOnPlayerLeft: 'Off' }, wrist: { Location: 'On', @@ -7086,9 +7171,12 @@ speechSynthesis.getVoices(); DisplayName: 'Friends', TrustLevel: 'Friends', PortalSpawn: 'Everyone', - ItemDestroy: 'Everyone', Event: 'On', - VideoPlay: 'On' + VideoPlay: 'On', + BlockedOnPlayerJoined: 'Off', + BlockedOnPlayerLeft: 'Off', + MutedOnPlayerJoined: 'Off', + MutedOnPlayerLeft: 'Off' } }; configRepository.setString('sharedFeedFilters', JSON.stringify(sharedFeedFilters)); diff --git a/html/src/index.pug b/html/src/index.pug index 272ab748..6702f524 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -1669,6 +1669,18 @@ html div span.toggle-name Video Play toggle-switch(:options="toggleSwitchOptionsOn" group="switchNotyGrouprequestVideoPlay" v-model="sharedFeedFilters.noty.VideoPlay" class="toggle-switch") + div + span.toggle-name Blocked Player Joins + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchNotyGrouprequestBlockedOnPlayerJoined" v-model="sharedFeedFilters.noty.BlockedOnPlayerJoined" class="toggle-switch") + div + span.toggle-name Blocked Player Leaves + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchNotyGrouprequestBlockedOnPlayerLeft" v-model="sharedFeedFilters.noty.BlockedOnPlayerLeft" class="toggle-switch") + div + span.toggle-name Muted Player Joins + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchNotyGrouprequestMutedOnPlayerJoined" v-model="sharedFeedFilters.noty.MutedOnPlayerJoined" class="toggle-switch") + div + span.toggle-name Muted Player Leaves + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchNotyGrouprequestMutedOnPlayerLeft" v-model="sharedFeedFilters.noty.MutedOnPlayerLeft" 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 @@ -1736,6 +1748,18 @@ html div span.toggle-name Video Play toggle-switch(:options="toggleSwitchOptionsOn" group="switchWristGrouprequestVideoPlay" v-model="sharedFeedFilters.wrist.VideoPlay" class="toggle-switch") + div + span.toggle-name Blocked Player Joins + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchWristGrouprequestBlockedOnPlayerJoined" v-model="sharedFeedFilters.wrist.BlockedOnPlayerJoined" class="toggle-switch") + div + span.toggle-name Blocked Player Leaves + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchWristGrouprequestBlockedOnPlayerLeft" v-model="sharedFeedFilters.wrist.BlockedOnPlayerLeft" class="toggle-switch") + div + span.toggle-name Muted Player Joins + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchWristGrouprequestMutedOnPlayerJoined" v-model="sharedFeedFilters.wrist.MutedOnPlayerJoined" class="toggle-switch") + div + span.toggle-name Muted Player Leaves + toggle-switch(:options="toggleSwitchOptionsEveryone" group="switchWristGrouprequestMutedOnPlayerLeft" v-model="sharedFeedFilters.wrist.MutedOnPlayerLeft" 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 c19cafe4..4418cc95 100644 --- a/html/src/vr.js +++ b/html/src/vr.js @@ -946,6 +946,18 @@ speechSynthesis.getVoices(); case 'VideoPlay': text = `Now playing: ${noty.data}`; break; + case 'BlockedOnPlayerJoined': + text = `Blocked user ${noty.displayName} has joined`; + break; + case 'BlockedOnPlayerLeft': + text = `Blocked user ${noty.displayName} has left`; + break; + case 'MutedOnPlayerJoined': + text = `Muted user ${noty.displayName} has joined`; + break; + case 'MutedOnPlayerLeft': + text = `Muted user ${noty.displayName} has left`; + break; default: break; } diff --git a/html/src/vr.pug b/html/src/vr.pug index 648e2506..7c8c883c 100644 --- a/html/src/vr.pug +++ b/html/src/vr.pug @@ -118,6 +118,26 @@ html span.extra span.time {{ feed.created_at | formatDate('HH:MI') }} | 🎵 #[span.name(v-text="feed.data")] + div(v-else-if="feed.type === 'BlockedOnPlayerJoined'" 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.displayName")] + div(v-else-if="feed.type === 'BlockedOnPlayerLeft'" 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.displayName")] + div(v-else-if="feed.type === 'MutedOnPlayerJoined'" 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.displayName")] + div(v-else-if="feed.type === 'MutedOnPlayerLeft'" 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.displayName")] template(v-else) template(v-for="feed in wristFeed") .x-friend-item(v-if="feed.type === 'GPS'" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") @@ -220,6 +240,26 @@ html span.extra span.time {{ feed.created_at | formatDate('HH:MI') }} | Now playing: #[span.name(v-text="feed.data")] + div(v-else-if="feed.type === 'BlockedOnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | Blocked user #[span.name(v-text="feed.displayName")] has joined + div(v-else-if="feed.type === 'BlockedOnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | Blocked user #[span.name(v-text="feed.displayName")] has left + div(v-else-if="feed.type === 'MutedOnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | Muted user #[span.name(v-text="feed.displayName")] has joined + div(v-else-if="feed.type === 'MutedOnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") + .detail + span.extra + span.time {{ feed.created_at | formatDate('HH:MI') }} + | Muted user #[span.name(v-text="feed.displayName")] has left .x-containerbottom div(style="display:flex;flex-direction:row") template(v-if="devices.length")