diff --git a/html/src/app.js b/html/src/app.js
index 4452ead4..a7510e6b 100644
--- a/html/src/app.js
+++ b/html/src/app.js
@@ -5457,12 +5457,15 @@ speechSynthesis.getVoices();
) {
playOverlayNotification = true;
}
+ var message = '';
+ if (noty.message) {
+ message = noty.message;
+ }
var messageList = [
'inviteMessage',
'requestMessage',
'responseMessage'
];
- let message = '';
for (var k = 0; k < messageList.length; k++) {
if (
typeof noty.details !== 'undefined' &&
@@ -5522,6 +5525,8 @@ speechSynthesis.getVoices();
imageUrl = noty.thumbnailImageUrl;
} else if (noty.details && noty.details.imageUrl) {
imageUrl = noty.details.imageURL;
+ } else if (noty.imageUrl) {
+ imageUrl = noty.imageUrl;
} else if (userId) {
imageUrl = await API.getCachedUser({
userId
@@ -5671,6 +5676,18 @@ speechSynthesis.getVoices();
`${noty.previousDisplayName} changed their name to ${noty.displayName}`
);
break;
+ case 'group.announcement':
+ this.speak(noty.message);
+ break;
+ case 'group.informative':
+ this.speak(noty.message);
+ break;
+ case 'group.invite':
+ this.speak(noty.message);
+ break;
+ case 'group.joinRequest':
+ this.speak(noty.message);
+ break;
case 'PortalSpawn':
if (noty.displayName) {
this.speak(
@@ -5872,6 +5889,18 @@ speechSynthesis.getVoices();
image
);
break;
+ case 'group.announcement':
+ AppApi.XSNotification('VRCX', noty.message, timeout, image);
+ break;
+ case 'group.informative':
+ AppApi.XSNotification('VRCX', noty.message, timeout, image);
+ break;
+ case 'group.invite':
+ AppApi.XSNotification('VRCX', noty.message, timeout, image);
+ break;
+ case 'group.joinRequest':
+ AppApi.XSNotification('VRCX', noty.message, timeout, image);
+ break;
case 'PortalSpawn':
if (noty.displayName) {
AppApi.XSNotification(
@@ -6111,6 +6140,30 @@ speechSynthesis.getVoices();
image
);
break;
+ case 'group.announcement':
+ AppApi.DesktopNotification(
+ 'Group Announcement',
+ noty.message,
+ image
+ );
+ break;
+ case 'group.informative':
+ AppApi.DesktopNotification(
+ 'Group Informative',
+ noty.message,
+ image
+ );
+ break;
+ case 'group.invite':
+ AppApi.DesktopNotification('Group Invite', noty.message, image);
+ break;
+ case 'group.joinRequest':
+ AppApi.DesktopNotification(
+ 'Group Join Request',
+ noty.message,
+ image
+ );
+ break;
case 'PortalSpawn':
if (noty.displayName) {
AppApi.DesktopNotification(
@@ -12835,6 +12888,10 @@ speechSynthesis.getVoices();
Unfriend: 'On',
DisplayName: 'VIP',
TrustLevel: 'VIP',
+ 'group.announcement': 'On',
+ 'group.informative': 'On',
+ 'group.invite': 'On',
+ 'group.joinRequest': 'Off',
PortalSpawn: 'Everyone',
Event: 'On',
VideoPlay: 'Off',
@@ -12867,6 +12924,10 @@ speechSynthesis.getVoices();
Unfriend: 'On',
DisplayName: 'Friends',
TrustLevel: 'Friends',
+ 'group.announcement': 'On',
+ 'group.informative': 'On',
+ 'group.invite': 'On',
+ 'group.joinRequest': 'On',
PortalSpawn: 'Everyone',
Event: 'On',
VideoPlay: 'On',
@@ -12900,6 +12961,16 @@ speechSynthesis.getVoices();
$app.data.sharedFeedFilters.wrist.Muted = 'On';
$app.data.sharedFeedFilters.wrist.Unmuted = 'On';
}
+ if (!$app.data.sharedFeedFilters.noty['group.announcement']) {
+ $app.data.sharedFeedFilters.noty['group.announcement'] = 'On';
+ $app.data.sharedFeedFilters.noty['group.informative'] = 'On';
+ $app.data.sharedFeedFilters.noty['group.invite'] = 'On';
+ $app.data.sharedFeedFilters.noty['group.joinRequest'] = 'Off';
+ $app.data.sharedFeedFilters.wrist['group.announcement'] = 'On';
+ $app.data.sharedFeedFilters.wrist['group.informative'] = 'On';
+ $app.data.sharedFeedFilters.wrist['group.invite'] = 'On';
+ $app.data.sharedFeedFilters.wrist['group.joinRequest'] = 'On';
+ }
if (!configRepository.getString('VRCX_trustColor')) {
configRepository.setString(
diff --git a/html/src/index.pug b/html/src/index.pug
index 558441ae..60923935 100644
--- a/html/src/index.pug
+++ b/html/src/index.pug
@@ -2792,10 +2792,28 @@ html
el-radio-button(label="Off")
el-radio-button(label="VIP")
el-radio-button(label="Friends")
+ .toggle-item
+ span.toggle-name Group Announcement
+ el-radio-group(v-model="sharedFeedFilters.noty['group.announcement']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
+ .toggle-item
+ span.toggle-name Group Join/Leave
+ el-radio-group(v-model="sharedFeedFilters.noty['group.informative']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
+ .toggle-item
+ span.toggle-name Group Invite
+ el-radio-group(v-model="sharedFeedFilters.noty['group.invite']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
+ .toggle-item
+ span.toggle-name Group Join Request
+ el-radio-group(v-model="sharedFeedFilters.noty['group.joinRequest']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
.toggle-item
span.toggle-name Portal Spawn
- el-tooltip(placement="top" style="margin-left:5px" content="Requires '--enable-sdk-log-levels' steam launch option (click for more info)")
- i.el-icon-warning(style="cursor:pointer" @click="openExternalLink(recommendedSteamParams)")
el-radio-group(v-model="sharedFeedFilters.noty.PortalSpawn" size="mini")
el-radio-button(label="Off")
el-radio-button(label="VIP")
@@ -2986,10 +3004,28 @@ html
el-radio-button(label="Off")
el-radio-button(label="VIP")
el-radio-button(label="Friends")
+ .toggle-item
+ span.toggle-name Group Announcement
+ el-radio-group(v-model="sharedFeedFilters.wrist['group.announcement']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
+ .toggle-item
+ span.toggle-name Group Join/Leave
+ el-radio-group(v-model="sharedFeedFilters.wrist['group.informative']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
+ .toggle-item
+ span.toggle-name Group Invite
+ el-radio-group(v-model="sharedFeedFilters.wrist['group.invite']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
+ .toggle-item
+ span.toggle-name Group Join Request
+ el-radio-group(v-model="sharedFeedFilters.wrist['group.joinRequest']" size="mini")
+ el-radio-button(label="Off")
+ el-radio-button(label="On")
.toggle-item
span.toggle-name Portal Spawn
- el-tooltip(placement="top" style="margin-left:5px" content="Requires '--enable-sdk-log-levels' steam launch option (click for more info)")
- i.el-icon-warning(style="cursor:pointer" @click="openExternalLink(recommendedSteamParams)")
el-radio-group(v-model="sharedFeedFilters.wrist.PortalSpawn" size="mini")
el-radio-button(label="Off")
el-radio-button(label="VIP")
diff --git a/html/src/vr.js b/html/src/vr.js
index 52c55540..13a3080c 100644
--- a/html/src/vr.js
+++ b/html/src/vr.js
@@ -464,6 +464,18 @@ Vue.component('marquee-text', MarqueeText);
case 'DisplayName':
text = `${noty.previousDisplayName} changed their name to ${noty.displayName}`;
break;
+ case 'group.announcement':
+ text = noty.message;
+ break;
+ case 'group.informative':
+ text = noty.message;
+ break;
+ case 'group.invite':
+ text = noty.message;
+ break;
+ case 'group.joinRequest':
+ text = noty.message;
+ break;
case 'PortalSpawn':
if (noty.displayName) {
text = `${
diff --git a/html/src/vr.pug b/html/src/vr.pug
index 461114bb..9466541f 100644
--- a/html/src/vr.pug
+++ b/html/src/vr.pug
@@ -119,6 +119,26 @@ html
span.extra
span.time {{ feed.created_at | formatDate }}
| 🤝 #[span.name(v-text="feed.displayName")] {{ feed.previousTrustLevel }} #[i.el-icon-right] {{ feed.trustLevel }}
+ div(v-else-if="feed.type === 'group.announcement'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | 🏷️ #[span.name(v-text="feed.message")]
+ div(v-else-if="feed.type === 'group.informative'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | 🏷️ #[span.name(v-text="feed.message")]
+ div(v-else-if="feed.type === 'group.invite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | 🏷️ #[span.name(v-text="feed.message")]
+ div(v-else-if="feed.type === 'group.joinRequest'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | 🏷️ #[span.name(v-text="feed.message")]
div(v-else-if="feed.type === 'PortalSpawn'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
.detail
span.extra
@@ -297,6 +317,26 @@ html
span.extra
span.time {{ feed.created_at | formatDate }}
| #[span.name(v-text="feed.displayName")] trust level is now {{ feed.trustLevel }}
+ div(v-else-if="feed.type === 'group.announcement'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | #[span.name(v-text="feed.message")]
+ div(v-else-if="feed.type === 'group.informative'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | #[span.name(v-text="feed.message")]
+ div(v-else-if="feed.type === 'group.invite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | #[span.name(v-text="feed.message")]
+ div(v-else-if="feed.type === 'group.joinRequest'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
+ .detail
+ span.extra
+ span.time {{ feed.created_at | formatDate }}
+ | #[span.name(v-text="feed.message")]
div(v-else-if="feed.type === 'PortalSpawn'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
.detail
span.extra