공식 .NET API 클라이언트 스트림 채팅을위한 API 클라이언트, 채팅 애플리케이션 구축을위한 서비스
문서 탐색»
코드 샘플 ·보고 버그 · 요청 기능
Get Start 페이지에서 스트림 계정에 가입 할 수 있습니다.
이 라이브러리를 사용하여 채팅 API 엔드 포인트 서버 측에 액세스 할 수 있습니다.
클라이언트 측 통합 (웹 및 모바일)의 경우 JavaScript, iOS 및 Android SDK 라이브러리 (DOCS)를 살펴 봅니다.
v1.0 <
도서관은 v1.0의 많은 변화를 받아 앞으로 더 쉽게 사용할 수 있고 더 많은 메인을 사용할 수 있도록했습니다. 주요 변경 사항은
Channel및Client클래스가 클라이언트라고하는 작은 모듈로 분리된다는 것입니다. (이것은 우리의 Java 라이브러리의 구조에도 안심합니다.) 주요 변경 사항 :
Channel및Client클래스는 사라지고StreamChat.Clients네임 스페이스에서 소규모 클라이언트로 구성되었습니다.- 이 클라이언트는
channelType과channelId메모리에 유지 한 곳에서 이전에 사용했던Channel로 상태를 유지하지 않습니다. 따라서 이것은channelType및channelIdIChannelClient의 많은 방법 호출로 전달해야 함을 의미합니다.- 비동기 메소드 이름에는 이제
Async접미사가 있습니다.- 모든 공개 방법과 수업에는 문서가 있습니다.
- 식별자는
ID에서Id로 이름이 바뀌어 Microsoft의 이름 지침을 따르십시오.userID>userId와 같은.- 더 이해하기 위해 많은 데이터 클래스가 이름이 바뀌 었습니다.
ChannelObject>Channel과 같은.- 데이터 클래스는
StreamChat.Models네임 스페이스로 이동했습니다.- 전체 기능 패리티 : 모든 백엔드 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)에 먼저 서명하십시오. 자세한 내용은 라이센스 파일을 참조하십시오.
일부 개발 팁을 위해 Contributing.md로 가십시오.
우리는 최근 3 천 8 백만 달러의 시리즈 B 자금 조달 라운드를 마감했으며 계속 적극적으로 성장하고 있습니다. 우리의 API는 10 억 명 이상의 최종 사용자가 사용하며 전 세계에서 가장 강력한 엔지니어 팀 내에서 제품에 큰 영향을 줄 수 있습니다.
현재 오프닝을 확인하고 Stream의 웹 사이트를 통해 신청하십시오.