diff --git a/src/Discord.Net.WebSocket/ClientStateManager.Experiment.cs b/src/Discord.Net.WebSocket/ClientStateManager.Experiment.cs index 86c59d0bc..dc63dc797 100644 --- a/src/Discord.Net.WebSocket/ClientStateManager.Experiment.cs +++ b/src/Discord.Net.WebSocket/ClientStateManager.Experiment.cs @@ -267,26 +267,15 @@ namespace Discord.WebSocket private SemaphoreSlim _memberStoreLock; private SemaphoreSlim _threadMemberLock; - private void CreateStores() + private readonly Dictionary> _defaultModelFactory = new() { - UserStore = new ReferenceStore( - _cacheProvider, - m => SocketGlobalUser.Create(_client, m), - async (id, options) => await _client.Rest.GetUserAsync(id, options).ConfigureAwait(false), - AllowSyncWaits); + { typeof(IUserModel), () => new SocketUser.CacheModel() }, + { typeof(IMemberModel), () => new SocketGuildUser.CacheModel() }, + { typeof(ICurrentUserModel), () => new SocketSelfUser.CacheModel() }, + { typeof(IThreadMemberModel), () => new SocketThreadUser.CacheModel() }, + { typeof(IPresenceModel), () => new SocketPresence.CacheModel() }, + }; - PresenceStore = new ReferenceStore( - _cacheProvider, - m => SocketPresence.Create(_client, m), - (id, options) => Task.FromResult(null), - AllowSyncWaits); - - _memberStores = new(); - _threadMemberStores = new(); - - _threadMemberLock = new(1, 1); - _memberStoreLock = new(1,1); - } public void ClearDeadReferences() { @@ -374,7 +363,27 @@ namespace Discord.WebSocket return (TModel)Activator.CreateInstance(type); } else - return new TFallback(); + return _defaultModelFactory.TryGetValue(typeof(TModel), out var m) ? (TModel)m() : new TFallback(); + } + private void CreateStores() + { + UserStore = new ReferenceStore( + _cacheProvider, + m => SocketGlobalUser.Create(_client, m), + async (id, options) => await _client.Rest.GetUserAsync(id, options).ConfigureAwait(false), + AllowSyncWaits); + + PresenceStore = new ReferenceStore( + _cacheProvider, + m => SocketPresence.Create(_client, m), + (id, options) => Task.FromResult(null), + AllowSyncWaits); + + _memberStores = new(); + _threadMemberStores = new(); + + _threadMemberLock = new(1, 1); + _memberStoreLock = new(1,1); } } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index f876283a4..8757d206a 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -259,7 +259,7 @@ namespace Discord.WebSocket #region Cache - private class CacheModel : MemberModel + internal new class CacheModel : MemberModel { public ulong Id { get; set; } public string Nickname { get; set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs index b1a4629ad..b6e9cd764 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs @@ -127,7 +127,7 @@ namespace Discord.WebSocket } #region Cache - private class CacheModel : Model + internal class CacheModel : Model { public UserStatus Status { get; set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs index 6047c34f1..087d4ba29 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs @@ -97,7 +97,7 @@ namespace Discord.WebSocket } #region Cache - private class CacheModel : Model + internal new class CacheModel : Model { public bool? IsVerified { get; set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index fc67a1e1b..0b614adae 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -258,7 +258,7 @@ namespace Discord.WebSocket public static explicit operator SocketGuildUser(SocketThreadUser user) => user.GuildUser.Value; #region Cache - private class CacheModel : Model + internal new class CacheModel : Model { public ulong Id { get; set; } public ulong? ThreadId { get; set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index 3821fac50..20c195103 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -124,7 +124,7 @@ namespace Discord.WebSocket internal SocketUser Clone() => MemberwiseClone() as SocketUser; #region Cache - private class CacheModel : Model + internal class CacheModel : Model { public string Username { get; set; }