diff --git a/Dotnet/AppApi/XSOverlay.cs b/Dotnet/AppApi/XSOverlay.cs index f5cbc3d7e..5012c915c 100644 --- a/Dotnet/AppApi/XSOverlay.cs +++ b/Dotnet/AppApi/XSOverlay.cs @@ -25,15 +25,12 @@ public void XSNotification(string title, string content, int timeout, string ima } var height = 110f; - if (content.Length > 100) { - height += 90f; - } - if (content.Length > 200) { - height += 75f; - } - if (content.Length > 300) { - height += 155f; - } + if (content.Length > 300) + height = 250f; + else if (content.Length > 200) + height = 200f; + else if (content.Length > 100) + height = 150f; var msg = new XSOMessage { diff --git a/html/src/app.js b/html/src/app.js index 7f48c4862..d6f33f3ad 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -156,6 +156,19 @@ speechSynthesis.getVoices(); return false; }; + var arraysMatch = function (a, b) { + if (!Array.isArray(a) || !Array.isArray(b)) { + return false; + } + return ( + a.length === b.length && + a.every( + (element, index) => + JSON.stringify(element) === JSON.stringify(b[index]) + ) + ); + }; + var escapeTag = function (tag) { var s = String(tag); return s.replace(/["&'<>]/g, (c) => `&#${c.charCodeAt(0)};`); @@ -1206,17 +1219,23 @@ speechSynthesis.getVoices(); Vue.component('avatar-info', { template: - '
{{ avatarName }}{{ avatarType }}
', + '
' + + '{{ avatarName }}' + + '{{ avatarType }}' + + '{{ avatarTags }}' + + '
', props: { imageurl: String, userid: String, hintownerid: String, - hintavatarname: String + hintavatarname: String, + avatartags: Array }, data() { return { avatarName: this.avatarName, avatarType: this.avatarType, + avatarTags: this.avatarTags, color: this.color }; }, @@ -1226,9 +1245,9 @@ speechSynthesis.getVoices(); this.avatarName = ''; this.avatarType = ''; this.color = ''; + this.avatarTags = ''; if (!this.imageurl) { this.avatarName = '-'; - return; } else if (this.hintownerid) { this.avatarName = this.hintavatarname; this.ownerId = this.hintownerid; @@ -1251,6 +1270,20 @@ speechSynthesis.getVoices(); this.color = 'avatar-info-public'; this.avatarType = '(public)'; } + if (typeof this.avatartags === 'object') { + var tagString = ''; + for (var i = 0; i < this.avatartags.length; i++) { + var tagName = this.avatartags[i].replace( + 'content_', + '' + ); + tagString += tagName; + if (i < this.avatartags.length - 1) { + tagString += ', '; + } + } + this.avatarTags = tagString; + } }, confirm() { if (!this.imageurl) { @@ -1269,6 +1302,9 @@ speechSynthesis.getVoices(); }, userid() { this.parse(); + }, + avatartags() { + this.parse(); } }, mounted() { @@ -1380,9 +1416,11 @@ speechSynthesis.getVoices(); this.applyUser({ allowAvatarCopying: json.allowAvatarCopying, + badges: json.badges, bio: json.bio, bioLinks: json.bioLinks, currentAvatarImageUrl: json.currentAvatarImageUrl, + currentAvatarTags: json.currentAvatarTags, currentAvatarThumbnailImageUrl: json.currentAvatarThumbnailImageUrl, date_joined: json.date_joined, developerType: json.developerType, @@ -1707,6 +1745,7 @@ speechSynthesis.getVoices(); accountDeletionLog: null, activeFriends: [], allowAvatarCopying: false, + badges: [], bio: '', bioLinks: [], currentAvatar: '', @@ -1875,9 +1914,11 @@ speechSynthesis.getVoices(); if (typeof ref === 'undefined') { ref = { allowAvatarCopying: false, + badges: [], bio: '', bioLinks: [], currentAvatarImageUrl: '', + currentAvatarTags: [], currentAvatarThumbnailImageUrl: '', date_joined: '', developerType: '', @@ -1939,7 +1980,10 @@ speechSynthesis.getVoices(); } if (ref.location === 'traveling') { ref.$location = this.parseLocation(ref.travelingToLocation); - if (!this.currentTravelers.has(ref.id)) { + if ( + !this.currentTravelers.has(ref.id) && + ref.travelingToLocation + ) { var travelRef = { created_at: new Date().toJSON(), ...ref @@ -2003,7 +2047,11 @@ speechSynthesis.getVoices(); } } for (var prop in ref) { - if (ref[prop] !== Object(ref[prop])) { + if (Array.isArray(ref[prop])) { + if (!arraysMatch(ref[prop], $ref[prop])) { + props[prop] = true; + } + } else if (ref[prop] !== Object(ref[prop])) { props[prop] = true; } } @@ -10171,14 +10219,17 @@ speechSynthesis.getVoices(); $app.updateFriendGPS(ref.id); } if ( - (props.currentAvatarImageUrl || + ((props.currentAvatarImageUrl || props.currentAvatarThumbnailImageUrl) && - !ref.profilePicOverride + !ref.profilePicOverride) || + props.currentAvatarTags ) { var currentAvatarImageUrl = ''; var previousCurrentAvatarImageUrl = ''; var currentAvatarThumbnailImageUrl = ''; var previousCurrentAvatarThumbnailImageUrl = ''; + var currentAvatarTags = ''; + var previousCurrentAvatarTags = ''; if (props.currentAvatarImageUrl) { currentAvatarImageUrl = props.currentAvatarImageUrl[0]; previousCurrentAvatarImageUrl = props.currentAvatarImageUrl[1]; @@ -10197,6 +10248,21 @@ speechSynthesis.getVoices(); previousCurrentAvatarThumbnailImageUrl = ref.currentAvatarThumbnailImageUrl; } + if (props.currentAvatarTags) { + currentAvatarTags = props.currentAvatarTags[0]; + previousCurrentAvatarTags = props.currentAvatarTags[1]; + if ( + ref.profilePicOverride && + !props.currentAvatarThumbnailImageUrl + ) { + // forget last seen avatar + ref.currentAvatarImageUrl = ''; + ref.currentAvatarThumbnailImageUrl = ''; + } + } else { + currentAvatarTags = ref.currentAvatarTags; + previousCurrentAvatarTags = ref.currentAvatarTags; + } var avatarInfo = { ownerId: '', avatarName: '' @@ -10214,7 +10280,9 @@ speechSynthesis.getVoices(); currentAvatarImageUrl, currentAvatarThumbnailImageUrl, previousCurrentAvatarImageUrl, - previousCurrentAvatarThumbnailImageUrl + previousCurrentAvatarThumbnailImageUrl, + currentAvatarTags, + previousCurrentAvatarTags }; $app.addFeed(feed); database.addAvatarToDatabase(feed); @@ -11909,6 +11977,11 @@ speechSynthesis.getVoices(); } } else if (data.Parameters[245]['0'] === 13) { var msg = data.Parameters[245]['2']; + if (typeof msg === 'string') { + var displayName = + data.Parameters[254]['14']?.targetDisplayName; + msg = msg.replace('{{targetDisplayName}}', displayName); + } this.addEntryPhotonEvent({ photonId, text: msg, @@ -20231,10 +20304,10 @@ speechSynthesis.getVoices(); }; $app.methods.selfInvite = function (location, shortName) { - var L = API.parseLocation(location); - if (L.isOffline || L.isTraveling || !L.worldId) { + if (!this.isRealInstance(location)) { return; } + var L = API.parseLocation(location); API.selfInvite({ instanceId: L.instanceId, worldId: L.worldId, diff --git a/html/src/index.pug b/html/src/index.pug index 7bf288b64..ec74fc726 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -364,7 +364,7 @@ html span.name(v-if="userDialog.id !== API.currentUser.id && userDialog.ref.profilePicOverride && userDialog.ref.currentAvatarImageUrl") {{ $t('dialog.user.info.avatar_info_last_seen') }} span.name(v-else) {{ $t('dialog.user.info.avatar_info') }} .extra - avatar-info(:imageurl="userDialog.ref.currentAvatarImageUrl" :userid="userDialog.id") + avatar-info(:imageurl="userDialog.ref.currentAvatarImageUrl" :userid="userDialog.id" :avatartags="userDialog.ref.currentAvatarTags") .x-friend-item(style="width:100%;cursor:default") .detail span.name {{ $t('dialog.user.info.represented_group') }} diff --git a/html/src/mixins/tabs/feed.pug b/html/src/mixins/tabs/feed.pug index 4a08fca9e..d606b8a92 100644 --- a/html/src/mixins/tabs/feed.pug +++ b/html/src/mixins/tabs/feed.pug @@ -111,6 +111,6 @@ mixin feedTab() span ‎ span(v-text="scope.row.statusDescription") template(v-else-if="scope.row.type === 'Avatar'") - avatar-info(:imageurl="scope.row.currentAvatarImageUrl" :userid="scope.row.userId" :hintownerid="scope.row.ownerId" :hintavatarname="scope.row.avatarName") + avatar-info(:imageurl="scope.row.currentAvatarImageUrl" :userid="scope.row.userId" :hintownerid="scope.row.ownerId" :hintavatarname="scope.row.avatarName" :avatartags="scope.row.currentAvatarTags") template(v-else-if="scope.row.type === 'Bio'") span(v-text="scope.row.bio")