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


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

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


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

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


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

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


+ 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; }
/// <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; } }


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

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



+ 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 { } }
/// <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)


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

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


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

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


Loading…
Cancel
Save