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)
|
if (user != null)
|
||||||
{
|
{
|
||||||
var globalBefore = user.GlobalUser.Clone();
|
var before = user.Clone();
|
||||||
if (user.GlobalUser.Update(State, data.User))
|
if (user.GlobalUser.Update(State, data.User))
|
||||||
{
|
{
|
||||||
//Global data was updated, trigger UserUpdated
|
//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);
|
user.Update(State, data);
|
||||||
|
|
||||||
var cacheableBefore = new Cacheable<SocketGuildUser, ulong>(before, user.Id, true, () => null);
|
var cacheableBefore = new Cacheable<SocketGuildUser, ulong>(before, user.Id, true, () => null);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Model = Discord.API.User;
|
using Model = Discord.API.User;
|
||||||
@@ -14,7 +15,7 @@ namespace Discord.WebSocket
|
|||||||
internal override SocketPresence Presence { get; set; }
|
internal override SocketPresence Presence { get; set; }
|
||||||
|
|
||||||
public override bool IsWebhook => false;
|
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 readonly object _lockObj = new object();
|
||||||
private ushort _references;
|
private ushort _references;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace Discord.WebSocket
|
|||||||
/// </returns>
|
/// </returns>
|
||||||
public SocketGroupChannel Channel { get; }
|
public SocketGroupChannel Channel { get; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
internal override SocketGlobalUser GlobalUser { get; }
|
internal override SocketGlobalUser GlobalUser { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } }
|
public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } }
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace Discord.WebSocket
|
|||||||
private long? _joinedAtTicks;
|
private long? _joinedAtTicks;
|
||||||
private ImmutableArray<ulong> _roleIds;
|
private ImmutableArray<ulong> _roleIds;
|
||||||
|
|
||||||
internal override SocketGlobalUser GlobalUser { get; }
|
internal override SocketGlobalUser GlobalUser { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the guild the user is in.
|
/// Gets the guild the user is in.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -248,7 +248,13 @@ namespace Discord.WebSocket
|
|||||||
=> CDN.GetGuildUserAvatarUrl(Id, Guild.Id, GuildAvatarId, size, format);
|
=> CDN.GetGuildUserAvatarUrl(Id, Guild.Id, GuildAvatarId, size, format);
|
||||||
|
|
||||||
private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id}{(IsBot ? ", Bot" : "")}, Guild)";
|
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
|
#endregion
|
||||||
|
|
||||||
#region IGuildUser
|
#region IGuildUser
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ namespace Discord.WebSocket
|
|||||||
public bool IsVerified { get; private set; }
|
public bool IsVerified { get; private set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool IsMfaEnabled { get; private set; }
|
public bool IsMfaEnabled { get; private set; }
|
||||||
internal override SocketGlobalUser GlobalUser { get; }
|
internal override SocketGlobalUser GlobalUser { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override bool IsBot { get { return GlobalUser.IsBot; } internal set { GlobalUser.IsBot = value; } }
|
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);
|
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; }
|
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 { } }
|
internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null, null); } set { } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="NotSupportedException">This field is not supported for an unknown user.</exception>
|
/// <exception cref="NotSupportedException">This field is not supported for an unknown user.</exception>
|
||||||
internal override SocketGlobalUser GlobalUser =>
|
internal override SocketGlobalUser GlobalUser { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||||
throw new NotSupportedException();
|
|
||||||
|
|
||||||
internal SocketUnknownUser(DiscordSocketClient discord, ulong id)
|
internal SocketUnknownUser(DiscordSocketClient discord, ulong id)
|
||||||
: base(discord, id)
|
: base(discord, id)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace Discord.WebSocket
|
|||||||
public abstract bool IsWebhook { get; }
|
public abstract bool IsWebhook { get; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public UserProperties? PublicFlags { get; private set; }
|
public UserProperties? PublicFlags { get; private set; }
|
||||||
internal abstract SocketGlobalUser GlobalUser { get; }
|
internal abstract SocketGlobalUser GlobalUser { get; set; }
|
||||||
internal abstract SocketPresence Presence { get; set; }
|
internal abstract SocketPresence Presence { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ namespace Discord.WebSocket
|
|||||||
public override bool IsWebhook => true;
|
public override bool IsWebhook => true;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null, null); } set { } }
|
internal override SocketPresence Presence { get { return new SocketPresence(UserStatus.Offline, null, null); } set { } }
|
||||||
internal override SocketGlobalUser GlobalUser =>
|
internal override SocketGlobalUser GlobalUser { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||||
throw new NotSupportedException();
|
|
||||||
|
|
||||||
internal SocketWebhookUser(SocketGuild guild, ulong id, ulong webhookId)
|
internal SocketWebhookUser(SocketGuild guild, ulong id, ulong webhookId)
|
||||||
: base(guild.Discord, id)
|
: base(guild.Discord, id)
|
||||||
|
|||||||
Reference in New Issue
Block a user