val channelClient = client.channel("messaging", "general")
// Add members with ids "thierry" and "josh"
channelClient.addMembers(listOf("thierry", "josh")).enqueue { result ->
if (result.isSuccess) {
val channel: Channel = result.data()
} else {
// Handle result.error()
}
}
// Remove member with id "tommaso"
channelClient.removeMembers("tommaso").enqueue { result ->
if (result.isSuccess) {
val channel: Channel = result.data()
} else {
// Handle result.error()
}
}
Updating Channel Members
Adding & Removing Channel Members
Using the addMembers()
method adds the given users as members, while removeMembers()
removes them.
await channel.addMembers(['thierry', 'josh']);
await channel.removeMembers(['tommaso']);
// Add user to the channel with role set
await channel.addMembers([{user_id:"james_bond", channel_role:"channel_moderator"}]);
// Add new channel member with custom data
await channel.addMembers([{user_id:"james_bond", code_name:"007"}]);
await channel.addMembers(["thierry", "josh"]);
await channel.removeMembers(["tommaso"]);
$channel->addMembers(['thierry', 'jenny']);
$channel->removeMembers(['thierry', 'jenny']);
import Stream Chat
let controller = chatClient.channelController(for: .init(type: .messaging, id: "general"))
controller.addMembers(userIds: ["thierry", "josh"])
controller.removeMembers(userIds: ["tommaso"])
err := channel.AddMembers([]string{"thierry"}, nil, nil)
Channel->AddMembers({TEXT("thierry"), TEXT("josh")});
Channel->RemoveMembers({TEXT("tommaso")});
channel.add_members(["thierry", "josh"])
channel.remove_members(["tommaso"])
await channelClient.AddMembersAsync("channel-type", "channel-id", "thierry", "josh");
await channelClient.RemoveMembersAsync("channel-type", "channel-id", new[] { "thierry", "josh" });
channel.add_members(["thierry", "josh"])
channel.remove_members(["tommaso"])
// Android SDK
ChannelClient channelClient = client.channel("messaging", "general");
// Add members with ids "thierry" and "josh"
channelClient.addMembers(Arrays.asList("thierry", "josh"), null).enqueue(result -> {
if (result.isSuccess()) {
Channel channel = result.data();
} else {
// Handle result.error()
}
});
// Remove member with id "tommaso"
channelClient.removeMembers(Arrays.asList("tommaso"), null).enqueue(result -> {
if (result.isSuccess()) {
Channel channel = result.data();
} else {
// Handle result.error()
}
});
// Backend SDK
// Add members with ids "thierry" and "josh"
Channel.update("messaging", "general")
.addMembers(Arrays.asList("thierry", "josh"))
.request();
});
// Remove member with id "tommaso"
Channel.update("messaging", "general")
.removeMember("tommaso")
.request();
});
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
var filters = new IFieldFilterRule[]
{
UserFilter.Id.In("other-user-id-1", "other-user-id-2", "other-user-id-3")
};
var users = await Client.QueryUsersAsync(filters);
// Add IStreamUser collection as a members
await channel.AddMembersAsync(users);
// Or add by ID
await channel.AddMembersAsync("some-user-id-1", "some-user-id-2");
// Access channel members via channel.Members, let's remove the first member as an example
var member = channel.Members.First();
await channel.RemoveMembersAsync(member);
// Remove local user from a channel by user ID
var localUser = Client.LocalUserData.User;
await channel.RemoveMembersAsync(localUser.Id);
// Remove multiple users by their ID
await channel.RemoveMembersAsync("some-user-id-1", "some-user-id-2");
Note: You can only add/remove up to 100 members at once.
Members can also be added while creating the channel.
const channel = client.channel('messaging', randomID, {
members: [
{ user_id: "james_bond", code_name: "007" },
{ user_id: "alec_trevelyan", code_name: "006" },
{ user_id: "bill_fairbanks", code_name: "002" },
});
await channel.create();
/// 1: Use the `ChatClient` to create a `ChatChannelController` with a list of user ids
let channelId = ChannelId(type: .messaging, id: "general")
let channelController = try chatClient.channelController(
createChannelWithId: channelId,
members: ["thierry", "tommaso"]
)
/// 2: Call `ChatChannelController.synchronize` to create the channel.
channelController.synchronize { error in
if let error = error {
/// 4: Handle possible errors
print(error)
}
}
Stream Chat has a soft cap of 3000 channel memberships per user. If your use case requires >3000 channel memberships per user, consider removing users from channels or using elevated permissions to allow a user to access channels without membership if your use case allows
Message parameter
You can optionally include a message object that client-side SDKs will use to populate a system message. This works for both add and remove members
val channelClient = client.channel("messaging", "general")
// Add members with ids "thierry" and "josh"
channelClient.addMembers(
listOf("thierry", "josh"),
Message(text = "Thierry and Josh joined this channel.")
).enqueue { result ->
if (result.isSuccess) {
val channel: Channel = result.data()
} else {
// Handle result.error()
}
}
// Remove member with id "tommaso"
channelClient.removeMembers(
listOf("tommaso"),
Message(text = "Tommaso was removed from this channel.")
).enqueue { result ->
if (result.isSuccess) {
val channel: Channel = result.data()
} else {
// Handle result.error()
}
}
// using client-side client
await channel.addMembers(['tommaso'], { text: 'Tommaso joined the channel.' });
// using server-side client
await channel.addMembers(['tommaso'], { text: 'Tommaso joined the channel.', user_id: 'tommaso' });
err := channel.AddMembers([]string{"tommaso"}, &Message{Text: "Tommaso joined the channel.", User: &User{ID: "tommaso"}}, nil)
channel.add_members(["tommaso", "josh"], { "text": 'Tommaso joined the channel.', "user_id": 'tommaso' })
$channel->addMembers(['tommaso'], ["message" =>
["text" => "Tommaso joined the channel.", "user_id" => "tommaso"]
]);
var msg = new MessageRequest { Text: "Tommaso joined the channel", UserId: "tommaso" };
await channelClient.AddMembersAsync("channel-type", "channel-id", new[] {"tommaso"}, msg, null);
channel.add_members(["tommaso", "josh"], message: { "text" => 'Tommaso joined the channel.', "user_id" => 'tommaso' })
// Android SDK
ChannelClient channelClient = client.channel("messaging", "general");
Message addMemberSystemMessage = new Message();
addMemberSystemMessage.setText("Thierry and Josh were added to this channel");
// Add members with ids "thierry" and "josh"
channelClient.addMembers(Arrays.asList("thierry", "josh"), addMemberSystemMessage).enqueue(result -> {
if (result.isSuccess()) {
Channel channel = result.data();
} else {
// Handle result.error()
}
});
Message removeMemberSystemMessage = new Message();
addMemberSystemMessage.setText("Tommaso was removed from this channel");
// Remove member with id "tommaso"
channelClient.removeMembers(Arrays.asList("tommaso"), removeMemberSystemMessage).enqueue(result -> {
if (result.isSuccess()) {
Channel channel = result.data();
} else {
// Handle result.error()
}
});
// Backend SDK
MessageRequestObject msg = MessageRequestObject
.builder()
.text("Thierry and Josh were added to this channel")
.build();
// Add members with ids "thierry" and "josh"
ChannelUpdateResponse resp = Channel.update("messaging", "general")
.addMembers(Arrays.asList("thierry", "josh"))
.message(msg)
.request();
MessageRequestObject msg = MessageRequestObject
.builder()
.text("Tommaso was removed from this channel")
.build();
// Remove member with id "tommaso"
ChannelUpdateResponse resp = Channel.update("messaging", "general")
.removeMember("tommaso")
.message(msg)
.request();
Channel->AddMembers({TEXT("tommaso")}, FMessage{TEXT("Tommaso joined the channel.")});
await channel.AddMembersAsync(users, hideHistory: default, new StreamMessageRequest
{
Text = "John has joined the channel"
});
channelController.addMembers(
userIds: ["tommaso"],
message: "Tommaso joined the channel"
) { error in
// …
}
Hide history
When members join a channel you can specify if they have access to the history or not. The history will be shown by default, set true
to hide_history
parameter to hide it for new members.
await channel.addMembers(['thierry'], undefined, { hide_history: true });
options := map[string]interface{}{
"hide_history": true,
}
err := channel.AddMembers([]string{"thierry"}, nil, options)
channel.add_members(["thierry"], hide_history=True)
$channel->addMembers(["thierry"], ["hide_history" => true]);
await channelClient.AddMembersAsync("channel-type", "channel-id", new[] {"thierry"}, null, new AddMemberOptions { HideHistory = true })
channel.add_members(["tommaso", "josh"], hide_history: true)
// Backend SDK
Channel.update("channel-type", "channel-type")
.addMember("thierry")
.hideHistory(true)
.request();
await channel.AddMembersAsync(users, hideHistory: true);
channelController.addMembers(
userIds: ["thierry"],
hideHistory: true
) { error in
// …
}
Leaving a channel
It is possible for user to leave the channel without moderator-level permissions. Make sure channel members have Leave Own Channel
permission.
// remove own channel membership
await channel.removeMembers(['my_user_id']);
resp, err := ch.RemoveMembers(ctx, []string{"my_user_id"})
channel.remove_members(["my_user_id"])
$channel->removeMembers(['my_user_id']);
await channelClient.RemoveMembersAsync("channel-type", "channel-id", new[] { "my_user_id" });
channel.remove_members(["my_user_id"])
// Backend SDK
Channel.update("channel-type", "channel-type")
.removeMember("my_user_id")
.request();
Channel->RemoveMembers({TEXT("my-user-id")});
await channel.RemoveMembersAsync(member);
channelController.removeMembers(
userIds: ["john"]
) { error in
// …
}
You can familiarize yourself with all permissions in Permissions section
Adding & Removing Moderators to a Channel
Using the addModerators()
method adds the given users as moderators (or updates their role to moderator if already members), while demoteModerators()
removes the moderator status.
await channel.addModerators(['thierry', 'josh']);
await channel.demoteModerators(['tommaso']);
channel.add_moderators(["thierry", "josh"]);
channel.demote_moderators(["tommaso"]);
channel.add_moderators(["thierry", "josh"])
channel.demote_moderators(["tommaso"])
$channel->addModerators(['thierry', 'jenny']);
$channel->demoteModerators(['thierry', 'jenny']);
// Backend SDK
Channel.update("channel-type", "channel-type").addModerator("thierry").addModerator("josh").request();
Channel.update("channel-type", "channel-type").demoteModerator("tommaso").request();
await channelClient.AddModeratorsAsync("channel-type", "channel-type", new[] { "thierry", "josh" });
await channelClient.DemoteModeratorsAsync("channel-type", "channel-type", new[] { "tommaso" });
newModerators := []string{"bob", "sue"}
err = channel.AddModerators("thierry", "josh")
err = channel.AddModerators(newModerators...)
err = channel.DemoteModerators(newModerators...)
// Will be implemented soon, raise a GitHub issue if you need this feature https://github.com/GetStream/stream-chat-unity/issues/
These operations can only be performed server-side and up to 100 moderators can be added or removed at once.