* 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 settertags/3.3.0
| @@ -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) | ||||