Klien .NET API resmi untuk Obrolan Stream, Layanan untuk Membangun Aplikasi Obrolan.
Jelajahi dokumen »
Sampel Kode · Laporkan Bug · Fitur Permintaan
Anda dapat mendaftar untuk akun streaming di halaman Get Start kami.
Anda dapat menggunakan pustaka ini untuk mengakses Obrolan API Endpoints Sisi Server.
Untuk integrasi sisi klien (web dan seluler), lihat JavaScript, iOS dan Android SDK Libraries (dokumen).
Melanggar perubahan dalam v1.0 <
Perpustakaan menerima banyak perubahan di v1.0 untuk membuatnya lebih mudah digunakan dan lebih dapat dipelihara di masa depan. Perubahan utama adalah bahwa kelas
ChanneldanClienttelah dipisahkan menjadi modul kecil yang kami sebut klien. (Ini juga merusak struktur Perpustakaan Java kami.) Perubahan utama:
- Kelas
ChanneldanClienthilang, dan telah diatur menjadi klien yang lebih kecil diStreamChat.ClientsNamespace klien.- Klien -klien ini tidak mempertahankan status seperti yang dulu dilakukan
Channeldi mana ia menjagachannelTypedanchannelIddi memori. Jadi ini berarti Anda harus lulus dichannelTypedanchannelIdke banyak panggilan metode diIChannelClient.- Nama metode async memiliki akhiran
Asyncsekarang.- Semua metode dan kelas publik memiliki dokumentasi.
- Identifier telah diganti namanya dari
IDmenjadiIduntuk mengikuti Panduan Penamaan Microsoft. SepertiuserID->userId.- Banyak kelas data telah diganti namanya menjadi lebih masuk akal. Seperti
ChannelObject->Channel.- Kelas data telah dipindahkan ke
StreamChat.Modelsnamespace.- Paritas fitur lengkap: Semua API backend tersedia.
- Nilai yang dikembalikan adalah jenis
ApiResponsedan ekspose batas laju informaiton dengan metodeGetRateLimit().- Struktur folder proyek telah direorganisasi untuk mengikuti rekomendasi Microsoft.
- Tes unit telah ditingkatkan. Mereka lebih kecil, lebih fokus dan memiliki metode pembersihan.
- Menambahkan dukungan .NET 6.0.
Penggunaan perpustakaan yang tepat:
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 ) ;
$ dotnet add package stream-chat-netTip: Anda dapat menemukan sampel kode di folder sampel.
using StreamChat . Clients ; // 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 ( ) ; 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 ) ) ; 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 } ) ; var userClient = clientFactory . GetUserClient ( ) ;
await userClient . ExportAsync ( "bob-1" ) ;
await userClient . DeactivateAsync ( "bob-1" ) ;
await userClient . ReactivateAsync ( "bob-1" ) ;
await userClient . DeleteAsync ( "bob-1" ) ; 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 ( ) ; 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 ) ; 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 ) var reactionClient = clientFactory . GetReactionClient ( ) ;
await reactionClient . SendReactionAsync ( message . Id , "like" , bob . Id ) ;
var allReactions = await reactionClient . GetReactionsAsync ( message . Id ) ; 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 ) ; 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 }
} ) ; 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 ) ; 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" ] ) ;
} Kami menyambut perubahan kode yang meningkatkan perpustakaan ini atau memperbaiki masalah, pastikan untuk mengikuti semua praktik terbaik dan menambahkan tes jika berlaku sebelum mengirimkan permintaan tarik di github. Kami sangat senang menggabungkan kode Anda di repositori resmi. Pastikan untuk menandatangani Perjanjian Lisensi Kontributor (CLA) kami terlebih dahulu. Lihat file lisensi kami untuk lebih jelasnya.
Pergilah ke Kontribusi.MD untuk beberapa tips pengembangan.
Kami baru -baru ini menutup putaran pendanaan Seri B $ 38 juta dan kami terus tumbuh secara aktif. API kami digunakan oleh lebih dari satu miliar pengguna akhir, dan Anda akan memiliki kesempatan untuk membuat dampak besar pada produk dalam tim insinyur terkuat di seluruh dunia.
Lihatlah pembukaan kami saat ini dan terapkan melalui situs web Stream.