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")