From ae113c2f46973af40c2ec25eb64c765ae84d74b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sierpi=C5=84ski?= <33436839+sierpinskid@users.noreply.github.com> Date: Fri, 10 Apr 2026 20:29:25 +0200 Subject: [PATCH] Fix IL2CPP build crash on Unity 6000.0.x caused by multiple implementations of the same generic interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IL2CPP's vtable builder in Unity 6000.0.x crashes with a KeyNotFoundException in VTableBuilderComponent.OverrideInterfaceMethods when a type implements multiple closed versions of the same generic interface (e.g. ISavableTo and ISavableTo). The vtable builder uses an unresolved generic parameter name as a dictionary key instead of the resolved concrete type, causing a key mismatch during vtable construction. The bug is fixed in Unity 6000.2.x but affects customers on 6000.0.x. This pattern existed across four internal generic interfaces in the SDK: ISavableTo (9 types), ILoadableFrom (9 types), IUpdateableFrom (4 types), and IStateLoadableFrom (5 types) — 27 types total. Fix: for each interface, introduce numbered variants (e.g. ISavableTo2, ILoadableFrom2/3/4, IUpdateableFrom2/3/4/5, IStateLoadableFrom2) that are structurally identical but distinct in the type system. Each type's secondary and tertiary implementations are moved to the numbered variant, so no type ever implements multiple closed versions of the same generic interface. Matching extension method overloads ensure all existing functionality and DTO conversions are preserved. --- .../StreamChat/Core/Helpers/ICollectionExt.cs | 80 ++++++++++++ .../StreamChat/Core/Helpers/IDictionaryExt.cs | 24 ++++ .../Core/Helpers/ILoadableFromExt.cs | 114 ++++++++++++++++++ .../StreamChat/Core/Helpers/ISavableToExt.cs | 6 + .../Core/LowLevelClient/API/ChannelApi.cs | 4 +- .../Core/LowLevelClient/ILoadableFrom.cs | 18 +++ .../Core/LowLevelClient/ISavableTo.cs | 19 +++ .../LowLevelClient/Models/ChannelMember.cs | 4 +- .../LowLevelClient/Models/ChannelState.cs | 16 +-- .../Core/LowLevelClient/Models/Message.cs | 16 +-- .../Core/LowLevelClient/Models/Poll.cs | 12 +- .../Core/LowLevelClient/Models/PollOption.cs | 4 +- .../Core/LowLevelClient/Models/PollVote.cs | 4 +- .../Models/PushNotificationSettings.cs | 12 +- .../Core/LowLevelClient/Models/Reaction.cs | 4 +- .../Core/LowLevelClient/Models/User.cs | 10 +- .../Requests/ChannelMemberRequest.cs | 4 +- .../LowLevelClient/Requests/ChannelRequest.cs | 2 +- .../PushNotificationSettingsRequest.cs | 4 +- .../Requests/QueryUsersRequest.cs | 2 +- .../Requests/SortParamRequest.cs | 4 +- .../Requests/UserObjectRequest.cs | 6 +- .../Responses/PollVotesResponse.cs | 2 +- .../Responses/QueryPollsResponse.cs | 2 +- .../Responses/UpdateChannelPartialResponse.cs | 2 +- .../Responses/UpdateUsersResponse.cs | 2 +- .../LowLevelClient/Responses/UsersResponse.cs | 2 +- .../Core/Models/StreamPollOption.cs | 4 +- .../StreamChat/Core/Models/StreamPollVote.cs | 4 +- .../Models/StreamPushNotificationSettings.cs | 4 +- .../StreamChat/Core/Models/StreamReaction.cs | 4 +- .../StreamChat/Core/Models/StreamRead.cs | 4 +- .../Requests/StreamChannelMemberRequest.cs | 4 +- .../Core/Requests/StreamPollOptionRequest.cs | 4 +- .../Requests/StreamQueryBannedUsersRequest.cs | 2 +- .../Core/Requests/StreamSortParam.cs | 4 +- .../Core/Requests/StreamUserUpsertRequest.cs | 4 +- .../StreamChat/Core/State/Caches/Cache.cs | 16 +-- .../Core/State/Caches/CacheRepository.cs | 109 ++++++++++++++--- .../StreamChat/Core/State/Caches/ICacheExt.cs | 16 +-- .../Core/State/Caches/ICacheRepository.cs | 28 +++++ .../StreamChat/Core/State/IRepositoryExt.cs | 67 ++++++++++ .../Core/State/IStateLoadableFrom.cs | 82 ++++++++++++- .../StreamChat/Core/State/IUpdateableFrom.cs | 24 ++++ .../Core/State/UpdateableFromExt.cs | 24 ++++ .../Core/StatefulModels/StreamChannel.cs | 28 ++--- .../StatefulModels/StreamLocalUserData.cs | 6 +- .../Core/StatefulModels/StreamMessage.cs | 14 +-- .../Core/StatefulModels/StreamUser.cs | 10 +- .../StreamChat/Core/StreamChatClient.cs | 2 +- 50 files changed, 699 insertions(+), 144 deletions(-) diff --git a/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs index 5da3d4f5..f18f5fb0 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs @@ -68,6 +68,29 @@ public static List TrySaveToDtoCollection(this List TrySaveToDtoCollection2(this List source) + where TSource : ISavableTo2 + { + if (source == null) + { + return null; + } + + var dtos = new List(source.Count); + + foreach (var item in source) + { + if (item == null) + { + continue; + } + dtos.Add(item.SaveToDto()); + } + + return dtos; + } + [Pure] public static List TryLoadFromDtoCollection(this List _, List dtos) where TSource : ILoadableFrom, new() @@ -86,5 +109,62 @@ public static List TryLoadFromDtoCollection(this List TryLoadFromDtoCollection2(this List _, List dtos) + where TSource : ILoadableFrom2, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto)); + } + + return items; + } + + [Pure] + public static List TryLoadFromDtoCollection3(this List _, List dtos) + where TSource : ILoadableFrom3, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto)); + } + + return items; + } + + [Pure] + public static List TryLoadFromDtoCollection4(this List _, List dtos) + where TSource : ILoadableFrom4, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto)); + } + + return items; + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs index 35d24e1d..177e3eab 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs @@ -54,5 +54,29 @@ public static Dictionary TryLoadFromDtoDictionary TryLoadFromDtoDictionary4( + this Dictionary _, Dictionary dtos) + where TSource : ILoadableFrom4, new() + { + if (dtos == null) + { + return null; + } + + var dict = new Dictionary(); + + foreach (var sourceKeyValue in dtos) + { + if (sourceKeyValue.Value == null) + { + continue; + } + + dict.Add(sourceKeyValue.Key, new TSource().LoadFromDto(sourceKeyValue.Value)); + } + + return dict; + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs index 0e21fd35..b95f1089 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs @@ -49,5 +49,119 @@ public static TDomain ToDomain(this TDto dto) return new TDomain().LoadFromDto(dto); } + + public static TDomain TryLoadFromDto(this ILoadableFrom2 loadable, TDto dto) + where TDomain : ILoadableFrom2, new() + { + if (dto == null) + { + return default; + } + + return loadable != null ? loadable.LoadFromDto(dto) : new TDomain().LoadFromDto(dto); + } + + public static TDomain UpdateFromDto(this ILoadableFrom2 loadable, TDto dto) + where TDomain : ILoadableFrom2, new() + { + if (dto == null) + { + return default; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto); + } + + public static TDomain ToDomain2(this TDto dto) + where TDomain : class, ILoadableFrom2, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto); + } + + public static TDomain TryLoadFromDto(this ILoadableFrom3 loadable, TDto dto) + where TDomain : ILoadableFrom3, new() + { + if (dto == null) + { + return default; + } + + return loadable != null ? loadable.LoadFromDto(dto) : new TDomain().LoadFromDto(dto); + } + + public static TDomain UpdateFromDto(this ILoadableFrom3 loadable, TDto dto) + where TDomain : ILoadableFrom3, new() + { + if (dto == null) + { + return default; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto); + } + + public static TDomain ToDomain3(this TDto dto) + where TDomain : class, ILoadableFrom3, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto); + } + + public static TDomain TryLoadFromDto(this ILoadableFrom4 loadable, TDto dto) + where TDomain : ILoadableFrom4, new() + { + if (dto == null) + { + return default; + } + + return loadable != null ? loadable.LoadFromDto(dto) : new TDomain().LoadFromDto(dto); + } + + public static TDomain UpdateFromDto(this ILoadableFrom4 loadable, TDto dto) + where TDomain : ILoadableFrom4, new() + { + if (dto == null) + { + return default; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto); + } + + public static TDomain ToDomain4(this TDto dto) + where TDomain : class, ILoadableFrom4, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto); + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs index 520bf417..12fa43f2 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs @@ -9,5 +9,11 @@ internal static class ISavableToExt { public static TDto TrySaveToDto(this ISavableTo source) => source != default ? source.SaveToDto() : default; + + public static TDto TrySaveToDto(this ISavableTo2 source) + => source != default ? source.SaveToDto() : default; + + public static TDto TrySaveToDto(this ISavableTo3 source) + => source != default ? source.SaveToDto() : default; } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs index e4a76728..943cb37c 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs @@ -27,7 +27,7 @@ public async Task GetOrCreateChannelAsync(string channelType, ChannelGetOrCreateRequest getOrCreateRequest) { var dto = await _internalChannelApi.GetOrCreateChannelAsync(channelType, getOrCreateRequest.TrySaveToDto()); - return dto.ToDomain(); + return dto.ToDomain2(); } public async Task GetOrCreateChannelAsync(string channelType, string channelId, @@ -35,7 +35,7 @@ public async Task GetOrCreateChannelAsync(string channelType, stri { var dto = await _internalChannelApi.GetOrCreateChannelAsync(channelType, channelId, getOrCreateRequest.TrySaveToDto()); - return dto.ToDomain(); + return dto.ToDomain2(); } public async Task UpdateChannelAsync(string channelType, string channelId, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs index 6cf6633b..95ee7892 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs @@ -10,4 +10,22 @@ internal interface ILoadableFrom { TDomain LoadFromDto(TDto dto); } + + internal interface ILoadableFrom2 + where TDomain : ILoadableFrom2 + { + TDomain LoadFromDto(TDto dto); + } + + internal interface ILoadableFrom3 + where TDomain : ILoadableFrom3 + { + TDomain LoadFromDto(TDto dto); + } + + internal interface ILoadableFrom4 + where TDomain : ILoadableFrom4 + { + TDomain LoadFromDto(TDto dto); + } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs index 6c56066a..c5b6b4ff 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs @@ -8,4 +8,23 @@ internal interface ISavableTo { TDto SaveToDto(); } + + /// + /// Secondary DTO save target. Identical to but declared as a separate interface + /// to work around an IL2CPP vtable builder bug (Unity 6000.0.x) that crashes when a single type implements + /// multiple closed versions of the same generic interface. + /// + internal interface ISavableTo2 + { + TDto SaveToDto(); + } + + /// + /// Tertiary DTO save target. Same workaround as for types that need + /// three distinct DTO conversions (e.g. ). + /// + internal interface ISavableTo3 + { + TDto SaveToDto(); + } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs index 2a917b6a..a1f8a559 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs @@ -6,7 +6,7 @@ namespace StreamChat.Core.LowLevelClient.Models { public class ChannelMember : ModelBase, ILoadableFrom, - ILoadableFrom, ISavableTo + ILoadableFrom2, ISavableTo { /// /// Expiration date of the ban @@ -91,7 +91,7 @@ ChannelMember ILoadableFrom.LoadFromDto return this; } - ChannelMember ILoadableFrom.LoadFromDto( + ChannelMember ILoadableFrom2.LoadFromDto( ChannelMemberResponseInternalDTO dto) { BanExpires = dto.BanExpires; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs index 543290d5..46df7848 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs @@ -8,7 +8,7 @@ namespace StreamChat.Core.LowLevelClient.Models { public class ChannelState : ModelBase, ILoadableFrom, - ILoadableFrom + ILoadableFrom2 { [Obsolete("This event is deprecated and will be removed in a future major release.")] public event Action NewMessageAdded; @@ -81,30 +81,30 @@ ChannelState ILoadableFrom. HideMessagesBefore = dto.HideMessagesBefore; Members = Members.TryLoadFromDtoCollection(dto.Members); Membership = Membership.TryLoadFromDto(dto.Membership); - Messages = Messages.TryLoadFromDtoCollection(dto.Messages); + Messages = Messages.TryLoadFromDtoCollection3(dto.Messages); PendingMessages = PendingMessages.TryLoadFromDtoCollection(dto.PendingMessages); - PinnedMessages = PinnedMessages.TryLoadFromDtoCollection(dto.PinnedMessages); + PinnedMessages = PinnedMessages.TryLoadFromDtoCollection3(dto.PinnedMessages); Read = Read.TryLoadFromDtoCollection(dto.Read); WatcherCount = dto.WatcherCount; - Watchers = Watchers.TryLoadFromDtoCollection(dto.Watchers); + Watchers = Watchers.TryLoadFromDtoCollection2(dto.Watchers); AdditionalProperties = dto.AdditionalProperties; return this; } - ChannelState ILoadableFrom.LoadFromDto(ChannelStateResponseInternalDTO dto) + ChannelState ILoadableFrom2.LoadFromDto(ChannelStateResponseInternalDTO dto) { Channel = Channel.TryLoadFromDto(dto.Channel); Hidden = dto.Hidden; HideMessagesBefore = dto.HideMessagesBefore; Members = Members.TryLoadFromDtoCollection(dto.Members); Membership = Membership.TryLoadFromDto(dto.Membership); - Messages = Messages.TryLoadFromDtoCollection(dto.Messages); + Messages = Messages.TryLoadFromDtoCollection3(dto.Messages); PendingMessages = PendingMessages.TryLoadFromDtoCollection(dto.PendingMessages); - PinnedMessages = PinnedMessages.TryLoadFromDtoCollection(dto.PinnedMessages); + PinnedMessages = PinnedMessages.TryLoadFromDtoCollection3(dto.PinnedMessages); Read = Read.TryLoadFromDtoCollection(dto.Read); WatcherCount = dto.WatcherCount; - Watchers = Watchers.TryLoadFromDtoCollection(dto.Watchers); + Watchers = Watchers.TryLoadFromDtoCollection2(dto.Watchers); AdditionalProperties = dto.AdditionalProperties; return this; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs index cdde36cc..0b46bbe2 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs @@ -7,8 +7,8 @@ namespace StreamChat.Core.LowLevelClient.Models { public class Message : ModelBase, ILoadableFrom, - ILoadableFrom, - ILoadableFrom + ILoadableFrom2, + ILoadableFrom3 { /// /// Array of message attachments @@ -213,7 +213,7 @@ Message ILoadableFrom.LoadFromDto(MessageInternalDT return this; } - Message ILoadableFrom.LoadFromDto(SearchResultMessageInternalDTO dto) + Message ILoadableFrom2.LoadFromDto(SearchResultMessageInternalDTO dto) { Attachments = Attachments.TryLoadFromDtoCollection(dto.Attachments); BeforeMessageSendFailed = dto.BeforeMessageSendFailed; @@ -253,7 +253,7 @@ Message ILoadableFrom.LoadFromDto(Searc return this; } - Message ILoadableFrom.LoadFromDto(MessageResponseInternalDTO dto) + Message ILoadableFrom3.LoadFromDto(MessageResponseInternalDTO dto) { Attachments = Attachments.TryLoadFromDtoCollection(dto.Attachments); BeforeMessageSendFailed = dto.BeforeMessageSendFailed; @@ -266,10 +266,10 @@ Message ILoadableFrom.LoadFromDto(MessageRe I18n = dto.I18n; Id = dto.Id; ImageLabels = dto.ImageLabels; - LatestReactions = LatestReactions.TryLoadFromDtoCollection(dto.LatestReactions); - MentionedUsers = MentionedUsers.TryLoadFromDtoCollection(dto.MentionedUsers); + LatestReactions = LatestReactions.TryLoadFromDtoCollection2(dto.LatestReactions); + MentionedUsers = MentionedUsers.TryLoadFromDtoCollection2(dto.MentionedUsers); Mml = dto.Mml; - OwnReactions = OwnReactions.TryLoadFromDtoCollection(dto.OwnReactions); + OwnReactions = OwnReactions.TryLoadFromDtoCollection2(dto.OwnReactions); ParentId = dto.ParentId; PinExpires = dto.PinExpires; Pinned = dto.Pinned; @@ -284,7 +284,7 @@ Message ILoadableFrom.LoadFromDto(MessageRe ShowInChannel = dto.ShowInChannel; Silent = dto.Silent; Text = dto.Text; - ThreadParticipants = ThreadParticipants.TryLoadFromDtoCollection(dto.ThreadParticipants); + ThreadParticipants = ThreadParticipants.TryLoadFromDtoCollection2(dto.ThreadParticipants); Type = Type.TryLoadFromDto(dto.Type); UpdatedAt = dto.UpdatedAt; User = User.TryLoadFromDto(dto.User); diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs index 95bf875d..d9f52584 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// /// Represents a poll /// - public partial class Poll : ModelBase, ILoadableFrom, ILoadableFrom + public partial class Poll : ModelBase, ILoadableFrom, ILoadableFrom2 { public bool AllowAnswers { get; set; } @@ -81,7 +81,7 @@ Poll ILoadableFrom.LoadFromDto(PollInternalDTO dto) return this; } - Poll ILoadableFrom.LoadFromDto(PollResponseDataInternalDTO dto) + Poll ILoadableFrom2.LoadFromDto(PollResponseDataInternalDTO dto) { AllowAnswers = dto.AllowAnswers; AllowUserSuggestedOptions = dto.AllowUserSuggestedOptions; @@ -94,12 +94,12 @@ Poll ILoadableFrom.LoadFromDto(PollResponseDa EnforceUniqueVote = dto.EnforceUniqueVote; Id = dto.Id; IsClosed = dto.IsClosed; - LatestAnswers = LatestAnswers.TryLoadFromDtoCollection(dto.LatestAnswers); + LatestAnswers = LatestAnswers.TryLoadFromDtoCollection2(dto.LatestAnswers); LatestVotesByOption = LoadVotesByOption(dto.LatestVotesByOption); MaxVotesAllowed = dto.MaxVotesAllowed; Name = dto.Name; - Options = Options.TryLoadFromDtoCollection(dto.Options); - OwnVotes = OwnVotes.TryLoadFromDtoCollection(dto.OwnVotes); + Options = Options.TryLoadFromDtoCollection2(dto.Options); + OwnVotes = OwnVotes.TryLoadFromDtoCollection2(dto.OwnVotes); UpdatedAt = dto.UpdatedAt; VoteCount = dto.VoteCount; VoteCountsByOption = dto.VoteCountsByOption; @@ -119,7 +119,7 @@ private Dictionary> LoadVotesByOption(Dictionary>(); foreach (var kvp in dto) { - result[kvp.Key] = new List().TryLoadFromDtoCollection(kvp.Value); + result[kvp.Key] = new List().TryLoadFromDtoCollection2(kvp.Value); } return result; } diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs index 84a0c949..3493edfc 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// /// Represents a poll option /// - public partial class PollOption : ILoadableFrom, ILoadableFrom + public partial class PollOption : ILoadableFrom, ILoadableFrom2 { public Dictionary Custom { get; set; } @@ -29,7 +29,7 @@ PollOption ILoadableFrom.LoadFromDto(PollOpti return this; } - PollOption ILoadableFrom.LoadFromDto(PollOptionResponseDataInternalDTO dto) + PollOption ILoadableFrom2.LoadFromDto(PollOptionResponseDataInternalDTO dto) { Custom = dto.Custom; Id = dto.Id; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs index ca513c95..44b4d661 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// /// Represents a poll vote /// - public partial class PollVote : ILoadableFrom, ILoadableFrom + public partial class PollVote : ILoadableFrom, ILoadableFrom2 { public string AnswerText { get; set; } @@ -47,7 +47,7 @@ PollVote ILoadableFrom.LoadFromDto(PollVoteIntern return this; } - PollVote ILoadableFrom.LoadFromDto(PollVoteResponseDataInternalDTO dto) + PollVote ILoadableFrom2.LoadFromDto(PollVoteResponseDataInternalDTO dto) { AnswerText = dto.AnswerText; CreatedAt = dto.CreatedAt; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs index 8fb60d45..587598f6 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs @@ -7,9 +7,9 @@ namespace StreamChat.Core.LowLevelClient.Models public class PushNotificationSettings : ModelBase, ILoadableFrom, - ILoadableFrom, - ILoadableFrom, - ISavableTo, ISavableTo + ILoadableFrom2, + ILoadableFrom3, + ISavableTo, ISavableTo2 { public bool? Disabled { get; set; } @@ -25,7 +25,7 @@ PushNotificationSettings ILoadableFrom. + PushNotificationSettings ILoadableFrom2. LoadFromDto(PushNotificationSettingsRequestInternalDTO dto) { Disabled = dto.Disabled; @@ -35,7 +35,7 @@ PushNotificationSettings ILoadableFrom. + PushNotificationSettings ILoadableFrom3. LoadFromDto(PushNotificationSettingsResponseInternalDTO dto) { Disabled = dto.Disabled; @@ -53,7 +53,7 @@ PushNotificationSettingsInternalDTO ISavableTo.SaveToDto() + PushNotificationSettingsRequestInternalDTO ISavableTo2.SaveToDto() => new PushNotificationSettingsRequestInternalDTO { Disabled = Disabled, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs index ded5485a..af5616f7 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// Represents user reaction to a message /// public class Reaction : ResponseObjectBase, ILoadableFrom, - ILoadableFrom + ILoadableFrom2 { /// /// Date/time of creation @@ -57,7 +57,7 @@ Reaction ILoadableFrom.LoadFromDto(ReactionIntern return this; } - Reaction ILoadableFrom.LoadFromDto(ReactionResponseInternalDTO dto) + Reaction ILoadableFrom2.LoadFromDto(ReactionResponseInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; CreatedAt = dto.CreatedAt; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs index 62e495b8..aa9024c6 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs @@ -7,8 +7,8 @@ namespace StreamChat.Core.LowLevelClient.Models { //StreamTODO: Check if this object is needed. Ideally we'd only have IStreamUser object representing a user and remove this one public class User : ModelBase, ILoadableFrom, - ILoadableFrom, ILoadableFrom, - ILoadableFrom, + ILoadableFrom2, ILoadableFrom3, + ILoadableFrom4, ISavableTo { /// @@ -113,7 +113,7 @@ User ILoadableFrom.LoadFromDto(UserObjectInternalDT return this; } - User ILoadableFrom.LoadFromDto(UserResponseInternalDTO dto) + User ILoadableFrom2.LoadFromDto(UserResponseInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; BanExpires = dto.BanExpires; @@ -141,7 +141,7 @@ User ILoadableFrom.LoadFromDto(UserResponseIntern return this; } - User ILoadableFrom.LoadFromDto(UserEventPayloadInternalDTO dto) + User ILoadableFrom3.LoadFromDto(UserEventPayloadInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; BanExpires = dto.BanExpires; @@ -193,7 +193,7 @@ UserObjectInternalDTO ISavableTo.SaveToDto() Image = Image, }; - User ILoadableFrom.LoadFromDto(FullUserResponseInternalDTO dto) + User ILoadableFrom4.LoadFromDto(FullUserResponseInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; BanExpires = dto.BanExpires; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs index 0c7294e6..cd61c5fb 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs @@ -5,7 +5,7 @@ namespace StreamChat.Core.LowLevelClient.Requests { - public partial class ChannelMemberRequest : RequestObjectBase, ISavableTo, ISavableTo + public partial class ChannelMemberRequest : RequestObjectBase, ISavableTo, ISavableTo2 { /// /// Expiration date of the ban @@ -69,7 +69,7 @@ public partial class ChannelMemberRequest : RequestObjectBase, ISavableTo.SaveToDto() => + ChannelMemberRequestInternalDTO ISavableTo2.SaveToDto() => new ChannelMemberRequestInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs index 6f05469f..730a3485 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs @@ -54,7 +54,7 @@ ChannelRequestInternalDTO ISavableTo.SaveToDto() => CreatedBy = CreatedBy.TrySaveToDto(), Disabled = Disabled, Frozen = Frozen, - Members = Members.TrySaveToDtoCollection(), + Members = Members.TrySaveToDtoCollection2(), OwnCapabilities = OwnCapabilities, Team = Team, TruncatedAt = TruncatedAt, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs index deb7faf0..0d770948 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs @@ -4,7 +4,7 @@ namespace StreamChat.Core.LowLevelClient.Requests { - public class PushNotificationSettingsRequest : RequestObjectBase, ISavableTo, ISavableTo + public class PushNotificationSettingsRequest : RequestObjectBase, ISavableTo, ISavableTo2 { public bool Disabled { get; set; } @@ -18,7 +18,7 @@ PushNotificationSettingsRequestInternalDTO ISavableTo.SaveToDto() => + PushNotificationSettingsInternalDTO ISavableTo2.SaveToDto() => new PushNotificationSettingsInternalDTO { Disabled = Disabled, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs index c62d7968..9123ee61 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs @@ -63,7 +63,7 @@ QueryUsersRequestInternalDTO ISavableTo.SaveToDto( Limit = Limit, Offset = Offset, Presence = Presence, - Sort = Sort.TrySaveToDtoCollection(), + Sort = Sort.TrySaveToDtoCollection2(), AdditionalProperties = AdditionalProperties, }; } diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs index 52a903b2..44f342d2 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs @@ -3,7 +3,7 @@ namespace StreamChat.Core.LowLevelClient.Requests { - public partial class SortParamRequest : RequestObjectBase, ISavableTo, ISavableTo + public partial class SortParamRequest : RequestObjectBase, ISavableTo, ISavableTo2 { public int? Direction { get; set; } @@ -17,7 +17,7 @@ SortParamRequestInternalDTO ISavableTo.SaveToDto() AdditionalProperties = AdditionalProperties }; - SortParamInternalDTO ISavableTo.SaveToDto() => + SortParamInternalDTO ISavableTo2.SaveToDto() => new SortParamInternalDTO { Direction = Direction, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs index 5e504d70..e0840c48 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs @@ -10,7 +10,7 @@ namespace StreamChat.Core.LowLevelClient.Requests /// Represents chat user /// public class UserObjectRequest : RequestObjectBase, ISavableTo, - ISavableTo, ISavableTo + ISavableTo2, ISavableTo3 { /// /// Expiration date of the ban @@ -66,7 +66,7 @@ UserObjectRequestInternalDTO ISavableTo.SaveToDto( AdditionalProperties = AdditionalProperties }; - UserRequestInternalDTO ISavableTo.SaveToDto() + UserRequestInternalDTO ISavableTo2.SaveToDto() => new UserRequestInternalDTO { BanExpires = BanExpires, @@ -81,7 +81,7 @@ UserRequestInternalDTO ISavableTo.SaveToDto() AdditionalProperties = AdditionalProperties }; - UserObjectInternalDTO ISavableTo.SaveToDto() + UserObjectInternalDTO ISavableTo3.SaveToDto() => new UserObjectInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs index e6bb81f1..a575383e 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs @@ -18,7 +18,7 @@ public partial class PollVotesResponse : ResponseObjectBase, ILoadableFrom.LoadFromDto(PollVotesResponseInternalDTO dto) { - Votes = Votes.TryLoadFromDtoCollection(dto.Votes); + Votes = Votes.TryLoadFromDtoCollection2(dto.Votes); Next = dto.Next; Prev = dto.Prev; AdditionalProperties = dto.AdditionalProperties; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs index 521980d4..5c34539a 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs @@ -18,7 +18,7 @@ public partial class QueryPollsResponse : ResponseObjectBase, ILoadableFrom.LoadFromDto(QueryPollsResponseInternalDTO dto) { - Polls = Polls.TryLoadFromDtoCollection(dto.Polls); + Polls = Polls.TryLoadFromDtoCollection2(dto.Polls); Next = dto.Next; Prev = dto.Prev; AdditionalProperties = dto.AdditionalProperties; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs index 51c4b3d1..871322bc 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs @@ -19,7 +19,7 @@ UpdateChannelPartialResponse ILoadableFrom.LoadFromDto(UpdateUsersResponseInternalDTO dto) { Duration = dto.Duration; - Users = Users.TryLoadFromDtoDictionary(dto.Users); + Users = Users.TryLoadFromDtoDictionary4(dto.Users); AdditionalProperties = dto.AdditionalProperties; return this; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs index 659fecd5..83aef342 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs @@ -20,7 +20,7 @@ public partial class UsersResponse : ResponseObjectBase, ILoadableFrom.LoadFromDto(QueryUsersResponseInternalDTO dto) { Duration = dto.Duration; - Users = Users.TryLoadFromDtoCollection(dto.Users); + Users = Users.TryLoadFromDtoCollection4(dto.Users); AdditionalProperties = dto.AdditionalProperties; return this; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs b/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs index 863d7168..836b2fd2 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs @@ -10,7 +10,7 @@ namespace StreamChat.Core.Models /// Represents an option in a poll /// public class StreamPollOption : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { /// /// Custom data associated with this option @@ -42,7 +42,7 @@ StreamPollOption IStateLoadableFrom.Loa return this; } - StreamPollOption IStateLoadableFrom.LoadFromDto(PollOptionResponseDataInternalDTO dto, ICache cache) + StreamPollOption IStateLoadableFrom2.LoadFromDto(PollOptionResponseDataInternalDTO dto, ICache cache) { Custom = dto.Custom; Id = dto.Id; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs b/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs index 9bf97a48..f40ee743 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs @@ -12,7 +12,7 @@ namespace StreamChat.Core.Models /// Represents a vote cast on a poll /// public class StreamPollVote : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { /// /// Text answer for the vote (if poll allows answers) @@ -80,7 +80,7 @@ StreamPollVote IStateLoadableFrom.LoadFromD return this; } - StreamPollVote IStateLoadableFrom.LoadFromDto(PollVoteResponseDataInternalDTO dto, ICache cache) + StreamPollVote IStateLoadableFrom2.LoadFromDto(PollVoteResponseDataInternalDTO dto, ICache cache) { AnswerText = dto.AnswerText; CreatedAt = dto.CreatedAt; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs b/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs index bae9e766..2db682c3 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs @@ -7,7 +7,7 @@ namespace StreamChat.Core.Models { public class StreamPushNotificationSettings : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { public bool Disabled { get; private set; } @@ -24,7 +24,7 @@ public class StreamPushNotificationSettings : } StreamPushNotificationSettings - IStateLoadableFrom.LoadFromDto( + IStateLoadableFrom2.LoadFromDto( PushNotificationSettingsResponseInternalDTO dto, ICache cache) { Disabled = dto.Disabled.GetValueOrDefault(); diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs b/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs index 4e394bfc..f295129d 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.Models /// /// Represents user reaction to a message /// - public class StreamReaction : IStateLoadableFrom, IStateLoadableFrom + public class StreamReaction : IStateLoadableFrom, IStateLoadableFrom2 { /// /// Date/time of creation @@ -59,7 +59,7 @@ StreamReaction IStateLoadableFrom.LoadFromD return this; } - StreamReaction IStateLoadableFrom.LoadFromDto(ReactionResponseInternalDTO dto, ICache cache) + StreamReaction IStateLoadableFrom2.LoadFromDto(ReactionResponseInternalDTO dto, ICache cache) { CreatedAt = dto.CreatedAt; MessageId = dto.MessageId; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs b/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs index 837e8c12..1cbd97a5 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.Models { //StreamTodo: this could contain the last read StreamMessage public class StreamRead : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { public DateTimeOffset LastRead { get; private set; } @@ -27,7 +27,7 @@ StreamRead IStateLoadableFrom.LoadFromDto(ReadInter return this; } - StreamRead IStateLoadableFrom.LoadFromDto(ReadStateResponseInternalDTO dto, ICache cache) + StreamRead IStateLoadableFrom2.LoadFromDto(ReadStateResponseInternalDTO dto, ICache cache) { //Is this always set? What if a user marks empty channel as read? LastRead = dto.LastRead; //StreamTodo: GetValueOrThrow? diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs index 7eef73c3..8139bc0a 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs @@ -5,7 +5,7 @@ namespace StreamChat.Core.Requests { - public sealed class StreamChannelMemberRequest : ISavableTo, ISavableTo + public sealed class StreamChannelMemberRequest : ISavableTo, ISavableTo2 { /// /// Expiration date of the ban @@ -32,7 +32,7 @@ public sealed class StreamChannelMemberRequest : ISavableTo public bool? ShadowBanned { get; set; } - ChannelMemberRequestInternalDTO ISavableTo.SaveToDto() + ChannelMemberRequestInternalDTO ISavableTo2.SaveToDto() => new ChannelMemberRequestInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs index 90d630e5..0d079407 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs @@ -8,7 +8,7 @@ namespace StreamChat.Core.Requests /// /// Request to create a poll option /// - public class StreamPollOptionRequest : ISavableTo, ISavableTo + public class StreamPollOptionRequest : ISavableTo, ISavableTo2 { /// /// Custom data for the option @@ -20,7 +20,7 @@ public class StreamPollOptionRequest : ISavableTo, /// public string Text { get; set; } - PollOptionRequestInternalDTO ISavableTo.SaveToDto() + PollOptionRequestInternalDTO ISavableTo2.SaveToDto() { return new PollOptionRequestInternalDTO { diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs index 85c4921e..0dc6c564 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs @@ -63,7 +63,7 @@ QueryBannedUsersRequestInternalDTO ISavableTo(), + Sort = Sort.TrySaveToDtoCollection2(), }; } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs index 24d12886..c9054444 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs @@ -4,7 +4,7 @@ namespace StreamChat.Core.Requests { - public sealed class StreamSortParam : ISavableTo, ISavableTo + public sealed class StreamSortParam : ISavableTo, ISavableTo2 { public int? Direction { get; set; } @@ -17,7 +17,7 @@ SortParamInternalDTO ISavableTo.SaveToDto() => Field = Field, }; - SortParamRequestInternalDTO ISavableTo.SaveToDto() => + SortParamRequestInternalDTO ISavableTo2.SaveToDto() => new SortParamRequestInternalDTO { Direction = Direction, diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs index aa04f4a7..623424ee 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs @@ -7,7 +7,7 @@ namespace StreamChat.Core.Requests { - public sealed class StreamUserUpsertRequest : ISavableTo, ISavableTo + public sealed class StreamUserUpsertRequest : ISavableTo, ISavableTo2 { /// /// Expiration date of the ban @@ -56,7 +56,7 @@ public sealed class StreamUserUpsertRequest : ISavableTo public StreamCustomDataRequest CustomData { get; set; } - UserObjectRequestInternalDTO ISavableTo.SaveToDto() + UserObjectRequestInternalDTO ISavableTo2.SaveToDto() => new UserObjectRequestInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs b/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs index 70db31a4..6e06bfc0 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs @@ -20,15 +20,15 @@ public Cache(StreamChatClient stateClient, ISerializer serializer, ILogs logs) Polls = new CacheRepository(trackedObjectsFactory.CreateStreamPoll, cache: this); Channels.RegisterDtoIdMapping(dto => dto.Channel.Cid); - Channels.RegisterDtoIdMapping(dto => dto.Cid); - Channels.RegisterDtoIdMapping(dto => dto.Channel.Cid); - Channels.RegisterDtoIdMapping(dto => dto.Channel.Cid); + Channels.RegisterDtoIdMapping2(dto => dto.Cid); + Channels.RegisterDtoIdMapping3(dto => dto.Channel.Cid); + Channels.RegisterDtoIdMapping4(dto => dto.Channel.Cid); Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); + Users.RegisterDtoIdMapping2(dto => dto.Id); + Users.RegisterDtoIdMapping3(dto => dto.Id); + Users.RegisterDtoIdMapping4(dto => dto.Id); + Users.RegisterDtoIdMapping5(dto => dto.Id); LocalUser.RegisterDtoIdMapping(dto => dto.Id); @@ -44,7 +44,7 @@ public Cache(StreamChatClient stateClient, ISerializer serializer, ILogs logs) }); Messages.RegisterDtoIdMapping(dto => dto.Id); - Messages.RegisterDtoIdMapping(dto => dto.Id); + Messages.RegisterDtoIdMapping2(dto => dto.Id); Polls.RegisterDtoIdMapping(dto => dto.Id); } diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs b/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs index 3cafdca7..5fcb621b 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs @@ -35,37 +35,74 @@ public void RegisterDtoIdMapping(Func idGetter) where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom where TDto : class { - var key = typeof(TDto); + RegisterDtoIdMappingInternal(idGetter); + } - if (_dtoIdGetters.ContainsKey(key)) - { - throw new InvalidOperationException("Key is already registered: " + key); - } + public void RegisterDtoIdMapping2(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom2 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); + } - string Wrapper(object obj) => idGetter(obj as TDto); + public void RegisterDtoIdMapping3(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom3 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); + } - _dtoIdGetters.Add(key, Wrapper); + public void RegisterDtoIdMapping4(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom4 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); + } + + public void RegisterDtoIdMapping5(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom5 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); } public TType CreateOrUpdate(TDto dto, out bool wasCreated) where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom { - wasCreated = false; - var trackingId = GetDtoMappingId(dto); - if (!TryGet(trackingId, out var trackedObject)) - { - trackedObject = _constructor(trackingId); - wasCreated = true; - } + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } - var typedStatefulModel = trackedObject as TType; - if (typedStatefulModel == null) - { - throw new InvalidOperationException($"Failed to cast {typeof(TStatefulModel)} to {typeof(TType)}"); - } + public TType CreateOrUpdate2(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom2 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } + + public TType CreateOrUpdate3(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom3 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } + public TType CreateOrUpdate4(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom4 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } + public TType CreateOrUpdate5(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom5 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); return typedStatefulModel; } @@ -110,6 +147,40 @@ internal CacheRepository(ConstructorHandler constructor, ICache cache) _cache = cache ?? throw new ArgumentNullException(nameof(cache)); } + private void RegisterDtoIdMappingInternal(Func idGetter) where TDto : class + { + var key = typeof(TDto); + + if (_dtoIdGetters.ContainsKey(key)) + { + throw new InvalidOperationException("Key is already registered: " + key); + } + + string Wrapper(object obj) => idGetter(obj as TDto); + + _dtoIdGetters.Add(key, Wrapper); + } + + private TType GetOrCreateStatefulModel(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel + { + wasCreated = false; + var trackingId = GetDtoMappingId(dto); + if (!TryGet(trackingId, out var trackedObject)) + { + trackedObject = _constructor(trackingId); + wasCreated = true; + } + + var typedStatefulModel = trackedObject as TType; + if (typedStatefulModel == null) + { + throw new InvalidOperationException($"Failed to cast {typeof(TStatefulModel)} to {typeof(TType)}"); + } + + return typedStatefulModel; + } + private readonly List _statefulModels = new List(); private readonly Dictionary _statefulModelById = new Dictionary(); diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs index 383ed72b..68f3b26d 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs @@ -10,7 +10,7 @@ public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageInternal => dto == null ? null : cache.Messages.CreateOrUpdate(dto, out _); public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageResponseInternalDTO dto) - => dto == null ? null : cache.Messages.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Messages.CreateOrUpdate2(dto, out _); public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageInternalDTO dto, out bool wasCreated) { @@ -23,20 +23,20 @@ public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageInternal public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelResponseInternalDTO dto) => dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out _); + : cache.Channels.CreateOrUpdate2(dto, out _); public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelResponseInternalDTO dto, out bool wasCreated) { wasCreated = false; return dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out wasCreated); + : cache.Channels.CreateOrUpdate2(dto, out wasCreated); } public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelStateResponseFieldsInternalDTO dto) => dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out _); + : cache.Channels.CreateOrUpdate3(dto, out _); public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelStateResponseInternalDTO dto) => dto == null @@ -46,7 +46,7 @@ public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelStateRes public static StreamChannel TryCreateOrUpdate(this ICache cache, UpdateChannelResponseInternalDTO dto) => dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out _); + : cache.Channels.CreateOrUpdate4(dto, out _); public static StreamChannelMember TryCreateOrUpdate(this ICache cache, ChannelMemberInternalDTO dto) => dto == null @@ -54,7 +54,7 @@ public static StreamChannelMember TryCreateOrUpdate(this ICache cache, ChannelMe : cache.ChannelMembers.CreateOrUpdate(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, UserResponseInternalDTO dto) - => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Users.CreateOrUpdate2(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, UserObjectInternalDTO dto) => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); @@ -72,10 +72,10 @@ public static StreamLocalUserData TryCreateOrUpdate(this ICache cache, OwnUserIn => dto == null ? null : cache.LocalUser.CreateOrUpdate(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, FullUserResponseInternalDTO dto) - => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Users.CreateOrUpdate4(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, UserEventPayloadInternalDTO dto) - => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Users.CreateOrUpdate5(dto, out _); public static StreamPoll TryCreateOrUpdate(this ICache cache, PollResponseDataInternalDTO dto) => dto == null ? null : cache.Polls.CreateOrUpdate(dto, out _); diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs index 3227671f..4915e68b 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs @@ -20,9 +20,37 @@ void RegisterDtoIdMapping(Func idGetter) where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom where TDto : class; + void RegisterDtoIdMapping2(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom2 + where TDto : class; + + void RegisterDtoIdMapping3(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom3 + where TDto : class; + + void RegisterDtoIdMapping4(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom4 + where TDto : class; + + void RegisterDtoIdMapping5(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom5 + where TDto : class; + TType CreateOrUpdate(TDto dto, out bool wasCreated) where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom; + TType CreateOrUpdate2(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom2; + + TType CreateOrUpdate3(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom3; + + TType CreateOrUpdate4(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom4; + + TType CreateOrUpdate5(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom5; + void Remove(TTrackedObject trackedObject); } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs b/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs index c2e8d94f..8646d449 100644 --- a/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs +++ b/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs @@ -80,6 +80,73 @@ public static void TryAppendUniqueTrackedObjects(this IList(this IList target, IEnumerable dtos, + ICacheRepository repository) + where TTracked : class, IStreamStatefulModel, IUpdateableFrom2 + { + if (target == null) + { + throw new ArgumentException(nameof(target)); + } + + if (dtos == null) + { + return; + } + + target.Clear(); + + foreach (var dto in dtos) + { + var trackedItem = repository.CreateOrUpdate2(dto, out _); + try + { + target.Add(trackedItem); + } + catch + { + } + } + } + + public static void TryAppendUniqueTrackedObjects2(this IList target, + IEnumerable dtos, ICacheRepository repository) + where TTracked : class, IStreamStatefulModel, IUpdateableFrom2 + { + if (target == null) + { + throw new ArgumentException(nameof(target)); + } + + if (dtos == null) + { + return; + } + + _uniqueElements.Clear(); + + foreach (var t in target) + { + _uniqueElements.Add(t); + } + + foreach (var dto in dtos) + { + var trackedItem = repository.CreateOrUpdate2(dto, out _); + + if (_uniqueElements.Add(trackedItem)) + { + try + { + target.Add(trackedItem); + } + catch + { + } + } + } + } + private static readonly HashSet _uniqueElements = new HashSet(); } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs b/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs index 7829caae..8b1bce7a 100644 --- a/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs +++ b/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs @@ -17,6 +17,12 @@ internal interface IStateLoadableFrom TDomain LoadFromDto(TDto dto, ICache cache); } + internal interface IStateLoadableFrom2 + where TDomain : IStateLoadableFrom2 + { + TDomain LoadFromDto(TDto dto, ICache cache); + } + /// /// Extensions for /// @@ -32,7 +38,18 @@ public static TDomain TryLoadFromDto(this IStateLoadableFrom(this IStateLoadableFrom2 loadable, TDto dto, ICache cache) + where TDomain : class, IStateLoadableFrom2, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto, cache); + } + public static TDomain LoadFromDto(this IStateLoadableFrom loadable, TDto dto, ICache cache) where TDomain : class, IStateLoadableFrom, new() { @@ -49,6 +66,22 @@ public static TDomain LoadFromDto(this IStateLoadableFrom(this IStateLoadableFrom2 loadable, TDto dto, ICache cache) + where TDomain : class, IStateLoadableFrom2, new() + { + if (dto == null) + { + return null; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto, cache); + } + [Pure] public static List TryLoadFromDtoCollection(this List _, List dtos, ICache cache) where TSource : IStateLoadableFrom, new() @@ -68,6 +101,24 @@ public static List TryLoadFromDtoCollection(this List TryLoadFromDtoCollection2(this List _, List dtos, ICache cache) + where TSource : IStateLoadableFrom2, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto, cache)); + } + + return items; + } /// /// Regular = non tracked objects @@ -98,6 +149,35 @@ public static void TryReplaceRegularObjectsFromDto(this List + /// Regular = non tracked objects + /// + public static void TryReplaceRegularObjectsFromDto2(this List target, List dtos, ICache cache) + where TSource : IStateLoadableFrom2, new() + { + if (typeof(TSource) is IStreamStatefulModel) + { + throw new InvalidOperationException("This method should not be used for tracked objects"); + } + + if (dtos == null) + { + return; + } + + if (target == null) + { + throw new ArgumentNullException(nameof(target)); + } + + target.Clear(); + + foreach (var dto in dtos) + { + target.Add(new TSource().LoadFromDto(dto, cache)); + } + } + /// /// Values = value types /// diff --git a/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs b/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs index 3aca193c..8b75f908 100644 --- a/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs +++ b/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs @@ -7,4 +7,28 @@ internal interface IUpdateableFrom { void UpdateFromDto(TDto dto, ICache cache); } + + internal interface IUpdateableFrom2 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom2 + { + void UpdateFromDto(TDto dto, ICache cache); + } + + internal interface IUpdateableFrom3 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom3 + { + void UpdateFromDto(TDto dto, ICache cache); + } + + internal interface IUpdateableFrom4 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom4 + { + void UpdateFromDto(TDto dto, ICache cache); + } + + internal interface IUpdateableFrom5 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom5 + { + void UpdateFromDto(TDto dto, ICache cache); + } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs b/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs index e03ef744..d9a3d90a 100644 --- a/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs +++ b/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs @@ -9,5 +9,29 @@ public static void TryUpdateFromDto(this IUpdateableFrom(this IUpdateableFrom2 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom2 + { + updateable?.UpdateFromDto(dto, cache); + } + + public static void TryUpdateFromDto(this IUpdateableFrom3 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom3 + { + updateable?.UpdateFromDto(dto, cache); + } + + public static void TryUpdateFromDto(this IUpdateableFrom4 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom4 + { + updateable?.UpdateFromDto(dto, cache); + } + + public static void TryUpdateFromDto(this IUpdateableFrom5 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom5 + { + updateable?.UpdateFromDto(dto, cache); + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs index 6bbd03f0..daf18f4b 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs @@ -37,9 +37,9 @@ public delegate void StreamMessageReactionHandler(IStreamChannel channel, IStrea internal sealed class StreamChannel : StreamStatefulModelBase, IUpdateableFrom, - IUpdateableFrom, - IUpdateableFrom, - IUpdateableFrom, + IUpdateableFrom2, + IUpdateableFrom3, + IUpdateableFrom4, IStreamChannel { public event StreamChannelMessageHandler MessageReceived; @@ -631,12 +631,12 @@ void IUpdateableFrom.UpdateFromD //This is needed because Channel.Members can be null while this is filled _members.TryAppendUniqueTrackedObjects(dto.Members, cache.ChannelMembers); Membership = cache.TryCreateOrUpdate(dto.Membership); - _messages.TryAppendUniqueTrackedObjects(dto.Messages, cache.Messages); + _messages.TryAppendUniqueTrackedObjects2(dto.Messages, cache.Messages); _pendingMessages.TryReplaceRegularObjectsFromDto(dto.PendingMessages, cache); - _pinnedMessages.TryReplaceTrackedObjects(dto.PinnedMessages, cache.Messages); - _read.TryReplaceRegularObjectsFromDto(dto.Read, cache); + _pinnedMessages.TryReplaceTrackedObjects2(dto.PinnedMessages, cache.Messages); + _read.TryReplaceRegularObjectsFromDto2(dto.Read, cache); WatcherCount = GetOrDefault(dto.WatcherCount, WatcherCount); - _watchers.TryAppendUniqueTrackedObjects(dto.Watchers, cache.Users); + _watchers.TryAppendUniqueTrackedObjects2(dto.Watchers, cache.Users); #endregion @@ -645,7 +645,7 @@ void IUpdateableFrom.UpdateFromD //StreamTodo should every UpdateFromDto trigger Updated event? } - void IUpdateableFrom.UpdateFromDto( + void IUpdateableFrom3.UpdateFromDto( ChannelStateResponseFieldsInternalDTO dto, ICache cache) { UpdateChannelFieldsFromDto(dto.Channel, cache); @@ -656,23 +656,23 @@ void IUpdateableFrom.Updat //HideMessagesBefore = dto.HideMessagesBefore; Updated from Channel _members.TryReplaceTrackedObjects(dto.Members, cache.ChannelMembers); Membership = cache.TryCreateOrUpdate(dto.Membership); - _messages.TryAppendUniqueTrackedObjects(dto.Messages, cache.Messages); + _messages.TryAppendUniqueTrackedObjects2(dto.Messages, cache.Messages); _pendingMessages.TryReplaceRegularObjectsFromDto(dto.PendingMessages, cache); - _pinnedMessages.TryReplaceTrackedObjects(dto.PinnedMessages, cache.Messages); - _read.TryReplaceRegularObjectsFromDto(dto.Read, cache); + _pinnedMessages.TryReplaceTrackedObjects2(dto.PinnedMessages, cache.Messages); + _read.TryReplaceRegularObjectsFromDto2(dto.Read, cache); WatcherCount = GetOrDefault(dto.WatcherCount, WatcherCount); - _watchers.TryAppendUniqueTrackedObjects(dto.Watchers, cache.Users); + _watchers.TryAppendUniqueTrackedObjects2(dto.Watchers, cache.Users); SortMessagesByCreatedAt(); #endregion } - void IUpdateableFrom.UpdateFromDto(ChannelResponseInternalDTO dto, + void IUpdateableFrom2.UpdateFromDto(ChannelResponseInternalDTO dto, ICache cache) => UpdateChannelFieldsFromDto(dto, cache); - void IUpdateableFrom.UpdateFromDto( + void IUpdateableFrom4.UpdateFromDto( UpdateChannelResponseInternalDTO dto, ICache cache) { UpdateChannelFieldsFromDto(dto.Channel, cache); diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs index c5f37bf3..82acfd30 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.StatefulModels { internal sealed class StreamLocalUserData : StreamStatefulModelBase, - IUpdateableFrom, IUpdateableFrom, IStreamLocalUserData + IUpdateableFrom, IUpdateableFrom2, IStreamLocalUserData { #region OwnUser @@ -46,7 +46,7 @@ void IUpdateableFrom.UpdateFromDto(OwnU #endregion - User = cache.Users.CreateOrUpdate(dto, out _); + User = cache.Users.CreateOrUpdate3(dto, out _); LoadAdditionalProperties(dto.AdditionalProperties); @@ -55,7 +55,7 @@ void IUpdateableFrom.UpdateFromDto(OwnU #endif } - void IUpdateableFrom.UpdateFromDto(WrappedUnreadCountsResponseInternalDTO dto, + void IUpdateableFrom2.UpdateFromDto(WrappedUnreadCountsResponseInternalDTO dto, ICache cache) { TotalUnreadCount = GetOrDefault(dto.TotalUnreadCount, TotalUnreadCount); diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs index 41046b0e..9323932b 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs @@ -15,7 +15,7 @@ namespace StreamChat.Core.StatefulModels { internal sealed class StreamMessage : StreamStatefulModelBase, - IStreamMessage, IUpdateableFrom, IUpdateableFrom + IStreamMessage, IUpdateableFrom, IUpdateableFrom2 { public event StreamMessageReactionHandler ReactionAdded; public event StreamMessageReactionHandler ReactionRemoved; @@ -236,7 +236,7 @@ void IUpdateableFrom.UpdateFromDto(MessageInt LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(MessageResponseInternalDTO dto, ICache cache) + void IUpdateableFrom2.UpdateFromDto(MessageResponseInternalDTO dto, ICache cache) { _attachments.TryReplaceRegularObjectsFromDto(dto.Attachments, cache); //BeforeMessageSendFailed = GetOrDefault(dto.BeforeMessageSendFailed, BeforeMessageSendFailed); @@ -248,10 +248,10 @@ void IUpdateableFrom.UpdateFromDto(Me _iI18n.TryReplaceValuesFromDto(dto.I18n); Id = GetOrDefault(dto.Id, Id); //_imageLabels.TryReplaceValuesFromDto(dto.ImageLabels); //StreamTodo: NOT IMPLEMENTED - _latestReactions.TryReplaceRegularObjectsFromDto(dto.LatestReactions, cache); - _mentionedUsers.TryReplaceTrackedObjects(dto.MentionedUsers, cache.Users); + _latestReactions.TryReplaceRegularObjectsFromDto2(dto.LatestReactions, cache); + _mentionedUsers.TryReplaceTrackedObjects2(dto.MentionedUsers, cache.Users); //dto.Mml ignored because its only server-side - _ownReactions.TryReplaceRegularObjectsFromDto(dto.OwnReactions, cache); + _ownReactions.TryReplaceRegularObjectsFromDto2(dto.OwnReactions, cache); ParentId = GetOrDefault(dto.ParentId, ParentId); PinExpires = GetOrDefault(dto.PinExpires, PinExpires); Pinned = GetOrDefault(dto.Pinned, Pinned); @@ -267,8 +267,8 @@ void IUpdateableFrom.UpdateFromDto(Me ShowInChannel = GetOrDefault(dto.ShowInChannel, ShowInChannel); Silent = GetOrDefault(dto.Silent, Silent); Text = GetOrDefault(dto.Text, Text); - _mentionedUsers.TryReplaceTrackedObjects(dto.MentionedUsers, cache.Users); - _threadParticipants.TryReplaceTrackedObjects(dto.ThreadParticipants, cache.Users); + _mentionedUsers.TryReplaceTrackedObjects2(dto.MentionedUsers, cache.Users); + _threadParticipants.TryReplaceTrackedObjects2(dto.ThreadParticipants, cache.Users); Type = Type.TryLoadFromDto(dto.Type); UpdatedAt = GetOrDefault(dto.UpdatedAt, UpdatedAt); User = cache.TryCreateOrUpdate(dto.User); diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs index 92446cee..edf721ea 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs @@ -17,7 +17,7 @@ namespace StreamChat.Core.StatefulModels /// internal sealed class StreamUser : StreamStatefulModelBase, IUpdateableFrom, - IUpdateableFrom, IUpdateableFrom, IUpdateableFrom, IUpdateableFrom, + IUpdateableFrom2, IUpdateableFrom3, IUpdateableFrom4, IUpdateableFrom5, IStreamUser { public event StreamUserPresenceHandler PresenceChanged; @@ -166,7 +166,7 @@ void IUpdateableFrom.UpdateFromDto(UserObject LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(UserResponseInternalDTO dto, + void IUpdateableFrom2.UpdateFromDto(UserResponseInternalDTO dto, ICache cache) { BanExpires = GetOrDefault(dto.BanExpires, BanExpires); @@ -193,7 +193,7 @@ void IUpdateableFrom.UpdateFromDto(UserResp LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(OwnUserInternalDTO dto, ICache cache) + void IUpdateableFrom3.UpdateFromDto(OwnUserInternalDTO dto, ICache cache) { #region OwnUser @@ -231,7 +231,7 @@ void IUpdateableFrom.UpdateFromDto(OwnUserIntern LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(FullUserResponseInternalDTO dto, + void IUpdateableFrom4.UpdateFromDto(FullUserResponseInternalDTO dto, ICache cache) { BanExpires = GetOrDefault(dto.BanExpires, BanExpires); @@ -258,7 +258,7 @@ void IUpdateableFrom.UpdateFromDto(Full LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(UserEventPayloadInternalDTO dto, + void IUpdateableFrom5.UpdateFromDto(UserEventPayloadInternalDTO dto, ICache cache) { BanExpires = GetOrDefault(dto.BanExpires, BanExpires); diff --git a/Assets/Plugins/StreamChat/Core/StreamChatClient.cs b/Assets/Plugins/StreamChat/Core/StreamChatClient.cs index ba4021b2..2281b501 100644 --- a/Assets/Plugins/StreamChat/Core/StreamChatClient.cs +++ b/Assets/Plugins/StreamChat/Core/StreamChatClient.cs @@ -226,7 +226,7 @@ public async Task GetLatestUnreadCountsAsync() var dto = await InternalLowLevelClient.InternalChannelApi.GetUnreadCountsAsync(); var response = dto.ToDomain(); - _localUserData.TryUpdateFromDto(dto, _cache); + ((IUpdateableFrom2)_localUserData).TryUpdateFromDto(dto, _cache); return response; }