diff --git a/Dotnet/LogWatcher.cs b/Dotnet/LogWatcher.cs index cf1d9a99..fc4987dc 100644 --- a/Dotnet/LogWatcher.cs +++ b/Dotnet/LogWatcher.cs @@ -1157,7 +1157,7 @@ namespace VRCX { // 2023.09.26 04:12:57 Warning - Could not Start OSC: Address already in use - if (string.Compare(line, offset, "VRChat could not start OSC server: ", 0, 21, StringComparison.Ordinal) != 0) + if (string.Compare(line, offset, "VRChat could not start OSC server, TLDR: delete install.exe (https://vrchat.canny.io/bug-reports/p/installexe-breaks-osc-port-binding): ", 0, 21, StringComparison.Ordinal) != 0) return false; AppendLog(new[] diff --git a/html/src/app.js b/html/src/app.js index d6f33f3a..2f54ab5c 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -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; diff --git a/html/src/index.pug b/html/src/index.pug index ec74fc72..5e36c882 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -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') }} diff --git a/html/src/localization/en/en.json b/html/src/localization/en/en.json index 253b7b8f..3b0fb775 100644 --- a/html/src/localization/en/en.json +++ b/html/src/localization/en/en.json @@ -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", diff --git a/html/src/mixins/tabs/feed.pug b/html/src/mixins/tabs/feed.pug index d606b8a9..6fa29c21 100644 --- a/html/src/mixins/tabs/feed.pug +++ b/html/src/mixins/tabs/feed.pug @@ -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) diff --git a/html/src/mixins/tabs/settings.pug b/html/src/mixins/tabs/settings.pug index 1c7d2df4..676955bf 100644 --- a/html/src/mixins/tabs/settings.pug +++ b/html/src/mixins/tabs/settings.pug @@ -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") diff --git a/html/src/theme.dark.scss b/html/src/theme.dark.scss index 17ae2199..efc174de 100644 --- a/html/src/theme.dark.scss +++ b/html/src/theme.dark.scss @@ -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; }