Browse Source

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
tags/3.3.0
Armano den Boef GitHub 3 years ago
parent
commit
7d6f4f3b6c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 18 additions and 14 deletions
  1. +2
    -3
      src/Discord.Net.WebSocket/DiscordSocketClient.cs
  2. +2
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs
  3. +1
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs
  4. +8
    -2
      src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
  5. +1
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs
  6. +1
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
  7. +1
    -2
      src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs
  8. +1
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs
  9. +1
    -2
      src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs

+ 2
- 3
src/Discord.Net.WebSocket/DiscordSocketClient.cs View File

@@ -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);


+ 2
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs View File

@@ -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;


+ 1
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketGroupUser.cs View File

@@ -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; } }


+ 8
- 2
src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs View File

@@ -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


+ 1
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs View File

@@ -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; } }


+ 1
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs View File

@@ -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; }




+ 1
- 2
src/Discord.Net.WebSocket/Entities/Users/SocketUnknownUser.cs View File

@@ -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)


+ 1
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs View File

@@ -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 />


+ 1
- 2
src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs View File

@@ -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)


Loading…
Cancel
Save