* 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 setterpull/2079/head
@@ -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 => | |||||
throw new NotSupportedException(); | |||||
internal override SocketGlobalUser GlobalUser { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } | |||||
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 => | |||||
throw new NotSupportedException(); | |||||
internal override SocketGlobalUser GlobalUser { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } | |||||
internal SocketWebhookUser(SocketGuild guild, ulong id, ulong webhookId) | internal SocketWebhookUser(SocketGuild guild, ulong id, ulong webhookId) | ||||
: base(guild.Discord, id) | : base(guild.Discord, id) | ||||