Skip to content

Commit 61527a4

Browse files
authored
Add optional hide history & message parameters to IStreamChannel.AddMembersAsync (#127)
1 parent fc6c9a3 commit 61527a4

12 files changed

Lines changed: 270 additions & 90 deletions

Assets/Plugins/StreamChat/Core/InternalDTO/Requests/UpdateChannelRequestInternalDTO.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ internal partial class UpdateChannelRequestInternalDTO
3232
/// List of user IDs to make channel moderators
3333
/// </summary>
3434
[Newtonsoft.Json.JsonProperty("add_moderators", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
35-
public System.Collections.Generic.List<string> AddModerators { get; set; } = new System.Collections.Generic.List<string>();
35+
public System.Collections.Generic.List<string> AddModerators { get; set; }
3636

3737
/// <summary>
3838
/// List of channel member role assignments. If any specified user is not part of the channel, the request will fail
@@ -53,7 +53,7 @@ internal partial class UpdateChannelRequestInternalDTO
5353
/// List of user IDs to take away moderators status from
5454
/// </summary>
5555
[Newtonsoft.Json.JsonProperty("demote_moderators", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
56-
public System.Collections.Generic.List<string> DemoteModerators { get; set; } = new System.Collections.Generic.List<string>();
56+
public System.Collections.Generic.List<string> DemoteModerators { get; set; }
5757

5858
/// <summary>
5959
/// Set to `true` to hide channel's history when adding new members
@@ -83,7 +83,7 @@ internal partial class UpdateChannelRequestInternalDTO
8383
/// List of user IDs to remove from the channel
8484
/// </summary>
8585
[Newtonsoft.Json.JsonProperty("remove_members", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
86-
public System.Collections.Generic.List<string> RemoveMembers { get; set; } = new System.Collections.Generic.List<string>();
86+
public System.Collections.Generic.List<string> RemoveMembers { get; set; }
8787

8888
/// <summary>
8989
/// When `message` is set disables all push notifications for it
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using StreamChat.Core.Helpers;
4+
using StreamChat.Core.InternalDTO.Requests;
5+
using StreamChat.Core.LowLevelClient;
6+
using StreamChat.Core.State;
7+
using StreamChat.Core.StatefulModels;
8+
9+
namespace StreamChat.Core.Requests
10+
{
11+
public class StreamMessageRequest : ISavableTo<MessageRequestInternalDTO>
12+
{
13+
/// <summary>
14+
/// Array of message attachments
15+
/// </summary>
16+
public List<StreamAttachmentRequest> Attachments { get; set; }
17+
18+
/// <summary>
19+
/// Message ID is unique string identifier of the message
20+
/// </summary>
21+
public string Id { get; set; }
22+
23+
/// <summary>
24+
/// List of mentioned users
25+
/// </summary>
26+
public List<IStreamUser> MentionedUsers { get; set; }
27+
28+
/// <summary>
29+
/// ID of parent message (thread)
30+
/// </summary>
31+
public string ParentId { get; set; }
32+
33+
/// <summary>
34+
/// Date when pinned message expires
35+
/// </summary>
36+
public DateTimeOffset? PinExpires { get; set; }
37+
38+
/// <summary>
39+
/// Whether message is pinned or not
40+
/// </summary>
41+
public bool? Pinned { get; set; }
42+
43+
/// <summary>
44+
/// Date when message got pinned
45+
/// </summary>
46+
public DateTimeOffset? PinnedAt { get; set; }
47+
48+
/// <summary>
49+
/// Contains user who pinned the message
50+
/// </summary>
51+
public IStreamUser PinnedBy { get; set; }
52+
53+
public IStreamMessage QuotedMessage { get; set; }
54+
55+
/// <summary>
56+
/// Whether thread reply should be shown in the channel as well
57+
/// </summary>
58+
public bool? ShowInChannel { get; set; }
59+
60+
/// <summary>
61+
/// Whether message is silent or not
62+
/// </summary>
63+
public bool? Silent { get; set; }
64+
65+
/// <summary>
66+
/// Text of the message. Should be empty if `mml` is provided
67+
/// </summary>
68+
public string Text { get; set; }
69+
70+
/// <summary>
71+
/// Add or update custom data associated with this message. This will be accessible through <see cref="IStreamMessage.CustomData"/>
72+
/// </summary>
73+
public StreamCustomDataRequest CustomData { get; set; }
74+
75+
MessageRequestInternalDTO ISavableTo<MessageRequestInternalDTO>.SaveToDto()
76+
=> new MessageRequestInternalDTO
77+
{
78+
Attachments
79+
= Attachments?.TrySaveToDtoCollection<StreamAttachmentRequest, AttachmentRequestInternalDTO>(),
80+
// Cid = Cid, Purposely ignored because it has no effect and endpoint already contains channel type&id
81+
//Html = Html, Marked in DTO as server-side only
82+
Id = Id,
83+
MentionedUsers = MentionedUsers?.ToUserIdsListOrNull(),
84+
ParentId = ParentId,
85+
PinExpires = PinExpires,
86+
Pinned = Pinned,
87+
PinnedAt = PinnedAt,
88+
PinnedBy = PinnedBy?.Id,
89+
QuotedMessageId = QuotedMessage?.Id,
90+
ShowInChannel = ShowInChannel,
91+
Silent = Silent,
92+
Text = Text,
93+
AdditionalProperties = CustomData?.ToDictionary()
94+
};
95+
}
96+
}

Assets/Plugins/StreamChat/Core/Requests/StreamMessageRequest.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Plugins/StreamChat/Core/StatefulModels/IStreamChannel.cs

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public interface IStreamChannel : IStreamStatefulModel
5858
/// Event fired when a <see cref="IStreamChannelMember"/> was updated
5959
/// </summary>
6060
event StreamChannelMemberChangeHandler MemberUpdated;
61-
61+
6262
/// <summary>
6363
/// Event fired when a <see cref="IStreamChannelMember"/> was added, updated, or removed.
6464
/// </summary>
@@ -335,11 +335,14 @@ Task UpdatePartialAsync(IDictionary<string, object> setFields = null,
335335
/// Query channel members based on provided criteria. Results will not be
336336
/// </summary>
337337
/// <returns></returns>
338-
Task<IEnumerable<IStreamChannelMember>> QueryMembersAsync(IDictionary<string, object> filters = null, int limit = 30, int offset = 0);
339-
340-
[Obsolete("This method was renamed to QueryMembersAsync. Please use the QueryMembersAsync. The QueryMembers will be removed in a future release.")]
341-
Task<IEnumerable<IStreamChannelMember>> QueryMembers(IDictionary<string, object> filters = null, int limit = 30, int offset = 0);
342-
338+
Task<IEnumerable<IStreamChannelMember>> QueryMembersAsync(IDictionary<string, object> filters = null,
339+
int limit = 30, int offset = 0);
340+
341+
[Obsolete(
342+
"This method was renamed to QueryMembersAsync. Please use the QueryMembersAsync. The QueryMembers will be removed in a future release.")]
343+
Task<IEnumerable<IStreamChannelMember>> QueryMembers(IDictionary<string, object> filters = null, int limit = 30,
344+
int offset = 0);
345+
343346
void QueryWatchers(); //StreamTodo: IMPLEMENT
344347

345348
/// <summary>
@@ -416,25 +419,33 @@ Task ShadowBanMemberAsync(IStreamChannelMember member, string reason = "",
416419
/// </summary>
417420
/// <param name="clearHistory">Whether to clear message history of the channel or not</param>
418421
/// <remarks>https://getstream.io/chat/docs/unity/muting_channels/?language=unity</remarks>
419-
Task HideAsync(bool? clearHistory = false);
422+
Task HideAsync(bool? clearHistory = default);
420423

421424
/// <summary>
422425
/// Add users as members to this channel
423426
/// </summary>
424427
/// <param name="users">Users to become members of this channel</param>
425-
Task AddMembersAsync(IEnumerable<IStreamUser> users);
428+
/// <param name="hideHistory"></param>
429+
/// <param name="optionalMessage"></param>
430+
Task AddMembersAsync(IEnumerable<IStreamUser> users, bool? hideHistory = default,
431+
StreamMessageRequest optionalMessage = default);
432+
433+
/// <inheritdoc cref="AddMembersAsync(System.Collections.Generic.IEnumerable{string},System.Nullable{bool},StreamChat.Core.Requests.StreamMessageRequest)"/>
434+
Task AddMembersAsync(bool? hideHistory = default, StreamMessageRequest optionalMessage = default,
435+
params IStreamUser[] users);
426436

427-
/// <inheritdoc cref="AddMembersAsync(IEnumerable{StreamChat.Core.StatefulModels.IStreamUser})}"/>
428-
Task AddMembersAsync(params IStreamUser[] users);
429-
430437
/// <summary>
431438
/// Add users as members to this channel
432439
/// </summary>
433440
/// <param name="userIds">User IDs to become members of this channel</param>
434-
Task AddMembersAsync(IEnumerable<string> userIds);
435-
436-
/// <inheritdoc cref="AddMembersAsync(IEnumerable{System.String})}"/>
437-
Task AddMembersAsync(params string[] users);
441+
/// <param name="hideHistory">Hide history for the new members</param>
442+
/// <param name="optionalMessage"></param>
443+
Task AddMembersAsync(IEnumerable<string> userIds, bool? hideHistory = default,
444+
StreamMessageRequest optionalMessage = default);
445+
446+
/// <inheritdoc cref="AddMembersAsync(System.Collections.Generic.IEnumerable{string},System.Nullable{bool},StreamChat.Core.Requests.StreamMessageRequest)"/>
447+
Task AddMembersAsync(bool? hideHistory = default, StreamMessageRequest optionalMessage = default,
448+
params string[] users);
438449

439450
/// <summary>
440451
/// Remove members from this channel
@@ -444,7 +455,7 @@ Task ShadowBanMemberAsync(IStreamChannelMember member, string reason = "",
444455

445456
/// <inheritdoc cref="RemoveMembersAsync(IEnumerable{StreamChat.Core.StatefulModels.IStreamChannelMember})}"/>
446457
Task RemoveMembersAsync(params IStreamChannelMember[] members);
447-
458+
448459
/// <summary>
449460
/// Remove members from this channel
450461
/// </summary>
@@ -453,7 +464,7 @@ Task ShadowBanMemberAsync(IStreamChannelMember member, string reason = "",
453464

454465
/// <inheritdoc cref="RemoveMembersAsync(IEnumerable{StreamChat.Core.StatefulModels.IStreamUser})}"/>
455466
Task RemoveMembersAsync(params IStreamUser[] members);
456-
467+
457468
/// <summary>
458469
/// Remove members from this channel
459470
/// </summary>
@@ -514,13 +525,13 @@ Task TruncateAsync(DateTimeOffset? truncatedAt = default, string systemMessage =
514525
/// Stop being a member (<see cref="IStreamChannelMember"/>) of this channel. Only possible if local user has the `Leave Own Channel` permission
515526
/// </summary>
516527
Task LeaveAsMemberChannelAsync();
517-
528+
518529
/// <summary>
519530
/// Invite new members to this channel.
520531
/// </summary>
521532
/// <remarks>https://getstream.io/chat/docs/unity/channel_invites/?language=unity/</remarks>
522533
Task InviteMembersAsync(IEnumerable<string> userIds);
523-
534+
524535
/// <summary>
525536
/// Invite new members to this channel.
526537
/// </summary>
@@ -532,7 +543,7 @@ Task TruncateAsync(DateTimeOffset? truncatedAt = default, string systemMessage =
532543
/// </summary>
533544
/// <remarks>https://getstream.io/chat/docs/unity/channel_invites/?language=unity/</remarks>
534545
Task InviteMembersAsync(IEnumerable<IStreamUser> users);
535-
546+
536547
/// <summary>
537548
/// Invite new members to this channel.
538549
/// </summary>

Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -379,21 +379,25 @@ public Task ShowAsync()
379379
=> LowLevelClient.InternalChannelApi.ShowChannelAsync(Type, Id, new ShowChannelRequestInternalDTO());
380380

381381
//StreamTodo: write test
382-
public Task HideAsync(bool? clearHistory = false)
382+
public Task HideAsync(bool? clearHistory = default)
383383
=> LowLevelClient.InternalChannelApi.HideChannelAsync(Type, Id, new HideChannelRequestInternalDTO
384384
{
385385
ClearHistory = clearHistory
386386
});
387387

388-
public Task AddMembersAsync(IEnumerable<IStreamUser> users)
388+
public Task AddMembersAsync(IEnumerable<IStreamUser> users, bool? hideHistory = default,
389+
StreamMessageRequest optionalMessage = default)
389390
{
390391
StreamAsserts.AssertNotNull(users, nameof(users));
391-
return AddMembersAsync(users.Select(u => u.Id));
392+
return AddMembersAsync(users.Select(u => u.Id), hideHistory, optionalMessage);
392393
}
393394

394-
public Task AddMembersAsync(params IStreamUser[] users) => AddMembersAsync(users as IEnumerable<IStreamUser>);
395+
public Task AddMembersAsync(bool? hideHistory = default, StreamMessageRequest optionalMessage = default,
396+
params IStreamUser[] users)
397+
=> AddMembersAsync(users, hideHistory, optionalMessage);
395398

396-
public async Task AddMembersAsync(IEnumerable<string> userIds)
399+
public async Task AddMembersAsync(IEnumerable<string> userIds, bool? hideHistory = default,
400+
StreamMessageRequest optionalMessage = default)
397401
{
398402
StreamAsserts.AssertNotNull(userIds, nameof(userIds));
399403

@@ -409,12 +413,16 @@ public async Task AddMembersAsync(IEnumerable<string> userIds)
409413
var response = await LowLevelClient.InternalChannelApi.UpdateChannelAsync(Type, Id,
410414
new UpdateChannelRequestInternalDTO
411415
{
412-
AddMembers = membersRequest
416+
AddMembers = membersRequest,
417+
HideHistory = hideHistory,
418+
Message = optionalMessage?.TrySaveToDto(),
413419
});
414420
Cache.TryCreateOrUpdate(response);
415421
}
416422

417-
public Task AddMembersAsync(params string[] users) => AddMembersAsync(users as IEnumerable<string>);
423+
public Task AddMembersAsync(bool? hideHistory = default, StreamMessageRequest optionalMessage = default,
424+
params string[] users)
425+
=> AddMembersAsync(users, hideHistory, optionalMessage);
418426

419427
public Task RemoveMembersAsync(IEnumerable<IStreamChannelMember> members)
420428
{
@@ -448,7 +456,7 @@ public async Task RemoveMembersAsync(IEnumerable<string> userIds)
448456

449457
public Task RemoveMembersAsync(params string[] userIds) => RemoveMembersAsync(userIds as IEnumerable<string>);
450458

451-
public Task JoinAsMemberAsync() => AddMembersAsync(Client.LocalUserData.User);
459+
public Task JoinAsMemberAsync() => AddMembersAsync(hideHistory: default, optionalMessage: default, Client.LocalUserData.User);
452460

453461
public Task LeaveAsMemberChannelAsync() => RemoveMembersAsync(Client.LocalUserData.User);
454462

@@ -467,7 +475,7 @@ public async Task InviteMembersAsync(IEnumerable<string> userIds)
467475

468476
var updateRequest = GetUpdateRequestWithCurrentData();
469477
updateRequest.Invites = invites;
470-
478+
471479
var response = await LowLevelClient.InternalChannelApi.UpdateChannelAsync(Type, Id, updateRequest);
472480

473481
Cache.TryCreateOrUpdate(response.Channel);
@@ -484,14 +492,15 @@ public Task InviteMembersAsync(IEnumerable<IStreamUser> users)
484492
StreamAsserts.AssertNotNull(users, nameof(users));
485493
return InviteMembersAsync(users.Select(_ => _.Id));
486494
}
487-
488-
public Task InviteMembersAsync(params IStreamUser[] users) => InviteMembersAsync(users as IEnumerable<IStreamUser>);
495+
496+
public Task InviteMembersAsync(params IStreamUser[] users)
497+
=> InviteMembersAsync(users as IEnumerable<IStreamUser>);
489498

490499
public async Task AcceptInviteAsync()
491500
{
492501
var updateRequest = GetUpdateRequestWithCurrentData();
493502
updateRequest.AcceptInvite = true;
494-
503+
495504
var response = await LowLevelClient.InternalChannelApi.UpdateChannelAsync(Type, Id, updateRequest);
496505

497506
Cache.TryCreateOrUpdate(response.Channel);
@@ -505,7 +514,7 @@ public async Task RejectInviteAsync()
505514
{
506515
var updateRequest = GetUpdateRequestWithCurrentData();
507516
updateRequest.RejectInvite = true;
508-
517+
509518
var response = await LowLevelClient.InternalChannelApi.UpdateChannelAsync(Type, Id, updateRequest);
510519

511520
Cache.TryCreateOrUpdate(response.Channel);
@@ -1003,18 +1012,20 @@ private void SortMessagesByCreatedAt()
10031012
{
10041013
_messages.Sort((msg1, msg2) => msg1.CreatedAt.CompareTo(msg2.CreatedAt));
10051014
}
1006-
1007-
private UpdateChannelRequestInternalDTO GetUpdateRequestWithCurrentData() => new UpdateChannelRequestInternalDTO
1008-
{
1009-
Data = new ChannelRequestInternalDTO
1015+
1016+
private UpdateChannelRequestInternalDTO GetUpdateRequestWithCurrentData()
1017+
=> new UpdateChannelRequestInternalDTO
10101018
{
1011-
AutoTranslationEnabled = AutoTranslationEnabled,
1012-
AutoTranslationLanguage = AutoTranslationLanguage,
1013-
Disabled = Disabled,
1014-
Frozen = Frozen,
1019+
Data = new ChannelRequestInternalDTO
1020+
{
1021+
AutoTranslationEnabled = AutoTranslationEnabled,
1022+
AutoTranslationLanguage = AutoTranslationLanguage,
1023+
Disabled = Disabled,
1024+
Frozen = Frozen,
1025+
AdditionalProperties = GetInternalAdditionalPropertiesDictionary(),
1026+
Name = Name
1027+
},
10151028
AdditionalProperties = GetInternalAdditionalPropertiesDictionary(),
1016-
Name = Name
1017-
},
1018-
};
1029+
};
10191030
}
10201031
}

0 commit comments

Comments
 (0)