From 63e775855a406b7204807bd4389e48af425c57e3 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Sat, 20 Jan 2024 17:28:24 +0000 Subject: [PATCH] refactor!: don't fetch user on join. fetch lazily --- VpSharp/src/Entities/VirtualParadiseAvatar.cs | 23 ++++++++++++++----- VpSharp/src/VirtualParadiseClient.Avatars.cs | 5 ++-- .../src/VirtualParadiseClient.NativeEvents.cs | 1 - VpSharp/src/VirtualParadiseClient.cs | 2 +- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/VpSharp/src/Entities/VirtualParadiseAvatar.cs b/VpSharp/src/Entities/VirtualParadiseAvatar.cs index d7c2518..a1d05e0 100644 --- a/VpSharp/src/Entities/VirtualParadiseAvatar.cs +++ b/VpSharp/src/Entities/VirtualParadiseAvatar.cs @@ -13,6 +13,7 @@ namespace VpSharp.Entities; public sealed class VirtualParadiseAvatar : IEquatable { private readonly VirtualParadiseClient _client; + private VirtualParadiseUser? _user; internal VirtualParadiseAvatar(VirtualParadiseClient client, int session) { @@ -60,10 +61,10 @@ public sealed class VirtualParadiseAvatar : IEquatable public int Type { get; internal set; } /// - /// Gets the user associated with this avatar. + /// Gets the user ID associated with this avatar. /// - /// The user. - public VirtualParadiseUser User { get; internal set; } = null!; + /// The user ID. + public int UserId { get; internal set; } /// /// Determines if two instances are equal. @@ -150,7 +151,7 @@ public sealed class VirtualParadiseAvatar : IEquatable return true; } - return Session == other.Session && User.Equals(other.User); + return Session == other.Session && UserId.Equals(other.UserId); } /// @@ -163,10 +164,20 @@ public sealed class VirtualParadiseAvatar : IEquatable public override int GetHashCode() { // ReSharper disable NonReadonlyMemberInGetHashCode - return HashCode.Combine(Session, User); + return HashCode.Combine(Session, UserId); // ReSharper restore NonReadonlyMemberInGetHashCode } + /// + /// Gets the user associated with this avatar. + /// + /// The user. + public async Task GetUserAsync() + { + _user ??= await _client.GetUserAsync(UserId).ConfigureAwait(false); + return _user; + } + /// /// Sends a console message to the avatar with no name. /// @@ -449,6 +460,6 @@ public sealed class VirtualParadiseAvatar : IEquatable /// public override string ToString() { - return $"Avatar #{Session}; {User.Name} ({Name})"; + return $"Avatar #{Session}; User #{UserId} ({Name})"; } } diff --git a/VpSharp/src/VirtualParadiseClient.Avatars.cs b/VpSharp/src/VirtualParadiseClient.Avatars.cs index d5c3fdd..5c3f8f8 100644 --- a/VpSharp/src/VirtualParadiseClient.Avatars.cs +++ b/VpSharp/src/VirtualParadiseClient.Avatars.cs @@ -36,7 +36,7 @@ public sealed partial class VirtualParadiseClient existing.Location = avatar.Location; existing.Application = avatar.Application; existing.Type = avatar.Type; - existing.User = avatar.User; + existing.UserId = avatar.UserId; return existing; }); } @@ -62,7 +62,8 @@ public sealed partial class VirtualParadiseClient { Name = vp_string(sender, StringAttribute.AvatarName), Location = new Location(CurrentWorld!, position, rotation), - Application = new Application(applicationName, applicationVersion) + Application = new Application(applicationName, applicationVersion), + UserId = vp_int(sender, IntegerAttribute.UserId) }; } } diff --git a/VpSharp/src/VirtualParadiseClient.NativeEvents.cs b/VpSharp/src/VirtualParadiseClient.NativeEvents.cs index 9a246a7..973fe45 100644 --- a/VpSharp/src/VirtualParadiseClient.NativeEvents.cs +++ b/VpSharp/src/VirtualParadiseClient.NativeEvents.cs @@ -89,7 +89,6 @@ public sealed partial class VirtualParadiseClient private void OnAvatarAddNativeEvent(nint sender) { VirtualParadiseAvatar avatar = ExtractAvatar(sender); - avatar.User = GetUserAsync(vp_int(sender, IntegerAttribute.UserId)).ConfigureAwait(false).GetAwaiter().GetResult(); avatar = AddOrUpdateAvatar(avatar); _avatarJoined.OnNext(avatar); } diff --git a/VpSharp/src/VirtualParadiseClient.cs b/VpSharp/src/VirtualParadiseClient.cs index a88ce5e..2b3584e 100644 --- a/VpSharp/src/VirtualParadiseClient.cs +++ b/VpSharp/src/VirtualParadiseClient.cs @@ -397,7 +397,7 @@ public sealed partial class VirtualParadiseClient : IDisposable Application = _configuration.Application!, Name = $"[{_configuration.BotName}]", Location = new Location(world, Vector3d.Zero, Rotation.None), - User = CurrentUser! + UserId = CurrentUser!.Id }; if (CurrentWorld is not null)