From 25aaa4948ad103556c09aeed813939d2f4ddd1a6 Mon Sep 17 00:00:00 2001
From: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date: Wed, 9 Mar 2022 17:29:24 -0400
Subject: [PATCH] fix: thread owner always null (#2182)
---
.../Entities/Channels/SocketThreadChannel.cs | 29 +++++++++++++++++--
.../Entities/Users/SocketThreadUser.cs | 11 +++++++
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs
index c26a23afd..2e77e62e3 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketThreadChannel.cs
@@ -24,7 +24,29 @@ namespace Discord.WebSocket
///
/// Gets the owner of the current thread.
///
- public SocketThreadUser Owner { get; private set; }
+ public SocketThreadUser Owner
+ {
+ get
+ {
+ lock (_ownerLock)
+ {
+ var user = GetUser(_ownerId);
+
+ if (user == null)
+ {
+ var guildMember = Guild.GetUser(_ownerId);
+ if (guildMember == null)
+ return null;
+
+ user = SocketThreadUser.Create(Guild, this, guildMember);
+ _members[user.Id] = user;
+ return user;
+ }
+ else
+ return user;
+ }
+ }
+ }
///
/// Gets the current users within this thread.
@@ -83,6 +105,9 @@ namespace Discord.WebSocket
private bool _usersDownloaded;
private readonly object _downloadLock = new object();
+ private readonly object _ownerLock = new object();
+
+ private ulong _ownerId;
internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketGuildChannel parent,
DateTimeOffset? createdAt)
@@ -120,7 +145,7 @@ namespace Discord.WebSocket
if (model.OwnerId.IsSpecified)
{
- Owner = GetUser(model.OwnerId.Value);
+ _ownerId = model.OwnerId.Value;
}
HasJoined = model.ThreadMember.IsSpecified;
diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
index 025d34d0f..6eddd876d 100644
--- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
+++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs
@@ -147,6 +147,17 @@ namespace Discord.WebSocket
return entity;
}
+ internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser owner)
+ {
+ // this is used for creating the owner of the thread.
+ var entity = new SocketThreadUser(guild, thread, owner, owner.Id);
+ entity.Update(new Model
+ {
+ JoinTimestamp = thread.CreatedAt,
+ });
+ return entity;
+ }
+
internal void Update(Model model)
{
ThreadJoinedAt = model.JoinTimestamp;