Client officiel de l'API .NET pour Stream Chat, un service de création d'applications de chat.
Explorez les documents »
Échantillons de code · Rapport Bogue · Fonction de demande
Vous pouvez vous inscrire à un compte Stream sur notre page de démarrage.
Vous pouvez utiliser cette bibliothèque pour accéder à la côté du serveur API de CHAT.
Pour les intégrations côté client (Web et mobile), jetez un œil aux bibliothèques JavaScript, iOS et Android SDK (DOC).
Breaking Changes in v1.0 <
La bibliothèque a reçu de nombreux changements dans V1.0 pour le rendre plus facile à utiliser et plus maintenable à l'avenir. Le principal changement est que les classes
ChanneletClientont été séparées en petits modules que nous appelons les clients. (Cela résiste également à la structure de notre bibliothèque Java.) Modifications principales:
- Les classes
ChanneletClientont disparu et ont été organisées en petits clients dansStreamChat.ClientsNamespace.- Ces clients ne maintiennent pas l'état comme
Channelle fait plus tôt où il a gardé lechannelTypeetchannelIddans la mémoire. Cela signifie donc que vous devrez passer danschannelTypeetchannelIdvers de nombreux appels de méthode dansIChannelClient.- Les noms de méthodes asynchrones ont maintenant un suffixe
Async.- Toutes les méthodes et classes publiques ont une documentation.
- Les identifiants ont été renommés de
IDàIdpour suivre le guide de dénomination de Microsoft. CommeuserID->userId.- De nombreuses classes de données ont été renommées pour avoir plus de sens. Comme
ChannelObject->Channel.- Les classes de données ont été déplacées vers
StreamChat.ModelsEspace.- Parité complète des fonctionnalités: toutes les API backend sont disponibles.
- Les valeurs renvoyées sont le type d'
ApiResponseet d'exposer la limite de taux Informaiton avec la méthodeGetRateLimit().- La structure du dossier du projet a été réorganisée pour suivre la recommandation de Microsoft.
- Les tests unitaires ont été améliorés. Ils sont plus petits, plus concentrés et ont des méthodes de nettoyage.
- Ajout de la prise en charge de .NET 6.0.
L'utilisation appropriée de la bibliothèque:
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-netAstuce: vous pouvez trouver des échantillons de code dans le dossier des échantillons.
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" ] ) ;
} Nous accueillons des modifications de code qui améliorent cette bibliothèque ou résolvons un problème, assurez-vous de suivre toutes les meilleures pratiques et d'ajouter des tests le cas échéant avant de soumettre une demande de traction sur GitHub. Nous sommes très heureux de fusionner votre code dans le référentiel officiel. Assurez-vous d'abord de signer notre accord de licence de contributeur (CLA). Voir notre fichier de licence pour plus de détails.
Rendez-vous à contribuer.MD pour certains conseils de développement.
Nous avons récemment clôturé un tour de financement de la série B de 38 millions de dollars et nous continuons à croître activement. Nos API sont utilisées par plus d'un milliard d'utilisateurs finaux, et vous aurez la possibilité d'avoir un impact énorme sur le produit au sein d'une équipe des ingénieurs les plus forts du monde entier.
Consultez nos ouvertures actuelles et postulez via le site Web de Stream.