fix: Clone being created on updated entity (#2077)
* Patch clone being created on updated entity * Clone globaluser as its not within the same instance * Clone the globaluser alongside the guilduser * Patch, non-assigned * Update user entities for globaluser setter
This commit is contained in:
@@ -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<SocketGuildUser, ulong>(before, user.Id, true, () => null);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace Discord.WebSocket
|
||||
/// </returns>
|
||||
public SocketGroupChannel Channel { get; }
|
||||
/// <inheritdoc />
|
||||
internal override SocketGlobalUser GlobalUser { get; }
|
||||
internal override SocketGlobalUser GlobalUser { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } }
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace Discord.WebSocket
|
||||
private long? _joinedAtTicks;
|
||||
private ImmutableArray<ulong> _roleIds;
|
||||
|
||||
internal override SocketGlobalUser GlobalUser { get; }
|
||||
internal override SocketGlobalUser GlobalUser { get; set; }
|
||||
/// <summary>
|
||||
/// Gets the guild the user is in.
|
||||
/// </summary>
|
||||
@@ -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
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Discord.WebSocket
|
||||
public bool IsVerified { get; private set; }
|
||||
/// <inheritdoc />
|
||||
public bool IsMfaEnabled { get; private set; }
|
||||
internal override SocketGlobalUser GlobalUser { get; }
|
||||
internal override SocketGlobalUser GlobalUser { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -29,8 +29,7 @@ namespace Discord.WebSocket
|
||||
internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null, null); } set { } }
|
||||
/// <inheritdoc />
|
||||
/// <exception cref="NotSupportedException">This field is not supported for an unknown user.</exception>
|
||||
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)
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace Discord.WebSocket
|
||||
public abstract bool IsWebhook { get; }
|
||||
/// <inheritdoc />
|
||||
public UserProperties? PublicFlags { get; private set; }
|
||||
internal abstract SocketGlobalUser GlobalUser { get; }
|
||||
internal abstract SocketGlobalUser GlobalUser { get; set; }
|
||||
internal abstract SocketPresence Presence { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -34,8 +34,7 @@ namespace Discord.WebSocket
|
||||
public override bool IsWebhook => true;
|
||||
/// <inheritdoc />
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user