diff --git a/html/src/app.js b/html/src/app.js index 8985fa47..f2b01538 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -12033,9 +12033,9 @@ speechSynthesis.getVoices(); avatarName: '', fileCreatedAt: '' }, - lastSeen: '', joinCount: 0, - timeSpent: '' + timeSpent: 0, + lastSeen: '' }; $app.watch['userDialog.memo'] = function () { @@ -12248,7 +12248,7 @@ speechSynthesis.getVoices(); }; D.lastSeen = ''; D.joinCount = 0; - D.timeSpent = ''; + D.timeSpent = 0; API.getCachedUser({ userId }) @@ -13054,7 +13054,10 @@ speechSynthesis.getVoices(); cacheSize: 0, cacheLocked: false, lastVisit: '', - visitCount: 0 + visitCount: 0, + timeSpent: 0, + isPC: false, + isQuest: false }; API.$on('LOGOUT', function () { @@ -13153,6 +13156,9 @@ speechSynthesis.getVoices(); D.rooms = []; D.lastVisit = ''; D.visitCount = ''; + D.timeSpent = 0; + D.isPC = false; + D.isQuest = false; database.getLastVisit(D.id).then((ref) => { if (ref.worldId === D.id) { D.lastVisit = ref.created_at; @@ -13163,6 +13169,11 @@ speechSynthesis.getVoices(); D.visitCount = ref.visitCount; } }); + database.getTimeSpentInWorld(D.id).then((ref) => { + if (ref.worldId === D.id) { + D.timeSpent = ref.timeSpent; + } + }); API.getCachedWorld({ worldId: L.worldId }) @@ -13176,6 +13187,13 @@ speechSynthesis.getVoices(); D.loading = false; D.ref = args.ref; D.isFavorite = API.cachedFavoritesByObjectId.has(D.id); + for (var unityPackage of args.ref.unityPackages) { + if (unityPackage.platform === 'standalonewindows') { + D.isPC = true; + } else if (unityPackage.platform === 'android') { + D.isQuest = true; + } + } this.updateVRChatWorldCache(); if (args.cache) { API.getWorld(args.params) diff --git a/html/src/index.pug b/html/src/index.pug index 616cdb6f..c8cf6191 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -1319,6 +1319,7 @@ html div el-tag.name(type="info" effect="plain" size="mini" :class="userDialog.ref.$trustClass" v-text="userDialog.ref.$trustLevel" style="margin-right:5px;margin-top:5px") el-tag.x-tag-friend(v-if="userDialog.isFriend && userDialog.friend" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Friend No.{{userDialog.friend.no}} + el-tag.x-tag-troll(v-if="userDialog.ref.$isTroll" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Nuisance el-tag.x-tag-legendary(v-if="userDialog.ref.$isLegend" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Legend el-tag.x-tag-vip(v-if="userDialog.ref.$isModerator" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") VRChat Team el-tag.x-tag-vrcplus(v-if="userDialog.ref.$isVRCPlus" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") VRC+ @@ -1534,6 +1535,8 @@ html el-tag(v-if="worldDialog.ref.$isLabs" type="primary" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Labs el-tag(v-else-if="worldDialog.ref.releaseStatus === 'public'" type="success" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Public el-tag(v-else type="danger" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Private + el-tag.x-tag-platform-pc(v-if="worldDialog.isPC" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") PC + el-tag.x-tag-platform-quest(v-if="worldDialog.isQuest" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Quest el-tag(type="info" effect="plain" size="mini" v-text="worldDialog.fileSize" style="margin-right:5px;margin-top:5px") el-tag(v-if="worldDialog.inCache" type="info" effect="plain" size="mini" style="margin-top:5px") span(v-text="worldDialog.cacheSize") @@ -1670,6 +1673,11 @@ html .detail span.name Visit Count span.extra(v-text="worldDialog.visitCount") + .x-friend-item(style="cursor:default") + .detail + span.name Time Spent + span.extra(v-if="worldDialog.timeSpent === 0") - + span.extra(v-else) {{ worldDialog.timeSpent | timeToText }} el-tab-pane(label="JSON") el-button(type="default" @click="refreshWorldDialogTreeData()" size="mini" icon="el-icon-refresh" circle) el-tree(:data="worldDialog.treeData" style="margin-top:5px;font-size:12px") @@ -2072,7 +2080,7 @@ html el-dialog.x-dialog(ref="launchDialog" :visible.sync="launchDialog.visible" title="Launch" width="400px") div #[span(v-text="launchDialog.shortUrl" style="word-break:break-all;font-size:12px")] el-tooltip(placement="top" content="Copy to clipboard" :disabled="hideTooltips") - el-button(@click="copyInstanceUrl(launchDialog.shortUrl)" size="mini" icon="el-icon-s-order" style="margin-left:5px" circle) + el-button(v-if="launchDialog.shortUrl" @click="copyInstanceUrl(launchDialog.shortUrl)" size="mini" icon="el-icon-s-order" style="margin-left:5px" circle) div(style="margin-top:10px") #[span(v-text="launchDialog.url" style="word-break:break-all;font-size:12px")] el-tooltip(placement="top" content="Copy to clipboard" :disabled="hideTooltips") el-button(@click="copyInstanceUrl(launchDialog.url)" size="mini" icon="el-icon-s-order" style="margin-left:5px" circle) diff --git a/html/src/repository/database.js b/html/src/repository/database.js index 00ac01a3..f099e8a9 100644 --- a/html/src/repository/database.js +++ b/html/src/repository/database.js @@ -751,6 +751,20 @@ class Database { return ref; } + async getTimeSpentInWorld(input) { + var worldId = input.replaceAll("'", ''); + var ref = { + timeSpent: 0, + worldId: input + }; + await sqliteService.execute((row) => { + if (typeof row[0] === 'number') { + ref.timeSpent += row[0]; + } + }, `SELECT time FROM gamelog_location WHERE world_id = '${worldId}'`); + return ref; + } + async getLastSeen(input) { var userId = input.id.replaceAll("'", ''); var displayName = input.displayName.replaceAll("'", "''");