diff --git a/html/src/app.js b/html/src/app.js index 0fcd6869..52362421 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -110,7 +110,7 @@ speechSynthesis.getVoices(); this.Set(key, JSON.stringify(value)); }; - setInterval(function () { + workerTimers.setInterval(function () { VRCXStorage.Flush(); }, 5 * 60 * 1000); @@ -3966,7 +3966,7 @@ speechSynthesis.getVoices(); } }); - setInterval(function () { + workerTimers.setInterval(function () { for (var $timer of $timers) { $timer.update(); } @@ -4024,7 +4024,7 @@ speechSynthesis.getVoices(); } }); - setInterval(function () { + workerTimers.setInterval(function () { for (var $countDownTimer of $countDownTimers) { $countDownTimer.update(); } @@ -7606,7 +7606,6 @@ speechSynthesis.getVoices(); this.moderationEventQueue = new Map(); this.lastPortalId = ''; this.lastPortalList = new Map(); - this.portalQueue = ''; if (this.photonEventTable.data.length > 0) { this.photonEventTablePrevious.data = this.photonEventTable.data; this.photonEventTable.data = []; @@ -7988,20 +7987,7 @@ speechSynthesis.getVoices(); database.addGamelogJoinLeaveToDatabase(entry); break; case 'portal-spawn': - if (this.portalQueue === 'skip') { - this.portalQueue = ''; - return; - } else if (this.portalQueue && gameLog.userDisplayName) { - var ref = { - id: userId, - displayName: gameLog.userDisplayName - }; - this.parsePhotonPortalSpawn( - gameLog.dt, - this.portalQueue, - ref - ); - this.portalQueue = ''; + if (this.ipcEnabled && this.isGameRunning) { return; } var entry = { @@ -8101,7 +8087,6 @@ speechSynthesis.getVoices(); 'https://gist.github.com/Natsumi-sama/d280a58f08ace3da0e8fc7a9a381d44e'; $app.data.lastPortalId = ''; $app.data.lastPortalList = new Map(); - $app.data.portalQueue = ''; $app.data.moderationEventQueue = new Map(); $app.data.moderationAgainstTable = []; $app.data.photonLobby = new Map(); @@ -8750,14 +8735,11 @@ speechSynthesis.getVoices(); id: this.getUserIdFromPhotonId(senderId), displayName }; - this.portalQueue = 'skip'; this.parsePhotonPortalSpawn( gameLogDate, instanceId, ref1 ); - } else { - this.portalQueue = instanceId; } return; } else if (eventData.Type > 34) { @@ -8794,11 +8776,9 @@ speechSynthesis.getVoices(); } else { var eventVrc = ''; if (eventData.Data) { - if (Array.isArray(eventData.Data)) { - eventVrc = ` ${eventData.Data.toString()}`; - } else { - eventVrc = ` ${eventData.Data}`; - } + eventVrc = ` ${JSON.stringify( + eventData.Data + ).replace(/"([^(")"]+)":/g, '$1:')}`; } var text = `${eventData.EventType}${eventVrc}`; } @@ -9128,9 +9108,14 @@ speechSynthesis.getVoices(); oldAvatarId !== avatar.id && user.id !== API.currentUser.id ) { - var entry = { - created_at: new Date().toJSON(), - type: 'AvatarChange', + this.checkVRChatCache(avatar).then((cacheInfo) => { + var inCache = false; + if (cacheInfo[0] > 0) { + inCache = true; + } + var entry = { + created_at: new Date().toJSON(), + type: 'AvatarChange', userId: user.id, displayName: user.displayName, name: avatar.name, @@ -9146,10 +9131,12 @@ speechSynthesis.getVoices(); this.addEntryPhotonEvent({ photonId, displayName: user.displayName, - userId: user.id, - text: `ChangeAvatar ${avatar.name}`, - created_at: gameLogDate, - avatar + userId: user.id, + text: `ChangeAvatar ${avatar.name}`, + created_at: gameLogDate, + avatar, + inCache + }); }); } this.photonLobbyAvatars.set(user.id, avatar.id); @@ -9184,7 +9171,7 @@ speechSynthesis.getVoices(); var videoName = ''; var videoLength = ''; var displayName = ''; - var videoPos = 10; // video loading delay + var videoPos = 8; // video loading delay if (typeof gameLog.displayName !== 'undefined') { displayName = gameLog.displayName; } @@ -17305,6 +17292,69 @@ speechSynthesis.getVoices(); this.downloadVRChatCacheProgress(); }; + $app.methods.downloadVRChatCacheOldVersion = async function ( + worldId, + oldAssetUrl + ) { + var args = await API.getWorld({worldId}); + var ref = args.json; + var latestAssetUrl = ''; + for (var i = ref.unityPackages.length - 1; i > -1; i--) { + var unityPackage = ref.unityPackages[i]; + if ( + unityPackage.platform === 'standalonewindows' && + this.compareUnityVersion(unityPackage.unityVersion) && + !latestAssetUrl + ) { + latestAssetUrl = unityPackage.assetUrl; + break; + } + } + if (latestAssetUrl === oldAssetUrl) { + console.log('File version is latest'); + return; + } + var fileId = extractFileId(latestAssetUrl); + var fileVersion = parseInt(extractFileVersion(latestAssetUrl), 10); + var oldFileId = extractFileId(oldAssetUrl); + var oldFileVersion = parseInt(extractFileVersion(oldAssetUrl), 10); + if (!fileId) { + console.log('latestFileId invalid asset url'); + return; + } + if (!oldFileId) { + console.log('oldFileId invalid asset url'); + return; + } + var args = await API.getBundles(oldFileId); + var {versions} = args.json; + var file = ''; + for (var i = versions.length - 1; i > -1; i--) { + var version = versions[i]; + if (version.version === oldFileVersion) { + file = version.file; + break; + } + } + if (!file) { + console.log('Missing asset version'); + return; + } + var {url, md5, sizeInBytes} = file; + var cacheDir = await this.getVRChatCacheDir(); + await AssetBundleCacher.DeleteCache(cacheDir, fileId, fileVersion); + await AssetBundleCacher.DownloadCacheFile( + cacheDir, + url, + fileId, + fileVersion, + sizeInBytes, + md5, + appVersion, + false + ); + }; + $app.methods.cancelVRChatCacheDownload = function (location) { var L = API.parseLocation(location); if (L.worldId) { @@ -17465,7 +17515,8 @@ speechSynthesis.getVoices(); if ( this.isGameRunning && (this.downloadCurrent.type === 'Invite' || - this.downloadCurrent.type === 'Portal') + this.downloadCurrent.type === 'Portal' || + this.downloadCurrent.type === 'Manual') ) { var entry = { created_at: new Date().toJSON(), diff --git a/html/src/index.pug b/html/src/index.pug index ba8451dd..ba3c2403 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -1551,7 +1551,7 @@ html .x-friend-list(style="margin-top:10px;min-height:60px") .x-friend-item(v-for="avatar in userDialogAvatars" @click="showAvatarDialog(avatar.id)" class="x-friend-item-border") .avatar - img(v-lazy="avatar.thumbnailImageUrl") + img(v-if="avatar.thumbnailImageUrl" v-lazy="avatar.thumbnailImageUrl") .detail span.name(v-text="avatar.name") span.extra(v-text="avatar.releaseStatus" v-if="avatar.releaseStatus === 'public'" style="color: #67c23a;") @@ -2747,7 +2747,7 @@ html span(v-text="scope.row.timer") el-table-column(label="Action" width="60" align="right") template(v-once #default="scope") - el-button(type="text" icon="el-icon-message" size="mini" @click="showLaunchDialog(scope.row.location)") + el-button(type="text" icon="el-icon-info" size="mini" @click="showLaunchDialog(scope.row.location)") el-button(type="text" icon="el-icon-close" size="mini" @click="confirmDeleteGameLogUserInstance(scope.row)") //- dialog Table: Previous Instances World diff --git a/html/src/vr.js b/html/src/vr.js index 3ce59c11..3ae6b158 100644 --- a/html/src/vr.js +++ b/html/src/vr.js @@ -564,7 +564,7 @@ Vue.component('marquee-text', MarqueeText); }; $app.methods.addEntryHudFeed = function (json) { - var {displayName, text, color} = JSON.parse(json); + var {displayName, text, color, avatar, inCache} = JSON.parse(json); var combo = 1; this.hudFeed.forEach((item) => { if (item.displayName === displayName && item.text === text) { @@ -577,7 +577,9 @@ Vue.component('marquee-text', MarqueeText); displayName, text, combo, - color + color, + avatar, + inCache }); this.cleanHudFeed(); }; diff --git a/html/src/vr.pug b/html/src/vr.pug index 3c950511..f94b3732 100644 --- a/html/src/vr.pug +++ b/html/src/vr.pug @@ -132,7 +132,12 @@ html .detail span.extra span.time {{ feed.created_at | formatDate }} - | 🧍 #[span.name(v-text="feed.displayName")] {{ feed.name }} + | 🧍 #[span.name(v-text="feed.displayName")] + template(v-if="feed.releaseStatus === 'public'") + | #[i.x-user-status.online] + template(v-else) + | #[i.x-user-status.askme] + | {{ feed.name }} template(v-if="feed.description && feed.description !== feed.name") | - {{ feed.description }} div(v-else-if="feed.type === 'Event'" class="x-friend-item") @@ -295,7 +300,12 @@ html .detail span.extra span.time {{ feed.created_at | formatDate }} - | #[span.name(v-text="feed.displayName")] changed into avatar {{ feed.name }} + | #[span.name(v-text="feed.displayName")] changed into avatar + template(v-if="feed.releaseStatus === 'public'") + | #[i.x-user-status.online] + template(v-else) + | #[i.x-user-status.askme] + | {{ feed.name }} template(v-if="feed.description && feed.description !== feed.name") | - {{ feed.description }} div(v-else-if="feed.type === 'Event'" class="x-friend-item") @@ -418,10 +428,14 @@ html .hud-feed div(v-for="feed in hudFeed") .item #[span(v-if="feed.isMaster") 👑]{{ feed.displayName }} - span(v-if="feed.color === 'yellow'" style="color: yellow") {{ feed.text }} - span(v-else) {{ feed.text }} + span(v-if="feed.avatar") + span(style="margin-left:10px") ChangeAvatar + span(v-if="!feed.inCache" style="color:#aaa;margin-left:10px") #[i.el-icon-download] + span(v-text="feed.avatar.name" style="margin-left:10px") + span(v-else-if="feed.color === 'yellow'" style="color:yellow;margin-left:10px") {{ feed.text }} + span(v-else style="margin-left:10px") {{ feed.text }} template(v-if="feed.combo > 1") - span.combo x{{ feed.combo }} + span.combo(style="margin-left:10px") x{{ feed.combo }} .hud-timeout(v-if="hudTimeout.length > 0") .hud-timeout-feed div(v-for="feed in hudTimeout")