อย่างเป็นทางการ. NET API Client สำหรับสตรีมแชทบริการสำหรับการสร้างแอปพลิเคชันแชท
สำรวจเอกสาร»
ตัวอย่างรหัส·รายงานข้อผิดพลาด·คุณลักษณะการร้องขอ
คุณสามารถสมัครใช้งานบัญชีสตรีมได้ที่หน้าเริ่มต้นของเรา
คุณสามารถใช้ไลบรารีนี้เพื่อเข้าถึงการแชทปลายทางด้านปลายเซิร์ฟเวอร์
สำหรับการรวมฝั่งไคลเอ็นต์ (เว็บและมือถือ) ให้ดูที่ไลบรารี JavaScript, iOS และ Android SDK (เอกสาร)
ทำลายการเปลี่ยนแปลงใน v1.0 <
ห้องสมุดได้รับการเปลี่ยนแปลงมากมายใน v1.0 เพื่อให้ใช้งานได้ง่ายขึ้นและบำรุงรักษาได้มากขึ้นในอนาคต การเปลี่ยนแปลงที่สำคัญคือทั้งคลาส
ChannelและClientได้ถูกแยกออกเป็นโมดูลขนาดเล็กที่เราเรียกว่าลูกค้า (สิ่งนี้รวบรวมโครงสร้างของห้องสมุด Java ของเราอีกด้วย) การเปลี่ยนแปลงหลัก:
- คลาส
ChannelและClientหายไปและได้รับการจัดระเบียบเป็นไคลเอนต์ขนาดเล็กในStreamChat.ClientsNamespace- ลูกค้าเหล่านี้ไม่ได้รักษาสถานะเป็น
Channelที่เคยทำก่อนหน้านี้ซึ่งมันเก็บchannelTypeและchannelIdในหน่วยความจำ ดังนั้นนี่หมายความว่าคุณจะต้องผ่านchannelTypeและchannelIdไปยังวิธีการโทรจำนวนมากในIChannelClient- ชื่อวิธีการ Async มีคำต่อท้าย
Asyncในขณะนี้- วิธีการสาธารณะและชั้นเรียนทั้งหมดมีเอกสาร
- ตัวระบุได้ถูกเปลี่ยนชื่อจาก
IDเป็นIdเพื่อติดตามคู่มือการตั้งชื่อของ Microsoft เช่นuserID->userId- คลาสข้อมูลจำนวนมากได้รับการเปลี่ยนชื่อเพื่อให้เข้าใจได้มากขึ้น เช่น
ChannelObject->Channel- คลาสข้อมูลได้ถูกย้ายไปที่
StreamChat.ModelsNamespace- ฟีเจอร์เต็มรูปแบบ: API แบ็กเอนด์ทั้งหมดมีให้บริการ
- ค่าที่ส่งคืนเป็นประเภทของ
ApiResponseและการเปิดเผยอัตราการ จำกัด อัตราด้วยวิธีGetRateLimit()- โครงสร้างโฟลเดอร์ของโครงการได้รับการจัดระเบียบใหม่เพื่อทำตามคำแนะนำของ Microsoft
- การทดสอบหน่วยได้รับการปรับปรุง พวกเขามีขนาดเล็กลงโฟกัสมากขึ้นและมีวิธีการทำความสะอาด
- เพิ่มการสนับสนุน. NET 6.0
การใช้ห้องสมุดที่เหมาะสม:
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-netเคล็ดลับ: คุณสามารถค้นหาตัวอย่างรหัสในโฟลเดอร์ตัวอย่าง
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" ] ) ;
} เรายินดีต้อนรับการเปลี่ยนแปลงรหัสที่ปรับปรุงไลบรารีนี้หรือแก้ไขปัญหาโปรดตรวจสอบให้แน่ใจว่าได้ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดทั้งหมดและเพิ่มการทดสอบหากมีก่อนที่จะส่งคำขอดึงบน GitHub เรามีความสุขมากที่จะรวมรหัสของคุณในที่เก็บอย่างเป็นทางการ ตรวจสอบให้แน่ใจว่าได้ลงนามข้อตกลงใบอนุญาตผู้สนับสนุน (CLA) ก่อน ดูไฟล์ใบอนุญาตของเราสำหรับรายละเอียดเพิ่มเติม
ตรงไปที่การบริจาค MD สำหรับเคล็ดลับการพัฒนาบางอย่าง
เมื่อเร็ว ๆ นี้เราได้ปิดการระดมทุนรอบ 38 ล้านเหรียญสหรัฐและเรายังคงเติบโตอย่างแข็งขัน API ของเราถูกใช้โดยผู้ใช้ปลายทางมากกว่าพันล้านคนและคุณจะมีโอกาสสร้างผลกระทบอย่างมากต่อผลิตภัณฑ์ภายในทีมวิศวกรที่แข็งแกร่งที่สุดทั่วโลก
ตรวจสอบช่องเปิดปัจจุบันของเราและสมัครผ่านเว็บไซต์ของสตรีม