stream-chat-net
2.6.0
dotnet add package stream-chat-net --version 2.6.0
NuGet\Install-Package stream-chat-net -Version 2.6.0
<PackageReference Include="stream-chat-net" Version="2.6.0" />
paket add stream-chat-net --version 2.6.0
#r "nuget: stream-chat-net, 2.6.0"
// Install stream-chat-net as a Cake Addin #addin nuget:?package=stream-chat-net&version=2.6.0 // Install stream-chat-net as a Cake Tool #tool nuget:?package=stream-chat-net&version=2.6.0
Official .NET SDK for Stream Chat
<p align="center"> <img src="./assets/logo.svg" width="50%" height="50%"> </p> <p align="center"> Official .NET API client for Stream Chat, a service for building chat applications. <br /> <a href="https://getstream.io/chat/docs/"><strong>Explore the docs ยป</strong></a> <br /> <br /> <a href="https://github.com/GetStream/stream-chat-net/tree/master/samples">Code Samples</a> ยท <a href="https://github.com/GetStream/stream-chat-net/issues">Report Bug</a> ยท <a href="https://github.com/GetStream/stream-chat-net/issues">Request Feature</a> </p>
๐ About Stream
You can sign up for a Stream account at our Get Started page.
You can use this library to access chat API endpoints server-side.
For the client-side integrations (web and mobile) have a look at the JavaScript, iOS and Android SDK libraries (docs).
๐จ Breaking changes in v1.0 <
The library received many changes in v1.0 to make it easier to use and more maintanable in the future. The main change is that both
Channel
andClient
classes have been separated into small modules that we call clients. (This resambles the structure of our Java library as well.) Main changes:
Channel
andClient
classes are gone, and have been organized into smaller clients inStreamChat.Clients
namespace.- These clients do not maintain state as
Channel
used to did earlier where it kept thechannelType
andchannelId
in the memory. So this means that you'll need to pass inchannelType
andchannelId
to a lot of method calls inIChannelClient
.- Async method names have
Async
suffix now.- All public methods and classes have documentation.
- Identifiers has been renamed from
ID
toId
to follow Microsoft's naming guide. Such asuserID
โuserId
.- A lot of data classes have been renamed to make more sense. Such as
ChannelObject
โChannel
.- Data classes have been moved to
StreamChat.Models
namespace.- Full feature parity: all backend APIs are available.
- Returned values are type of
ApiResponse
and expose rate limit informaiton withGetRateLimit()
method.- The folder structure of the project has been reorganized to follow Microsoft's recommendation.
- Unit tests have been improved. They are smaller, more focused and have cleanup methods.
- Added .NET 6.0 support.
The proper usage of the library:
var clientFactory = new StreamClientFactory("YourApiKey", "YourApiSecret"); // Note: all client instances can be used as a singleton for the lifetime // of your application as they don't maintain state. var userClient = clientFactory.GetUserClient(); var channelClient = clientFactory.GetChannelClient(); var messageClient = clientFactory.GetMessageClient(); var reactionClient = clientFactory.GetReactionClient(); var jamesBond = await userClient.UpsertAsync(new UserRequest { Id = "james_bond" }); var agentM = await userClient.UpsertAsync(new UserRequest { Id = "agent_m" }); var channel = await channelClient.GetOrCreateAsync("messaging", "superHeroChannel", createdBy: jamesBond.Id); await channelClient.AddMembersAsync(channel.Type, channel.Id, jamesBond.Id, agentM.Id); var message = await messageClient.SendMessageAsync(channel.Type, channel.Id, jamesBond.Id, "I need a new quest Agent M."); await reactionClient.SendReactionAsync(message.Id, "like", agentM.Id);
โ๏ธ Installation
$ dotnet add package stream-chat-net
๐ก Tip: you can find code samples in the samples folder.
โจ Getting started
Import
using StreamChat.Clients;
Initialize client
// Client factory instantiation.
var clientFactory = new StreamClientFactory("YourApiKey", "YourApiSecret");
// Or you can configure some options such as custom HttpClient, HTTP timeouts etc.
var clientFactory = new StreamClientFactory("YourApiKey", "YourApiSecret", opts => opts.Timeout = TimeSpan.FromSeconds(5));
// Get clients from client factory. Note: all clients can be used as a singleton in your application.
var channelClient = clientFactory.GetChannelClient();
var messageClient = clientFactory.GetMessageClient();
Generate a token for client-side usage
var userClient = clientFactory.GetUserClient();
// Without expiration
var token = userClient.CreateToken("bob-1");
// With expiration
var token = userClient.CreateToken("bob-1", expiration: DateTimeOffset.UtcNow.AddHours(1));
Create/Update users
var userClient = clientFactory.GetUserClient();
var bob = new UserRequest
{
Id = "bob-1",
Role = Role.Admin,
Teams = new[] { "red", "blue" } // if multi-tenant enabled
};
bob.SetData("age", 27);
await userClient.UpsertAsync(bob);
// Batch update is also supported
var jane = new UserRequest { Id = "jane"};
var june = new UserRequest { Id = "june"};
var users = await userClient.UpsertManyAsync(new[] { bob, jane, june });
GDPR-like User endpoints
var userClient = clientFactory.GetUserClient();
await userClient.ExportAsync("bob-1");
await userClient.DeactivateAsync("bob-1");
await userClient.ReactivateAsync("bob-1");
await userClient.DeleteAsync("bob-1");
Channel types
var channelTypeClient = clientFactory.GetChannelTypeClient();
var chanTypeConf = new ChannelTypeWithStringCommands
{
Name = "livechat",
Automod = Automod.Disabled,
Commands = new List<string> { Commands.Ban },
Mutes = true
};
var chanType = await channelTypeClient.CreateChannelTypeAsync(chanTypeConf);
var allChanTypes = await channelTypeClient.ListChannelTypesAsync();
Channels
var channelClient = clientFactory.GetChannelClient();
// Create a channel with members from the start, Bob is the creator
var channel = channelClient.GetOrCreateAsync("messaging", "bob-and-jane", bob.Id, bob.Id, jane.Id);
// Create channel and then add members, Mike is the creator
var channel = channelClient.GetOrCreateAsync("messaging", "bob-and-jane", mike.Id);
channelClient.AddMembersAsync(channel.Type, channel.Id, bob.Id, jane.Id, joe.Id);
Messaging
var messageClient = clientFactory.GetMessageClient();
// Only text
messageClient.SendMessageAsync(channel.Type, channel.Id, bob.Id, "Hey, I'm Bob!");
// With custom data
var msgReq = new MessageRequest { Text = "Hi june!" };
msgReq.SetData("location", "amsterdam");
var bobMessageResp = await messageClient.SendMessageAsync(channelType, channel.Id, msgReq, bob.Id);
// Threads
var juneReply = new MessageRequest { Text = "Long time no see!" };
var juneReplyMessage = await messageClient.SendMessageToThreadAsync(channel.Type, channel.Id, juneReply, june.Id, bobMessageResp.Message.Id)
Reactions
var reactionClient = clientFactory.GetReactionClient();
await reactionClient.SendReactionAsync(message.Id, "like", bob.Id);
var allReactions = await reactionClient.GetReactionsAsync(message.Id);
Moderation
var channelClient = clientFactory.GetChannelClient();
var userClient = clientFactory.GetUserClient();
var flagClient = clientFactory.GetFlagClient();
await channelClient.AddModeratorsAsync(channel.Type, channel.Id, new[] { jane.Id });
await userClient.BanAsync(new BanRequest
{
Type = channel.Type,
Id = channel.Id,
Reason = "reason",
TargetUserId = bob.Id,
UserId = jane.Id
});
await flagClient.FlagUserAsync(bob.Id, jane.Id);
Permissions
var permissionClient = clientFactory.GetPermissionClient();
await permissionClient.CreateRoleAsync("channel-boss");
// Assign users to roles (optional message)
await channelClient.AssignRolesAsync(new AssignRoleRequest
{
AssignRoles = new List<RoleAssignment>
{
new RoleAssignment { UserId = bob.ID, ChannelRole = Role.ChannelModerator },
new RoleAssignment { UserId = june.ID, ChannelRole = "channel-boss" }
},
Message = new MessageRequest { Text = "Bob and June just became mods", User = bob }
});
Devices
var deviceClient = clientFactory.GetDeviceClient();
var junePhone = new Device
{
ID = "iOS Device Token",
PushProvider = PushProvider.APN,
UserId = june.ID
};
await deviceClient.AddDeviceAsync(junePhone);
var devices = await deviceClient.GetDevicesAsync(june.Id);
Export Channels
var channelClient = clientFactory.GetChannelClient();
var taskClient = clientFactory.GetTaskClient();
var taskResponse = channelClient.ExportChannelAsync(new ExportChannelRequest { Id = channel.Id, Type = channel.Type });
// Wait for the completion
var complete = false;
var iterations = 0;
AsyncTaskStatusResponse resp = null;
while (!complete && iterations < 1000)
{
resp = await taskClient.GetTaskStatusAsync(taskResponse.TaskId);
if (resp.Status == AsyncTaskStatus.Completed)
{
complete = true;
break;
}
iterations++;
await Task.Delay(100);
}
if (complete)
{
Console.WriteLine(resp.Result["url"]);
}
โ๏ธ Contributing
We welcome code changes that improve this library or fix a problem, please make sure to follow all best practices and add tests if applicable before submitting a Pull Request on Github. We are very happy to merge your code in the official repository. Make sure to sign our Contributor License Agreement (CLA) first. See our license file for more details.
Head over to CONTRIBUTING.md for some development tips.
๐งโ๐ป We are hiring!
We've recently closed a $38 million Series B funding round and we keep actively growing. Our APIs are used by more than a billion end-users, and you'll have a chance to make a huge impact on the product within a team of the strongest engineers all over the world.
Check out our current openings and apply via Stream's website.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp1.0 was computed. netcoreapp1.1 was computed. netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard1.6 is compatible. netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net45 is compatible. net451 was computed. net452 was computed. net46 is compatible. net461 was computed. net462 was computed. net463 was computed. net47 is compatible. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen30 was computed. tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.5
- Newtonsoft.Json (>= 13.0.1)
-
.NETFramework 4.6
- Newtonsoft.Json (>= 13.0.1)
-
.NETFramework 4.7
- Newtonsoft.Json (>= 13.0.1)
-
.NETFramework 4.8
- Newtonsoft.Json (>= 13.0.1)
-
.NETStandard 1.6
- NETStandard.Library (>= 1.6.1)
- Newtonsoft.Json (>= 13.0.1)
-
.NETStandard 2.0
- Newtonsoft.Json (>= 13.0.1)
-
.NETStandard 2.1
- Newtonsoft.Json (>= 13.0.1)
-
net5.0
- Newtonsoft.Json (>= 13.0.1)
-
net6.0
- Newtonsoft.Json (>= 13.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.6.0 | 47,897 | 5/8/2024 |
2.5.0 | 30,582 | 11/8/2023 |
2.4.0 | 1,937 | 10/30/2023 |
2.3.0 | 20,832 | 7/26/2023 |
2.2.0 | 1,917 | 7/11/2023 |
2.1.2 | 4,733 | 5/9/2023 |
2.1.1 | 54,832 | 7/12/2022 |
2.1.0 | 3,694 | 5/30/2022 |
2.0.0 | 16,906 | 4/7/2022 |
1.1.1 | 2,438 | 2/14/2022 |
1.1.0 | 754 | 2/8/2022 |
1.0.0 | 1,538 | 2/1/2022 |
0.26.0 | 6,886 | 12/22/2021 |
0.25.0 | 348 | 12/15/2021 |
0.24.0 | 1,355 | 12/6/2021 |
0.23.0 | 1,008 | 12/3/2021 |
0.22.0 | 4,818 | 11/16/2021 |
0.21.0 | 2,654 | 11/11/2021 |
0.20.1 | 2,453 | 11/1/2021 |
0.19.0 | 8,567 | 8/19/2021 |
0.18.0 | 592 | 8/19/2021 |
0.17.0 | 5,287 | 7/19/2021 |
0.16.0 | 3,006 | 6/25/2021 |
0.15.0 | 502 | 6/17/2021 |
0.14.0 | 10,278 | 6/1/2021 |
0.13.0 | 476 | 5/31/2021 |
0.12.0 | 3,533 | 5/7/2021 |
0.11.0 | 11,957 | 3/10/2021 |
0.10.0 | 495 | 3/3/2021 |
0.9.0 | 395 | 3/3/2021 |
0.8.1 | 2,064 | 2/2/2021 |
0.8.0 | 400 | 2/2/2021 |
0.7.1 | 663 | 1/25/2021 |
0.7.0 | 385 | 1/25/2021 |
0.6.1 | 4,460 | 11/20/2020 |
0.6.0 | 498 | 11/13/2020 |
0.5.0 | 3,086 | 10/2/2020 |
0.4.7 | 493 | 10/2/2020 |
0.4.3 | 7,674 | 6/2/2020 |
0.4.2 | 746 | 3/17/2020 |
0.4.1 | 8,114 | 12/6/2019 |
0.3.0 | 3,063 | 6/26/2019 |
0.2.0 | 622 | 5/22/2019 |
0.1.0 | 639 | 5/15/2019 |
0.0.2 | 608 | 5/10/2019 |
0.0.1 | 693 | 5/7/2019 |
## [2.6.0](https://github.com/GetStream/stream-chat-net/compare/2.5.0...2.6.0) (2024-05-08)
### Features
* Add ChannelMember.NotificationsMuted property
### Bug Fixes
* Fix invalid type of MessageModerationResult.UserKarma property ([#139](https://github.com/GetStream/stream-chat-net/issues/139)) ([340d3d0](https://github.com/GetStream/stream-chat-net/commit/340d3d0e1c085a8cca464e7ef67803ec75def23d))