Custom avatar tags and many fixes

This commit is contained in:
Natsumi
2024-05-16 19:01:25 +12:00
parent 0b55d9cd33
commit d9bb77d395
7 changed files with 294 additions and 122 deletions

View File

@@ -1700,6 +1700,14 @@ speechSynthesis.getVoices();
return;
}
if (groups.length !== this.currentUserGroups.size) {
console.log(
`applyPresenceGroups: size old: ${this.currentUserGroups.size} new: ${groups.length}`,
this.currentUserGroups,
groups
);
}
// update group list
for (var groupId of groups) {
if (!this.currentUserGroups.has(groupId)) {
@@ -2047,7 +2055,7 @@ speechSynthesis.getVoices();
}
}
for (var prop in ref) {
if (Array.isArray(ref[prop])) {
if (Array.isArray(ref[prop]) && Array.isArray($ref[prop])) {
if (!arraysMatch(ref[prop], $ref[prop])) {
props[prop] = true;
}
@@ -10263,29 +10271,44 @@ speechSynthesis.getVoices();
currentAvatarTags = ref.currentAvatarTags;
previousCurrentAvatarTags = ref.currentAvatarTags;
}
var avatarInfo = {
ownerId: '',
avatarName: ''
};
try {
avatarInfo = await $app.getAvatarName(currentAvatarImageUrl);
} catch (err) {}
var feed = {
created_at: new Date().toJSON(),
type: 'Avatar',
userId: ref.id,
displayName: ref.displayName,
ownerId: avatarInfo.ownerId,
avatarName: avatarInfo.avatarName,
currentAvatarImageUrl,
currentAvatarThumbnailImageUrl,
previousCurrentAvatarImageUrl,
previousCurrentAvatarThumbnailImageUrl,
currentAvatarTags,
previousCurrentAvatarTags
};
$app.addFeed(feed);
database.addAvatarToDatabase(feed);
if (this.logEmptyAvatars || ref.currentAvatarImageUrl) {
var avatarInfo = {
ownerId: '',
avatarName: ''
};
try {
avatarInfo = await $app.getAvatarName(
currentAvatarImageUrl
);
} catch (err) {}
var previousAvatarInfo = {
ownerId: '',
avatarName: ''
};
try {
previousAvatarInfo = await $app.getAvatarName(
previousCurrentAvatarImageUrl
);
} catch (err) {}
var feed = {
created_at: new Date().toJSON(),
type: 'Avatar',
userId: ref.id,
displayName: ref.displayName,
ownerId: avatarInfo.ownerId,
previousOwnerId: previousAvatarInfo.ownerId,
avatarName: avatarInfo.avatarName,
previousAvatarName: previousAvatarInfo.avatarName,
currentAvatarImageUrl,
currentAvatarThumbnailImageUrl,
previousCurrentAvatarImageUrl,
previousCurrentAvatarThumbnailImageUrl,
currentAvatarTags,
previousCurrentAvatarTags
};
$app.addFeed(feed);
database.addAvatarToDatabase(feed);
}
}
if (props.status || props.statusDescription) {
var status = '';
@@ -11979,7 +12002,7 @@ speechSynthesis.getVoices();
var msg = data.Parameters[245]['2'];
if (typeof msg === 'string') {
var displayName =
data.Parameters[254]['14']?.targetDisplayName;
data.Parameters[245]['14']?.targetDisplayName;
msg = msg.replace('{{targetDisplayName}}', displayName);
}
this.addEntryPhotonEvent({
@@ -15587,11 +15610,19 @@ speechSynthesis.getVoices();
'VRCX_logResourceLoad',
false
);
$app.methods.saveGameLogOptions = async function () {
$app.data.logEmptyAvatars = await configRepository.getBool(
'VRCX_logEmptyAvatars',
false
);
$app.methods.saveLoggingOptions = async function () {
await configRepository.setBool(
'VRCX_logResourceLoad',
this.logResourceLoad
);
await configRepository.setBool(
'VRCX_logEmptyAvatars',
this.logEmptyAvatars
);
};
$app.data.autoStateChange = await configRepository.getString(
'VRCX_autoStateChange',
@@ -18083,6 +18114,20 @@ speechSynthesis.getVoices();
return avatars;
};
$app.methods.lookupAvatarByImageFileId = async function (authorId, fileId) {
var length = this.avatarRemoteDatabaseProviderList.length;
for (var i = 0; i < length; ++i) {
var url = this.avatarRemoteDatabaseProviderList[i];
var avatarArray = await this.lookupAvatarsByAuthor(url, authorId);
for (var avatar of avatarArray) {
if (extractFileId(avatar.imageUrl) === fileId) {
return avatar.id;
}
}
}
return null;
};
$app.methods.lookupAvatarsByAuthor = async function (url, authorId) {
var avatars = [];
if (!url) {
@@ -18577,7 +18622,7 @@ speechSynthesis.getVoices();
}
if (
unityPackage.platform === 'standalonewindows' &&
this.compareUnityVersion(unityPackage.unityVersion)
this.compareUnityVersion(unityPackage.unitySortNumber)
) {
assetUrl = unityPackage.assetUrl;
break;
@@ -19345,7 +19390,7 @@ speechSynthesis.getVoices();
!assetUrl &&
unityPackage.platform === 'standalonewindows' &&
unityPackage.variant === 'standard' &&
this.compareUnityVersion(unityPackage.unityVersion)
this.compareUnityVersion(unityPackage.unitySortNumber)
) {
assetUrl = unityPackage.assetUrl;
}
@@ -19560,18 +19605,14 @@ speechSynthesis.getVoices();
};
$app.methods.checkAvatarCacheRemote = async function (fileId, ownerUserId) {
var avatarId = '';
if (this.avatarRemoteDatabase) {
var data = await this.lookupAvatars('authorId', ownerUserId);
if (data && typeof data === 'object') {
data.forEach((avatar) => {
if (extractFileId(avatar.imageUrl) === fileId) {
avatarId = avatar.id;
}
});
}
var avatarId = await this.lookupAvatarByImageFileId(
ownerUserId,
fileId
);
return avatarId;
}
return avatarId;
return null;
};
$app.methods.showAvatarAuthorDialog = async function (
@@ -20658,6 +20699,8 @@ speechSynthesis.getVoices();
ownAvatars: [],
selectedCount: 0,
forceUpdate: 0,
selectedTags: [],
selectedTagsCsv: '',
contentHorror: false,
contentGore: false,
contentViolence: false,
@@ -20672,6 +20715,8 @@ speechSynthesis.getVoices();
D.loading = false;
D.ownAvatars = [];
D.forceUpdate = 0;
D.selectedTags = [];
D.selectedTagsCsv = '';
D.contentHorror = false;
D.contentGore = false;
D.contentViolence = false;
@@ -20695,6 +20740,11 @@ speechSynthesis.getVoices();
case 'content_sex':
D.contentSex = true;
break;
default:
if (tag.startsWith('content_')) {
D.selectedTags.push(tag.substring(8));
}
break;
}
});
for (var ref of API.cachedAvatars.values()) {
@@ -20722,6 +20772,84 @@ speechSynthesis.getVoices();
}
}
this.updateAvatarTagsSelection();
this.updateSelectedAvatarTags();
};
$app.methods.updateSelectedAvatarTags = function () {
var D = this.setAvatarTagsDialog;
if (D.contentHorror) {
if (!D.selectedTags.includes('content_horror')) {
D.selectedTags.push('content_horror');
}
} else if (D.selectedTags.includes('content_horror')) {
D.selectedTags.splice(D.selectedTags.indexOf('content_horror'), 1);
}
if (D.contentGore) {
if (!D.selectedTags.includes('content_gore')) {
D.selectedTags.push('content_gore');
}
} else if (D.selectedTags.includes('content_gore')) {
D.selectedTags.splice(D.selectedTags.indexOf('content_gore'), 1);
}
if (D.contentViolence) {
if (!D.selectedTags.includes('content_violence')) {
D.selectedTags.push('content_violence');
}
} else if (D.selectedTags.includes('content_violence')) {
D.selectedTags.splice(
D.selectedTags.indexOf('content_violence'),
1
);
}
if (D.contentAdult) {
if (!D.selectedTags.includes('content_adult')) {
D.selectedTags.push('content_adult');
}
} else if (D.selectedTags.includes('content_adult')) {
D.selectedTags.splice(D.selectedTags.indexOf('content_adult'), 1);
}
if (D.contentSex) {
if (!D.selectedTags.includes('content_sex')) {
D.selectedTags.push('content_sex');
}
} else if (D.selectedTags.includes('content_sex')) {
D.selectedTags.splice(D.selectedTags.indexOf('content_sex'), 1);
}
D.selectedTagsCsv = D.selectedTags.join(',').replace(/content_/g, '');
};
$app.methods.updateInputAvatarTags = function () {
var D = this.setAvatarTagsDialog;
D.contentHorror = false;
D.contentGore = false;
D.contentViolence = false;
D.contentAdult = false;
D.contentSex = false;
var tags = D.selectedTagsCsv.split(',');
D.selectedTags = [];
for (var tag of tags) {
switch (tag) {
case 'horror':
D.contentHorror = true;
break;
case 'gore':
D.contentGore = true;
break;
case 'violence':
D.contentViolence = true;
break;
case 'adult':
D.contentAdult = true;
break;
case 'sex':
D.contentSex = true;
break;
}
if (!D.selectedTags.includes(`content_${tag}`)) {
D.selectedTags.push(`content_${tag}`);
}
}
};
$app.data.avatarContentTags = [
@@ -20747,47 +20875,12 @@ speechSynthesis.getVoices();
if (!ref.$selected) {
continue;
}
var tags = ref.tags;
if (D.contentHorror) {
if (!tags.includes('content_horror')) {
tags.push('content_horror');
var tags = [...D.selectedTags];
for (var tag of ref.tags) {
if (!tag.startsWith('content_')) {
tags.push(tag);
}
} else if (tags.includes('content_horror')) {
tags.splice(tags.indexOf('content_horror'), 1);
}
if (D.contentGore) {
if (!tags.includes('content_gore')) {
tags.push('content_gore');
}
} else if (tags.includes('content_gore')) {
tags.splice(tags.indexOf('content_gore'), 1);
}
if (D.contentViolence) {
if (!tags.includes('content_violence')) {
tags.push('content_violence');
}
} else if (tags.includes('content_violence')) {
tags.splice(tags.indexOf('content_violence'), 1);
}
if (D.contentAdult) {
if (!tags.includes('content_adult')) {
tags.push('content_adult');
}
} else if (tags.includes('content_adult')) {
tags.splice(tags.indexOf('content_adult'), 1);
}
if (D.contentSex) {
if (!tags.includes('content_sex')) {
tags.push('content_sex');
}
} else if (tags.includes('content_sex')) {
tags.splice(tags.indexOf('content_sex'), 1);
}
await API.saveAvatar({
id: ref.id,
tags
@@ -24174,7 +24267,7 @@ speechSynthesis.getVoices();
}
if (
unityPackage.platform === 'standalonewindows' &&
this.compareUnityVersion(unityPackage.unityVersion)
this.compareUnityVersion(unityPackage.unitySortNumber)
) {
assetUrl = unityPackage.assetUrl;
break;
@@ -24340,7 +24433,7 @@ speechSynthesis.getVoices();
}
if (
unityPackage.platform === 'standalonewindows' &&
this.compareUnityVersion(unityPackage.unityVersion)
this.compareUnityVersion(unityPackage.unitySortNumber)
) {
assetUrl = unityPackage.assetUrl;
break;
@@ -24464,7 +24557,7 @@ speechSynthesis.getVoices();
}
if (
unityPackage.platform === 'standalonewindows' &&
this.compareUnityVersion(unityPackage.unityVersion)
this.compareUnityVersion(unityPackage.unitySortNumber)
) {
assetUrl = unityPackage.assetUrl;
break;
@@ -24484,7 +24577,7 @@ speechSynthesis.getVoices();
var unityPackage = unityPackages[i];
if (
unityPackage.platform === 'standalonewindows' &&
this.compareUnityVersion(unityPackage.unityVersion)
this.compareUnityVersion(unityPackage.unitySortNumber)
) {
assetUrl = unityPackage.assetUrl;
break;
@@ -25398,21 +25491,47 @@ speechSynthesis.getVoices();
}
};
$app.methods.compareUnityVersion = function (version) {
$app.methods.compareUnityVersion = function (unitySortNumber) {
if (!API.cachedConfig.sdkUnityVersion) {
console.error('No cachedConfig.sdkUnityVersion');
return false;
}
var currentUnityVersion = API.cachedConfig.sdkUnityVersion.replace(
/\D/g,
''
);
// limit to 8 characters because 2019.4.31f1c1 is a thing
// limit to 7 characters because 2022361 is a thing
currentUnityVersion = currentUnityVersion.slice(0, 7);
var assetVersion = version.replace(/\D/g, '');
assetVersion = assetVersion.slice(0, 7);
if (parseInt(assetVersion, 10) <= parseInt(currentUnityVersion, 10)) {
// 2022.3.6f1 2022 03 06 000
// 2019.4.31f1 2019 04 31 000
// 5.3.4p1 5 03 04 010
// 2019.4.31f1c1 is a thing
var array = API.cachedConfig.sdkUnityVersion.split('.');
if (array.length < 3) {
console.error('Invalid cachedConfig.sdkUnityVersion');
return false;
}
var currentUnityVersion = array[0];
currentUnityVersion += array[1].padStart(2, '0');
var indexFirstLetter = array[2].search(/[a-zA-Z]/);
if (indexFirstLetter > -1) {
currentUnityVersion += array[2]
.substr(0, indexFirstLetter)
.padStart(2, '0');
currentUnityVersion += '0';
var letter = array[2].substr(indexFirstLetter, 1);
if (letter === 'p') {
currentUnityVersion += '1';
} else {
// f
currentUnityVersion += '0';
}
currentUnityVersion += '0';
} else {
// just in case
currentUnityVersion += '000';
}
// just in case
currentUnityVersion = currentUnityVersion.replace(/\D/g, '');
if (
parseInt(unitySortNumber, 10) <= parseInt(currentUnityVersion, 10)
) {
return true;
}
return false;
@@ -30927,7 +31046,7 @@ speechSynthesis.getVoices();
}
if (
unityPackage.platform === 'standalonewindows' &&
this.compareUnityVersion(unityPackage.unityVersion)
this.compareUnityVersion(unityPackage.unitySortNumber)
) {
assetUrl = unityPackage.assetUrl;
break;

View File

@@ -642,12 +642,15 @@ html
el-tag.x-link(v-if="worldDialog.inCache" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px" @click="openFolderGeneric(worldDialog.cachePath)")
span(v-text="worldDialog.cacheSize")
| {{ $t('dialog.world.tags.cache')}}
div
el-tag(v-if="worldDialog.ref.tags?.includes('content_horror')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.world.tags.content_horror') }}
el-tag(v-if="worldDialog.ref.tags?.includes('content_gore')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.world.tags.content_gore') }}
el-tag(v-if="worldDialog.ref.tags?.includes('content_violence')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.world.tags.content_violence') }}
el-tag(v-if="worldDialog.ref.tags?.includes('content_adult')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.world.tags.content_adult') }}
el-tag(v-if="worldDialog.ref.tags?.includes('content_sex')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.world.tags.content_sex') }}
div
template(v-for="tag in worldDialog.ref.tags")
el-tag(v-if="tag.startsWith('content_')" :key="tag" effect="plain" size="mini" style="margin-right:5px;margin-top:5px")
template(v-if="tag === 'content_horror'") {{ $t('dialog.world.tags.content_horror') }}
template(v-else-if="tag === 'content_gore'") {{ $t('dialog.world.tags.content_gore') }}
template(v-else-if="tag === 'content_violence'") {{ $t('dialog.world.tags.content_violence') }}
template(v-else-if="tag === 'content_adult'") {{ $t('dialog.world.tags.content_adult') }}
template(v-else-if="tag === 'content_sex'") {{ $t('dialog.world.tags.content_sex') }}
template(v-else) {{ tag.replace('content_', '') }}
div(style="margin-top:5px")
span(v-show="worldDialog.ref.name !== worldDialog.ref.description" v-text="worldDialog.ref.description" style="font-size:12px")
div(style="flex:none;margin-left:10px")
@@ -847,11 +850,14 @@ html
span(v-text="avatarDialog.cacheSize")
| {{ $t('dialog.avatar.tags.cache') }}
div
el-tag(v-if="avatarDialog.ref.tags?.includes('content_horror')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.content_horror') }}
el-tag(v-if="avatarDialog.ref.tags?.includes('content_gore')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.content_gore') }}
el-tag(v-if="avatarDialog.ref.tags?.includes('content_violence')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.content_violence') }}
el-tag(v-if="avatarDialog.ref.tags?.includes('content_adult')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.content_adult') }}
el-tag(v-if="avatarDialog.ref.tags?.includes('content_sex')" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.content_sex') }}
template(v-for="tag in avatarDialog.ref.tags")
el-tag(v-if="tag.startsWith('content_')" :key="tag" effect="plain" size="mini" style="margin-right:5px;margin-top:5px")
template(v-if="tag === 'content_horror'") {{ $t('dialog.avatar.tags.content_horror') }}
template(v-else-if="tag === 'content_gore'") {{ $t('dialog.avatar.tags.content_gore') }}
template(v-else-if="tag === 'content_violence'") {{ $t('dialog.avatar.tags.content_violence') }}
template(v-else-if="tag === 'content_adult'") {{ $t('dialog.avatar.tags.content_adult') }}
template(v-else-if="tag === 'content_sex'") {{ $t('dialog.avatar.tags.content_sex') }}
template(v-else) {{ tag.replace('content_', '') }}
div(style="margin-top:5px")
span(v-show="avatarDialog.ref.name !== avatarDialog.ref.description" v-text="avatarDialog.ref.description" style="font-size:12px")
div(style="flex:none;margin-left:10px")
@@ -1639,16 +1645,17 @@ html
//- dialog: Set Avatar Tags
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="setAvatarTagsDialog" :visible.sync="setAvatarTagsDialog.visible" :title="$t('dialog.set_avatar_tags.header')" width="770px")
template(v-if="setAvatarTagsDialog.visible")
el-checkbox(v-model="setAvatarTagsDialog.contentHorror") {{ $t('dialog.set_avatar_tags.content_horror') }}
el-checkbox(v-model="setAvatarTagsDialog.contentHorror" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_horror') }}
br
el-checkbox(v-model="setAvatarTagsDialog.contentGore") {{ $t('dialog.set_avatar_tags.content_gore') }}
el-checkbox(v-model="setAvatarTagsDialog.contentGore" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_gore') }}
br
el-checkbox(v-model="setAvatarTagsDialog.contentViolence") {{ $t('dialog.set_avatar_tags.content_violence') }}
el-checkbox(v-model="setAvatarTagsDialog.contentViolence" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_violence') }}
br
el-checkbox(v-model="setAvatarTagsDialog.contentAdult") {{ $t('dialog.set_avatar_tags.content_adult') }}
el-checkbox(v-model="setAvatarTagsDialog.contentAdult" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_adult') }}
br
el-checkbox(v-model="setAvatarTagsDialog.contentSex") {{ $t('dialog.set_avatar_tags.content_sex') }}
el-checkbox(v-model="setAvatarTagsDialog.contentSex" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_sex') }}
br
el-input(v-model="setAvatarTagsDialog.selectedTagsCsv" @input="updateInputAvatarTags" size="mini" :autosize="{ minRows:2, maxRows:5 }" :placeholder="$t('dialog.set_avatar_tags.custom_tags_placeholder')" style="margin-top:10px")
template(v-if="setAvatarTagsDialog.ownAvatars.length === setAvatarTagsDialog.selectedCount")
el-button(size="small" @click="setAvatarTagsSelectToggle") {{ $t('dialog.set_avatar_tags.select_none') }}
template(v-else)
@@ -1881,6 +1888,8 @@ html
el-radio-button(label="Friends") {{ $t('dialog.shared_feed_filters.friends') }}
.toggle-item
span.toggle-name Group Change
el-tooltip(placement="top" style="margin-left:5px" content="When you've left or been kicked from a group, group name changed, group owner changed, role added/removed")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.noty.groupChange" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
@@ -1891,16 +1900,22 @@ html
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Group Join
el-tooltip(placement="top" style="margin-left:5px" content="When your request to join a group has been approved")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.noty['group.informative']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Group Invite
el-tooltip(placement="top" style="margin-left:5px" content="When someone invites you to join a group")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.noty['group.invite']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Group Join Request
el-tooltip(placement="top" style="margin-left:5px" content="When someone requests to join a group you're a moderator for")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.noty['group.joinRequest']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
@@ -1916,6 +1931,8 @@ html
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Instance Closed
el-tooltip(placement="top" style="margin-left:5px" content="When the instance you're in has been closed preventing anyone from joining")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.noty['instance.closed']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
@@ -1928,6 +1945,8 @@ html
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Miscellaneous Events
el-tooltip(placement="top" style="margin-left:5px" content="Misc event from VRC game log: VRC crash auto rejoin, shader keyword limit, joining instance blocked by master, error loading video, audio device changed, error joining instance, kicked from instance, VRChat failing to start OSC server, etc...")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.noty.Event" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
@@ -2118,6 +2137,8 @@ html
el-radio-button(label="Friends") {{ $t('dialog.shared_feed_filters.friends') }}
.toggle-item
span.toggle-name Group Change
el-tooltip(placement="top" style="margin-left:5px" content="When you've left or been kicked from a group, group name changed, group owner changed, role added/removed")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.wrist.groupChange" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
@@ -2128,16 +2149,22 @@ html
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Group Join
el-tooltip(placement="top" style="margin-left:5px" content="When your request to join a group has been approved")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.wrist['group.informative']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Group Invite
el-tooltip(placement="top" style="margin-left:5px" content="When someone invites you to join a group")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.wrist['group.invite']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Group Join Request
el-tooltip(placement="top" style="margin-left:5px" content="When someone requests to join a group you're a moderator for")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.wrist['group.joinRequest']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
@@ -2153,6 +2180,8 @@ html
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Instance Closed
el-tooltip(placement="top" style="margin-left:5px" content="When the instance you're in has been closed preventing anyone from joining")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.wrist['instance.closed']" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
@@ -2165,6 +2194,8 @@ html
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}
.toggle-item
span.toggle-name Miscellaneous Events
el-tooltip(placement="top" style="margin-left:5px" content="Misc event from VRC game log: VRC crash auto rejoin, shader keyword limit, joining instance blocked by master, error loading video, audio device changed, error joining instance, kicked from instance, VRChat failing to start OSC server, etc...")
i.el-icon-info
el-radio-group(v-model="sharedFeedFilters.wrist.Event" size="mini" @change="saveSharedFeedFilters")
el-radio-button(label="Off") {{ $t('dialog.shared_feed_filters.off') }}
el-radio-button(label="On") {{ $t('dialog.shared_feed_filters.on') }}

View File

@@ -217,9 +217,10 @@
"header": "Favorite Friends",
"group_placeholder": "Choose Groups"
},
"game_log": {
"header": "Game Log",
"resource_load": "Log Udon string/image load"
"logging": {
"header": "Logging",
"resource_load": "Log Udon string/image load",
"empty_avatar": "Log avatars in feed without names"
},
"automation": {
"header": "Automation",
@@ -1031,6 +1032,7 @@
"content_violence": "Violence",
"content_adult": "Adult",
"content_sex": "Sexual",
"custom_tags_placeholder": "Custom tags",
"select_all": "Select All",
"select_none": "Select None",
"cancel": "Cancel",

View File

@@ -29,13 +29,21 @@ mixin feedTab()
location(v-if="scope.row.location" :location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName")
template(v-else-if="scope.row.type === 'Avatar'")
el-popover(placement="right" width="500px" trigger="click")
img.x-link(slot="reference" v-lazy="scope.row.previousCurrentAvatarThumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px")
img.x-link(v-lazy="scope.row.previousCurrentAvatarImageUrl" style="width:500px;height:375px" @click="showAvatarAuthorDialog(scope.row.userId, '', scope.row.previousCurrentAvatarImageUrl)")
span(style="position:relative;top:-50px;margin:0 5px")
div(slot="reference" style="display:inline-block;vertical-align:top;width:160px")
template(v-if="scope.row.previousCurrentAvatarThumbnailImageUrl")
img.x-link(v-lazy="scope.row.previousCurrentAvatarImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px")
br
avatar-info(:imageurl="scope.row.previousCurrentAvatarImageUrl" :userid="scope.row.userId" :hintownerid="scope.row.previousOwnerId" :hintavatarname="scope.row.previousAvatarName" :avatartags="scope.row.previousCurrentAvatarTags")
img.x-link(v-lazy="scope.row.previousCurrentAvatarImageUrl" style="width:500px;height:375px" @click="showFullscreenImageDialog(scope.row.previousCurrentAvatarImageUrl)")
span(style="position:relative;vertical-align:top;margin:0 5px")
i.el-icon-right
el-popover(placement="right" width="500px" trigger="click")
img.x-link(slot="reference" v-lazy="scope.row.currentAvatarThumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px")
img.x-link(v-lazy="scope.row.currentAvatarImageUrl" style="width:500px;height:375px" @click="showAvatarAuthorDialog(scope.row.userId, '', scope.row.currentAvatarImageUrl)")
div(slot="reference" style="display:inline-block;vertical-align:top;width:160px")
template(v-if="scope.row.currentAvatarThumbnailImageUrl")
img.x-link(v-lazy="scope.row.currentAvatarThumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px")
br
avatar-info(:imageurl="scope.row.currentAvatarThumbnailImageUrl" :userid="scope.row.userId" :hintownerid="scope.row.ownerId" :hintavatarname="scope.row.avatarName" :avatartags="scope.row.currentAvatarTags")
img.x-link(v-lazy="scope.row.currentAvatarImageUrl" style="width:500px;height:375px" @click="showFullscreenImageDialog(scope.row.currentAvatarImageUrl)")
template(v-else-if="scope.row.type === 'Status'")
el-tooltip(placement="top")
template(#content)

View File

@@ -93,8 +93,14 @@ mixin settingsTab()
.detail
span.name(v-text="group.displayName ? group.displayName : group.name")
//- General | Game Log
+simpleSettingsCategory("view.settings.general.game_log.header")
+simpleSwitch("view.settings.general.game_log.resource_load", "logResourceLoad", "saveGameLogOptions")
div.options-container
span.header {{ $t('view.settings.general.logging.header') }}
div.options-container-item
span.name(style="min-width:225px") {{ $t('view.settings.general.logging.resource_load') }}
el-switch(v-model="logResourceLoad" @change="saveLoggingOptions")
div.options-container-item
span.name(style="min-width:225px") {{ $t('view.settings.general.logging.empty_avatar') }}
el-switch(v-model="logEmptyAvatars" @change="saveLoggingOptions")
//- General | Automation
+simpleSettingsCategory("view.settings.general.automation.header")
+simpleRadioGroupWithTooltip("view.settings.general.automation.auto_state_change", "$t('view.settings.general.automation.auto_state_change_tooltip')", "autoStateChange", [
@@ -317,6 +323,8 @@ mixin settingsTab()
//- Wrist Overlay | SteamVR Wrist Overlay
div.options-container(style="margin-top:0")
span.header {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.header') }}
div.options-container-item
el-button(size="small" icon="el-icon-notebook-2" @click="showWristFeedFiltersDialog" :disabled="!openVR || !overlayWrist") {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.wrist_feed_filters') }}
div.options-container-item
span {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.description') }}
br
@@ -364,8 +372,6 @@ mixin settingsTab()
div.options-container-item
span.name {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.show_pc_uptime') }}
el-switch(v-model="pcUptimeOnFeed" @change="saveOpenVROption" :disabled="!openVR || !overlayWrist")
div.options-container-item
el-button(size="small" icon="el-icon-notebook-2" @click="showWristFeedFiltersDialog" :disabled="!openVR || !overlayWrist") {{ $t('view.settings.wrist_overlay.steamvr_wrist_overlay.wrist_feed_filters') }}
//- Discord Presence Tab
el-tab-pane(:label="$t('view.settings.category.discord_presence')")
div.options-container(style="margin-top:0")

View File

@@ -321,6 +321,12 @@ button {
border-left: 1px solid rgba(0, 0, 0, 0);
}
.el-radio-button.is-disabled .el-radio-button__inner {
background-color: unset;
border-color: unset;
border: 1px solid #666666;
}
.el-button {
color: #fff;
}