diff --git a/AppApi.cs b/AppApi.cs index 1eafba0a..dddc8b83 100644 --- a/AppApi.cs +++ b/AppApi.cs @@ -403,6 +403,11 @@ namespace VRCX return output; } + public string CurrentCulture() + { + return System.Globalization.CultureInfo.CurrentCulture.ToString(); + } + public void SetStartup(bool enabled) { try diff --git a/html/src/app.js b/html/src/app.js index d3c4f367..0fcd6869 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -172,7 +172,6 @@ speechSynthesis.getVoices(); (c) => map[c] || c ); }; - Vue.filter('formatDate', formatDate); var textToHex = function (text) { var s = String(text); @@ -11476,7 +11475,8 @@ speechSynthesis.getVoices(); notificationPosition: this.notificationPosition, notificationTimeout: this.notificationTimeout, notificationTheme, - backgroundEnabled: this.vrBackgroundEnabled + backgroundEnabled: this.vrBackgroundEnabled, + dtHour12: this.dtHour12 }; var json = JSON.stringify(VRConfigVars); AppApi.ExecuteVrFeedFunction('configUpdate', json); @@ -18659,6 +18659,51 @@ speechSynthesis.getVoices(); }); }; + $app.data.dtHour12 = configRepository.getBool('VRCX_dtHour12'); + $app.methods.setDatetimeFormat = async function () { + var currentCulture = await AppApi.CurrentCulture(); + var hour12 = configRepository.getBool('VRCX_dtHour12'); + if (typeof this.dtHour12 !== 'undefined') { + if (hour12 !== this.dtHour12) { + configRepository.setBool('VRCX_dtHour12', this.dtHour12); + this.updateVRConfigVars(); + } + var hour12 = this.dtHour12; + } + var formatDate1 = function (date, format) { + if (!date) { + return '-'; + } + var dt = new Date(date); + if (format === 'long') { + return dt.toLocaleDateString(currentCulture, { + month: '2-digit', + day: '2-digit', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12 + }); + } else if (format === 'short') { + return dt + .toLocaleDateString(currentCulture, { + month: '2-digit', + day: '2-digit', + hour: 'numeric', + minute: 'numeric', + hour12 + }) + .replace(' AM', 'am') + .replace(' PM', 'pm') + .replace(',', ''); + } + return '-'; + }; + Vue.filter('formatDate', formatDate1); + }; + $app.methods.setDatetimeFormat(); + $app = new Vue($app); window.$app = $app; })(); diff --git a/html/src/index.pug b/html/src/index.pug index bbed924a..ba8451dd 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -116,11 +116,11 @@ html .x-friend-item(style="cursor:default") .detail span.name Last Updated - span.extra {{ currentInstanceWorld.updated_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ currentInstanceWorld.updated_at | formatDate('long') }} .x-friend-item(style="cursor:default") .detail span.name Created - span.extra {{ currentInstanceWorld.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ currentInstanceWorld.created_at | formatDate('long') }} div.current-instance-table data-tables(v-bind="currentInstanceUserList" @row-click="selectCurrentInstanceRow" style="margin-top:10px;cursor:pointer") el-table-column(label="Avatar" width="60" prop="photo") @@ -184,12 +184,12 @@ html el-tabs(type="card") el-tab-pane(label="Current") data-tables(v-bind="photonEventTable" style="margin-bottom:10px") - el-table-column(label="Date" prop="created_at" width="90") + el-table-column(label="Date" prop="created_at" width="110") template(v-once #default="scope") el-tooltip(placement="right") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="Name" prop="photonId" width="160") template(v-once #default="scope") span.x-link(v-text="scope.row.displayName" @click="showUserFromPhotonId(scope.row.photonId)" style="padding-right:10px") @@ -206,12 +206,12 @@ html span(v-else v-text="scope.row.text") el-tab-pane(label="Previous") data-tables(v-bind="photonEventTablePrevious" style="margin-bottom:10px") - el-table-column(label="Date" prop="created_at" width="90") + el-table-column(label="Date" prop="created_at" width="110") template(v-once #default="scope") el-tooltip(placement="right") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="Name" prop="photonId" width="160") template(v-once #default="scope") span.x-link(v-text="scope.row.displayName" @click="lookupUser(scope.row)" style="padding-right:10px") @@ -287,12 +287,12 @@ html span(v-else) Offline i.x-user-status(:class="statusClass(scope.row.status)") span(v-text="scope.row.statusDescription") - el-table-column(label="Date" prop="created_at" sortable="custom" width="90") + el-table-column(label="Date" prop="created_at" sortable="custom" width="110") template(v-once #default="scope") el-tooltip(placement="right") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="Type" prop="type" width="70") el-table-column(label="User" prop="displayName" width="180") template(v-once #default="scope") @@ -347,12 +347,12 @@ html el-input(v-model="gameLogTable.search" placeholder="Search" @keyup.native.13="gameLogTableLookup" @change="gameLogTableLookup" clearable style="flex:none;width:150px;margin:0 10px") //- el-tooltip(placement="bottom" content="Reload game log" :disabled="hideTooltips") //- el-button(type="default" @click="resetGameLog" icon="el-icon-refresh" circle style="flex:none") - el-table-column(label="Date" prop="created_at" sortable="custom" width="90") + el-table-column(label="Date" prop="created_at" sortable="custom" width="110") template(v-once #default="scope") el-tooltip(placement="right") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="Type" prop="type" width="120") template(v-once #default="scope") span.x-link(v-if="scope.row.location && scope.row.type !== 'Location'" v-text="scope.row.type" @click="showWorldDialog(scope.row.location)") @@ -546,12 +546,12 @@ html el-select(v-model="friendLogTable.filters[0].value" @change="saveTableFilters" multiple clearable collapse-tags style="flex:1" placeholder="Filter") el-option(v-once v-for="type in ['Friend', 'Unfriend', 'FriendRequest', 'CancelFriendRequest', 'DisplayName', 'TrustLevel']" :key="type" :label="type" :value="type") el-input(v-model="friendLogTable.filters[1].value" placeholder="Search" style="flex:none;width:150px;margin-left:10px") - el-table-column(label="Date" prop="created_at" sortable="custom" width="100") + el-table-column(label="Date" prop="created_at" sortable="custom" width="110") template(v-once #default="scope") el-tooltip(placement="right") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="Type" prop="type" width="150") el-table-column(label="User" prop="displayName") template(v-once #default="scope") @@ -574,12 +574,12 @@ html el-input(v-model="playerModerationTable.filters[1].value" placeholder="Search" style="flex:none;width:150px;margin:0 10px") el-tooltip(placement="bottom" content="Refresh" :disabled="hideTooltips") el-button(type="default" :loading="API.isPlayerModerationsLoading" @click="API.refreshPlayerModerations()" icon="el-icon-refresh" circle style="flex:none") - el-table-column(label="Date" prop="created" sortable="custom" width="100") + el-table-column(label="Date" prop="created" sortable="custom" width="110") template(v-once #default="scope") el-tooltip(placement="right") template(#content) - span {{ scope.row.created | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created | formatDate('long') }} + span {{ scope.row.created | formatDate('short') }} el-table-column(label="Type" prop="type" width="100") el-table-column(label="Source" prop="sourceDisplayName") template(v-once #default="scope") @@ -601,12 +601,12 @@ html el-input(v-model="notificationTable.filters[1].value" placeholder="Search" style="flex:none;width:150px;margin:0 10px") el-tooltip(placement="bottom" content="Refresh" :disabled="hideTooltips") el-button(type="default" :loading="API.isNotificationsLoading" @click="API.refreshNotifications()" icon="el-icon-refresh" circle style="flex:none") - el-table-column(label="Date" prop="created_at" sortable="custom" width="100") + el-table-column(label="Date" prop="created_at" sortable="custom" width="110") template(v-once #default="scope") el-tooltip(placement="right") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="Type" prop="type" width="150") template(v-once #default="scope") el-tooltip(placement="top" v-if="scope.row.type === 'invite'") @@ -665,7 +665,7 @@ html .x-friend-item(style="cursor:default") .detail span.name Last Login - span.extra {{ API.currentUser.last_login | formatDate('YYYY-MM-DD HH24:MI:SS') }} + span.extra {{ API.currentUser.last_login | formatDate('long') }} .x-friend-item(style="cursor:default") .detail span.name Two-Factor Auth (2FA) @@ -765,7 +765,7 @@ html data-tables(v-bind="pastDisplayNameTable" style="margin-top:10px") el-table-column(label="Date" prop="updated_at" sortable="custom") template(v-once #default="scope") - span {{ scope.row.updated_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} + span {{ scope.row.updated_at | formatDate('long') }} el-table-column(label="Name" prop="displayName") div.options-container span.header Config JSON @@ -850,7 +850,11 @@ html template(v-once #default="scope") span(v-if="scope.row.$timeSpent") {{ scope.row.$timeSpent | timeToText }} el-table-column(label="Last Seen" width="170" prop="$lastSeen" sortable :sort-method="(a, b) => sortAlphabetically(a, b, '$lastSeen')") + template(v-once #default="scope") + span {{ scope.row.$timeSpent | formatDate('long') }} el-table-column(label="Last Login" width="170" prop="last_login" sortable :sort-method="(a, b) => sortAlphabetically(a, b, 'last_login')") + template(v-once #default="scope") + span {{ scope.row.last_login | formatDate('long') }} el-table-column(label="Date Joined" width="120" prop="date_joined" sortable :sort-method="(a, b) => sortAlphabetically(a, b, 'date_joined')") el-table-column(label="Unfriend" width="70" align="right") template(v-once #default="scope") @@ -1130,6 +1134,9 @@ html div.options-container-item span.name Close to tray el-switch(v-model="isCloseToTray") + div.options-container-item + span.name Time Format + el-switch(v-model="dtHour12" @change="setDatetimeFormat" inactive-text="24 Hour" active-text="12 Hour") div.options-container-item el-button-group el-button(size="small" icon="el-icon-s-operation" @click="showLaunchOptions()") Launch Options @@ -1461,7 +1468,7 @@ html .x-friend-item(style="cursor:default") .detail span.name Last Seen - span.extra {{ userDialog.lastSeen | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ userDialog.lastSeen | formatDate('long') }} .x-friend-item(@click="showPreviousInstancesUserDialog(userDialog.ref)") .detail span.name Join Count @@ -1480,7 +1487,7 @@ html .x-friend-item(style="cursor:default") .detail span.name Last Login - span.extra {{ userDialog.ref.last_login | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ userDialog.ref.last_login | formatDate('long') }} .x-friend-item(style="cursor:default") .detail span.name Date Joined @@ -1694,11 +1701,11 @@ html .x-friend-item(style="cursor:default") .detail span.name Created - span.extra {{ worldDialog.ref.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ worldDialog.ref.created_at | formatDate('long') }} .x-friend-item(style="cursor:default") .detail span.name Last Updated - span.extra {{ worldDialog.fileCreatedAt | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ worldDialog.fileCreatedAt | formatDate('long') }} .x-friend-item(style="cursor:default") .detail span.name Version @@ -1710,7 +1717,7 @@ html .x-friend-item(style="cursor:default") .detail span.name Last Visit - span.extra {{ worldDialog.lastVisit | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ worldDialog.lastVisit | formatDate('long') }} .x-friend-item(@click="showPreviousInstancesWorldDialog(worldDialog.ref)") .detail span.name Visit Count @@ -1789,11 +1796,11 @@ html .x-friend-item(style="cursor:default") .detail span.name Created - span.extra {{ avatarDialog.ref.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ avatarDialog.ref.created_at | formatDate('long') }} .x-friend-item(style="cursor:default") .detail span.name Last Updated - span.extra {{ avatarDialog.ref.updated_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + span.extra {{ avatarDialog.ref.updated_at | formatDate('long') }} .x-friend-item(style="cursor:default") .detail span.name Version @@ -2723,12 +2730,12 @@ html span(v-text="previousInstancesUserDialog.userRef.displayName" style="font-size:14px") el-input(v-model="previousInstancesUserDialogTable.filters[0].value" placeholder="Search" style="display:block;width:150px;margin-top:15px") data-tables(v-bind="previousInstancesUserDialogTable" v-loading="previousInstancesUserDialog.loading" style="margin-top:10px") - el-table-column(label="Date" prop="created_at" sortable width="90") + el-table-column(label="Date" prop="created_at" sortable width="110") template(v-once #default="scope") el-tooltip(placement="left") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="World" prop="name" sortable) template(v-once #default="scope") location(:location="scope.row.location" :hint="scope.row.name") @@ -2748,12 +2755,12 @@ html span(v-text="previousInstancesWorldDialog.worldRef.name" style="font-size:14px") el-input(v-model="previousInstancesWorldDialogTable.filters[0].value" placeholder="Search" style="display:block;width:150px;margin-top:15px") data-tables(v-bind="previousInstancesWorldDialogTable" v-loading="previousInstancesWorldDialog.loading" style="margin-top:10px") - el-table-column(label="Date" prop="created_at" sortable width="90") + el-table-column(label="Date" prop="created_at" sortable width="110") template(v-once #default="scope") el-tooltip(placement="left") template(#content) - span {{ scope.row.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') }} - span {{ scope.row.created_at | formatDate('MM-DD HH24:MI') }} + span {{ scope.row.created_at | formatDate('long') }} + span {{ scope.row.created_at | formatDate('short') }} el-table-column(label="Instance Name" prop="name") template(v-once #default="scope") span.x-link(@click="showLaunchDialog(scope.row.location)") diff --git a/html/src/vr.js b/html/src/vr.js index d12f9772..3ce59c11 100644 --- a/html/src/vr.js +++ b/html/src/vr.js @@ -39,29 +39,6 @@ Vue.component('marquee-text', MarqueeText); String(Number(n) || 0).replace(/(\d)(?=(\d{3})+(?!\d))/gu, '$1,'); Vue.filter('commaNumber', commaNumber); - var formatDate = (s, format) => { - var dt = new Date(s); - if (isNaN(dt)) { - return escapeTag(s); - } - var hours = dt.getHours(); - var map = { - YYYY: String(10000 + dt.getFullYear()).substr(-4), - MM: String(101 + dt.getMonth()).substr(-2), - DD: String(100 + dt.getDate()).substr(-2), - HH24: String(100 + hours).substr(-2), - HH: String(100 + (hours > 12 ? hours - 12 : hours)).substr(-2), - MI: String(100 + dt.getMinutes()).substr(-2), - SS: String(100 + dt.getSeconds()).substr(-2), - AMPM: hours >= 12 ? 'PM' : 'AM' - }; - return format.replace( - /YYYY|MM|DD|HH24|HH|MI|SS|AMPM/gu, - (c) => map[c] || c - ); - }; - Vue.filter('formatDate', formatDate); - var textToHex = (s) => String(s) .split('') @@ -299,6 +276,7 @@ Vue.component('marquee-text', MarqueeText); this.config = JSON.parse(json); this.hudFeed = []; this.hudTimeout = []; + this.setDatetimeFormat(); }; $app.methods.updateDownloadProgress = function (progress) { @@ -342,7 +320,19 @@ Vue.component('marquee-text', MarqueeText); $app.methods.updateStatsLoop = async function () { try { - this.currentTime = new Date().toJSON(); + this.currentTime = new Date() + .toLocaleDateString(this.currentCulture, { + month: '2-digit', + day: '2-digit', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + hour12: this.config.dtHour12 + }) + .replace(' AM', ' am') + .replace(' PM', ' pm') + .replace(',', ''); + if (!this.config.hideCpuUsageFromFeed) { var cpuUsage = await AppApi.CpuUsage(); this.cpuUsage = cpuUsage.toFixed(0); @@ -598,6 +588,27 @@ Vue.component('marquee-text', MarqueeText); this.hudTimeout = JSON.parse(json); }; + $app.data.currentCulture = await AppApi.CurrentCulture(); + + $app.methods.setDatetimeFormat = async function () { + this.currentCulture = await AppApi.CurrentCulture(); + var formatDate = function (date) { + if (!date) { + return ''; + } + var dt = new Date(date); + return dt + .toLocaleTimeString($app.currentCulture, { + hour: '2-digit', + minute: 'numeric', + hour12: $app.config.dtHour12 + }) + .replace(' am', '') + .replace(' pm', ''); + }; + Vue.filter('formatDate', formatDate); + }; + $app = new Vue($app); window.$app = $app; })(); diff --git a/html/src/vr.pug b/html/src/vr.pug index 1f4cae9f..3c950511 100644 --- a/html/src/vr.pug +++ b/html/src/vr.pug @@ -21,24 +21,24 @@ html .x-friend-item(v-if="feed.type === 'GPS'" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] #[location(:location="feed.location" :hint="feed.worldName")] div(v-else-if="feed.type === 'Offline'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] ✖️ div(v-else-if="feed.type === 'Online'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] ✔ template(v-if="feed.worldName") | #[location(:location="feed.location" :hint="feed.worldName")] div(v-else-if="feed.type === 'Status'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] template(v-if="feed.statusDescription === feed.previousStatusDescription") i.x-user-status(:class="statusClass(feed.previousStatus)") @@ -49,28 +49,28 @@ html div(v-else-if="feed.type === 'OnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ▶️ #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'OnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ◀️ #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'OnPlayerJoining'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} span.spin ▶️ span.name(v-text="feed.displayName" style="margin-left:20px") div(v-else-if="feed.type === 'Location'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} location(:location="feed.location" :hint="feed.worldName") div(v-else-if="feed.type === 'VideoPlay'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 🎵 #[span.name(v-text="feed.displayName")] template(v-if="feed.videoName") | #[span(v-text="feed.videoName")] @@ -79,130 +79,130 @@ html div(v-else-if="feed.type === 'invite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 📨 #[span.name(v-text="feed.senderUsername")] #[location(:location="feed.details.worldId" :hint="feed.details.worldName")] #[span(v-text="feed.details.inviteMessage")] div(v-else-if="feed.type === 'requestInvite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 📩 #[span.name(v-text="feed.senderUsername")] #[span(v-text="feed.details.requestMessage")] div(v-else-if="feed.type === 'inviteResponse'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 💬 #[span.name(v-text="feed.senderUsername")] #[span(v-text="feed.details.responseMessage")] div(v-else-if="feed.type === 'requestInviteResponse'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 💬 #[span.name(v-text="feed.senderUsername")] #[span(v-text="feed.details.responseMessage")] div(v-else-if="feed.type === 'friendRequest'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 💚 #[span.name(v-text="feed.senderUsername")] div(v-else-if="feed.type === 'Friend'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 💖 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'Unfriend'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 💔 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'DisplayName'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 📃 #[span.name(v-text="feed.previousDisplayName")] #[i.el-icon-right] #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'TrustLevel'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + 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 === 'PortalSpawn'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ✨ #[span.name(v-text="feed.displayName")] template(v-if="feed.worldName") | #[location(:location="feed.instanceId" :hint="feed.worldName")] div(v-else-if="feed.type === 'AvatarChange'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 🧍 #[span.name(v-text="feed.displayName")] {{ feed.name }} template(v-if="feed.description && feed.description !== feed.name") | - {{ feed.description }} div(v-else-if="feed.type === 'Event'" class="x-friend-item") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 🛑 #[span.name(v-text="feed.data")] div(v-else-if="feed.type === 'BlockedOnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ▶️ 🚫 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'BlockedOnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ◀️ 🚫 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'MutedOnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ▶️ 🔇 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'MutedOnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ◀️ 🔇 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'Blocked'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 🚫 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'Unblocked'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | ⭕ #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'Muted'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 🔇 #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'Unmuted'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | 🎤 #[span.name(v-text="feed.displayName")] template(v-else) template(v-for="feed in wristFeed") .x-friend-item(v-if="feed.type === 'GPS'" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] is in #[location(:location="feed.location" :hint="feed.worldName")] div(v-else-if="feed.type === 'Offline'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has logged out div(v-else-if="feed.type === 'Online'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has logged in template(v-if="feed.worldName") | to #[location(:location="feed.location" :hint="feed.worldName")] div(v-else-if="feed.type === 'Status'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] template(v-if="feed.statusDescription === feed.previousStatusDescription") i.x-user-status(:class="statusClass(feed.previousStatus)") @@ -213,27 +213,27 @@ html div(v-else-if="feed.type === 'OnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has joined div(v-else-if="feed.type === 'OnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has left div(v-else-if="feed.type === 'OnPlayerJoining'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] is joining div(v-else-if="feed.type === 'Location'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} location(:location="feed.location" :hint="feed.worldName") div(v-else-if="feed.type === 'VideoPlay'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] changed video to template(v-if="feed.videoName") | #[span(v-text="feed.videoName")] @@ -242,106 +242,106 @@ html div(v-else-if="feed.type === 'invite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.senderUsername")] has invited you to #[location(:location="feed.details.worldId" :hint="feed.details.worldName")] #[span(v-text="feed.details.inviteMessage")] div(v-else-if="feed.type === 'requestInvite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.senderUsername")] has requested an invite #[span(v-text="feed.details.requestMessage")] div(v-else-if="feed.type === 'inviteResponse'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.senderUsername")] has responded to your invite #[span(v-text="feed.details.responseMessage")] div(v-else-if="feed.type === 'requestInviteResponse'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.senderUsername")] has responded to your invite request #[span(v-text="feed.details.responseMessage")] div(v-else-if="feed.type === 'friendRequest'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.senderUsername")] has sent you a friend request div(v-else-if="feed.type === 'Friend'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] is now your friend div(v-else-if="feed.type === 'Unfriend'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] is no longer your friend div(v-else-if="feed.type === 'DisplayName'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.previousDisplayName")] changed their name to #[span.name(v-text="feed.displayName")] div(v-else-if="feed.type === 'TrustLevel'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] trust level is now {{ feed.trustLevel }} div(v-else-if="feed.type === 'PortalSpawn'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has spawned a portal template(v-if="feed.worldName") | to #[location(:location="feed.instanceId" :hint="feed.worldName")] div(v-else-if="feed.type === 'AvatarChange'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] changed into avatar {{ feed.name }} template(v-if="feed.description && feed.description !== feed.name") | - {{ feed.description }} div(v-else-if="feed.type === 'Event'" class="x-friend-item") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | Event: #[span.name(v-text="feed.data")] div(v-else-if="feed.type === 'BlockedOnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | Blocked user #[span.name(v-text="feed.displayName")] has joined div(v-else-if="feed.type === 'BlockedOnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | Blocked user #[span.name(v-text="feed.displayName")] has left div(v-else-if="feed.type === 'MutedOnPlayerJoined'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | Muted user #[span.name(v-text="feed.displayName")] has joined div(v-else-if="feed.type === 'MutedOnPlayerLeft'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | Muted user #[span.name(v-text="feed.displayName")] has left div(v-else-if="feed.type === 'Blocked'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has blocked you div(v-else-if="feed.type === 'Unblocked'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has unblocked you div(v-else-if="feed.type === 'Muted'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has muted you div(v-else-if="feed.type === 'Unmuted'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") .detail span.extra - span.time {{ feed.created_at | formatDate('HH:MI') }} + span.time {{ feed.created_at | formatDate }} | #[span.name(v-text="feed.displayName")] has unmuted you .x-containerbottom div(style="display:flex;flex-direction:row") @@ -409,7 +409,7 @@ html span(style="display:inline-block;font-weight:bold") {{ lastLocation.friendList.length !== 0 ? `‎‎‎‎‎‎‎‎‏‏‎ ‎(${lastLocation.friendList.length})` : ''}} span(v-if="photonLobbyBotSize > 0 && lastLocation.playerList.length > 0" style="display:inline-block;color:red;margin-left:5px") {{ photonLobbyBotSize }} br - span(style="float:right") {{ currentTime | formatDate('YYYY-MM-DD HH:MI:SS AMPM') }} + span(style="float:right") {{ currentTime }} span(v-if="config && !config.hideCpuUsageFromFeed" style="display:inline-block;margin-right:5px") CPU: {{ cpuUsage }}% span(style="display:inline-block") Online: {{ onlineFriendCount }} template(v-else)