diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 5225e9379..349e2714f 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1289,14 +1289,13 @@ namespace Discord.WebSocket if (user != null) { - var globalBefore = user.GlobalUser.Clone(); + var before = user.Clone(); if (user.GlobalUser.Update(State, data.User)) { //Global data was updated, trigger UserUpdated - await TimedInvokeAsync(_userUpdatedEvent, nameof(UserUpdated), globalBefore, user).ConfigureAwait(false); + await TimedInvokeAsync(_userUpdatedEvent, nameof(UserUpdated), before.GlobalUser, user).ConfigureAwait(false); } - var before = user.Clone(); user.Update(State, data); var cacheableBefore = new Cacheable(before, user.Id, true, () => null); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs index 525ae0b34..236e7d432 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs @@ -1,3 +1,4 @@ +using System; using System.Diagnostics; using System.Linq; using Model = Discord.API.User; @@ -14,7 +15,7 @@ namespace Discord.WebSocket internal override SocketPresence Presence { get; set; } public override bool IsWebhook => false; - internal override SocketGlobalUser GlobalUser => this; + internal override SocketGlobalUser GlobalUser { get => this; set => throw new NotImplementedException(); } private readonly object _lockObj = new object(); private ushort _references; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs index fe19a41ec..d027bf0aa 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs @@ -19,7 +19,7 @@ namespace Discord.WebSocket /// public SocketGroupChannel Channel { get; } /// - internal override SocketGlobalUser GlobalUser { get; } + internal override SocketGlobalUser GlobalUser { get; set; } /// public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 1e5a98aeb..8c2825bc4 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -24,7 +24,7 @@ namespace Discord.WebSocket private long? _joinedAtTicks; private ImmutableArray _roleIds; - internal override SocketGlobalUser GlobalUser { get; } + internal override SocketGlobalUser GlobalUser { get; set; } /// /// Gets the guild the user is in. /// @@ -248,7 +248,13 @@ namespace Discord.WebSocket => CDN.GetGuildUserAvatarUrl(Id, Guild.Id, GuildAvatarId, size, format); private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Guild)"; - internal new SocketGuildUser Clone() => MemberwiseClone() as SocketGuildUser; + + internal new SocketGuildUser Clone() + { + var clone = MemberwiseClone() as SocketGuildUser; + clone.GlobalUser = GlobalUser.Clone(); + return clone; + } #endregion #region IGuildUser diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs index 7b11257a3..3bde1beab 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs @@ -18,7 +18,7 @@ namespace Discord.WebSocket public bool IsVerified { get; private set; } /// public bool IsMfaEnabled { get; private set; } - internal override SocketGlobalUser GlobalUser { get; } + internal override SocketGlobalUser GlobalUser { get; set; } /// public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index ec4270c3e..24d570692 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -199,7 +199,7 @@ namespace Discord.WebSocket string IGuildUser.GetGuildAvatarUrl(ImageFormat format, ushort size) => GuildUser.GetGuildAvatarUrl(format, size); - internal override SocketGlobalUser GlobalUser => GuildUser.GlobalUser; + internal override SocketGlobalUser GlobalUser { get => GuildUser.GlobalUser; set => GuildUser.GlobalUser = value; } internal override SocketPresence Presence { get => GuildUser.Presence; set => GuildUser.Presence = value; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs index a15f7e747..99c47696a 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs @@ -29,8 +29,7 @@ namespace Discord.WebSocket internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null, null); } set { } } /// /// This field is not supported for an unknown user. - internal override SocketGlobalUser GlobalUser => - throw new NotSupportedException(); + internal override SocketGlobalUser GlobalUser { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } internal SocketUnknownUser(DiscordSocketClient discord, ulong id) : base(discord, id) diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index b14993991..35121d666 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -29,7 +29,7 @@ namespace Discord.WebSocket public abstract bool IsWebhook { get; } /// public UserProperties? PublicFlags { get; private set; } - internal abstract SocketGlobalUser GlobalUser { get; } + internal abstract SocketGlobalUser GlobalUser { get; set; } internal abstract SocketPresence Presence { get; set; } /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index cf820b80e..7d63e4e36 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -34,8 +34,7 @@ namespace Discord.WebSocket public override bool IsWebhook => true; /// internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null, null); } set { } } - internal override SocketGlobalUser GlobalUser => - throw new NotSupportedException(); + internal override SocketGlobalUser GlobalUser { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } internal SocketWebhookUser(SocketGuild guild, ulong id, ulong webhookId) : base(guild.Discord, id)