
O SDK oficial da unidade para bate -papo por fluxo.
Site | Tutorial | Documentação do SDK | Registre -se para a chave da API

O STREAM Chat SDK é o SDK oficial do Unity para o stream Chat, um serviço para criar bate -papo e jogos de mensagens e aplicativos.
IL2CPP é suportado
Webgl é suportado
O stream é gratuito para a maioria dos projetos laterais e de hobby. Você pode usar o bate -papo de fluxo gratuitamente com menos de cinco membros da equipe e não mais que US $ 10.000 em receita mensal. Visite nosso site e solicite a conta dos fabricantes.
.unitypackage baixadoConfira nosso tutorial sobre como configurar seu projeto e executar operações básicas.
Na pasta StreamChat/SampleProject você encontrará um exemplo de bate -papo totalmente funcional com:

Criado com o sistema de interface do usuário UGUI da Unity e suporta o Legacy e o Sistema de entrada da nova unidade.
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene e Hit PlayComo ativar o novo sistema de entrada da Unity?:
Multiple precompiled assemblies with the same name Newtonsoft.Json.dll included or the current platform. Only one assembly with the same name is allowed per platform.
Você pode remover o [email protected] Diretório. Observe que, no entanto, o pacote da Unity para o Newtonsoft JSON possui suporte ao IL2CPP. Se você deseja substituí -lo e ainda usar o IL2CPP, verifique se a implementação JSON de sua escolha também suporta o IL2CPP.
Aqui estão algumas amostras rápidas de código para você começar. Para obter informações detalhadas, verifique nossa documentação
StreamChatClient - o principal gerente de bate -papo que permite se conectar com o servidor de bate -papo de fluxo, criar canais, canais de consulta, usuários e membros com base nos critérios fornecidosStreamChannel - canais os usuários do grupo em uma conversa. Dependendo das configurações, os usuários podem precisar ingressar nos canais como membros para enviar mensagensStreamUser - represente um único usuário em seu aplicativoStreamChannelMember - Objeto representando um usuário que é membro de um canal específico. Este objeto contém a propriedade member.User para acessar o objeto do usuárioStreamMessage - representa uma única mensagem em um canal Usuário o StreamChatClient.CreateDefaultClient(); Método da fábrica para criar uma instância de IStreamChatClient :
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}A maneira mais fácil de começar é permitir a autorização do desenvolvedor e conectar-se com os tokens de autenticação gerados pelo cliente:
var userId = StreamChatClient . SanitizeUserId ( "user-name" ) ;
var userToken = StreamChatClient . CreateDeveloperAuthToken ( userId ) ;
// Replace API_KEY with your Api Key from the Stream Dashboard
var localUserData = await Client . ConnectUserAsync ( "API_KEY" , userId , userToken ) ; Todas as funções que aguardam a resposta do servidor que você pode chamar usando a sintaxe C# Modern Async/Aguarl .AsCallback()
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; O método .AsCallback() aceita dois delegados: Action<TResponse> onSuccess e a Action<Exception> onFailure que você pode usar para reagir ao caso de resposta bem -sucedido e de resposta. Em vez disso, os retornos de chamada lambda, você também pode fornecer métodos com a mesma assinatura que no exemplo abaixo:
public void ConnectUser ( )
{
var userId = StreamChatClient . SanitizeUserId ( "user-name" ) ;
var userToken = StreamChatClient . CreateDeveloperAuthToken ( userId ) ;
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( OnUserConnected , OnUserConnectionFailed ) ;
}
private void OnUserConnected ( IStreamLocalUserData localUserData )
{
Debug . Log ( "User connected: " + localUserData . User . Name ) ;
}
private void OnUserConnectionFailed ( Exception exception )
{
Debug . LogException ( exception ) ;
} Aconselhamos fortemente o uso da sintaxe async/await , que, como você notará nos exemplos a seguir, torna o código muito mais simples e fácil de ler e manter.
Depois de conectado, poderá começar a usar canais para que os usuários possam enviar mensagens.
Existem 2 maneiras de criar canais:
Para canais predefinidos aos quais os usuários podem entrar. Isso é ótimo para quaisquer canais ou clãs de uso geral, clubes, grupos que os usuários possam participar ou sair.
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;ou com um retorno de chamada:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; Ótimo para mensagens de grupo público ou privado, a ordem dos usuários no grupo não importa, sempre que os usuários estiverem conectados usando esse método, eles sempre verão seu histórico de bate -papo:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ; Para navegar em todos os canais ou canais filtrados por alguns critérios, use Client.QueryChannelsAsync
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . Cid . In ( "channel-cid" , "channel-2-cid" , "channel-3-cid" )
} ;
var sort = ChannelSort . OrderByAscending ( ChannelSortFieldName . CreatedAt ) ;
var channels = await Client . QueryChannelsAsync ( filters , sort ) ;O mecanismo de filtragem é muito poderoso e permite combinar várias regras. Você pode verificar a lista completa dos campos e operadores disponíveis que você pode usar para consultar o canal aqui.
// Each operator usually supports multiple argument types to match your needs
ChannelFilter . Cid . EqualsTo ( "channel-cid" ) ; // string
ChannelFilter . Cid . EqualsTo ( channel ) ; // IStreamChannel
ChannelFilter . Cid . In ( "channel-cid" , "channel-2-cid" , "channel-3-cid" ) ; // Comma separated strings
var channelCids = new List < string > { "channel-1-cid" , "channel-2-cid" } ;
ChannelFilter . Cid . In ( channelCids ) ; // Any collection of string var filters = new IFieldFilterRule [ ]
{
ChannelFilter . CreatedById . EqualsTo ( Client . LocalUserData . User )
} ; var filters = new IFieldFilterRule [ ]
{
ChannelFilter . MembersCount . GreaterThan ( 10 )
} ; var weekAgo = DateTime . Now . AddDays ( - 7 ) . Date ;
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . CreatedAt . GreaterThan ( weekAgo )
} ; var dayAgo = DateTime . Now . AddHours ( - 24 ) ;
var filters = new IFieldFilterRule [ ]
{
ChannelFilter . UpdatedAt . GreaterThan ( dayAgo )
} ; As mensagens são acessíveis pela propriedade channel.Messages que contém a coleta das mensagens mais recentes. Porque pode haver potencialmente milhares de mensagens em um histórico de canal, a coleção de channel.Messages . Você pode carregar mensagens mais antigas chamando o channel.LoadOlderMessagesAsync() que carregarão parte adicional do histórico. Uma abordagem comum é chamar channel.LoadOlderMessagesAsync() sempre que os usuários atingem o final de suas mensagens Visualização de rolagem, dessa maneira, você carrega apenas mensagens mais antigas quando o usuário realmente deseja visualizá -las. Você pode ver um exemplo dessa abordagem no MessagelistView.cs do Projeto de amostra
var sentMessage = await channel . SendNewMessageAsync ( "Hello" ) ; var messageInThread = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
ParentId = parentMessage . Id , // Write in thread
ShowInChannel = false , // Optionally send to both thread and the main channel like in Slack
Text = "Hello" ,
} ) ; var messageWithQuote = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
QuotedMessage = quotedMessage , // Reference to IStreamMessage
Text = "Hello" ,
} ) ;Mensagens silenciosas não acionam eventos para membros do canal. Freqüentemente usado para mensagens do sistema
var silentMessage = await channel . SendNewMessageAsync ( new StreamSendMessageRequest
{
Text = "System message" ,
Silent = true
} ) ; await message . PinAsync ( ) ; await message . PinAsync ( new DateTime ( ) . AddDays ( 7 ) ) ; // Pin for 7 days await message . UnpinAsync ( ) ; await message . UpdateAsync ( new StreamUpdateMessageRequest
{
Text = "New changed message" ,
} ) ; await message . UpdateAsync ( new StreamUpdateMessageRequest
{
CustomData = new StreamCustomDataRequest
{
{ "CategoryId" , 12 } ,
{ "Awards" , new string [ ] { "Funny" , "Inspirational" } }
}
} ) ;Apenas limpa o texto, mas deixa outros dados relacionados, reações, sub-mensagens de encadeamento, etc.
await message . SoftDeleteAsync ( ) ; Remove uma mensagem completamente e remove todos os dados relacionados a esta mensagem
await messageInChannel . HardDeleteAsync ( ) ; await message . SendReactionAsync ( "like" ) ; await message . SendReactionAsync ( "clap" , 10 ) ; await message . SendReactionAsync ( "love" , enforceUnique : true ) ; await message . DeleteReactionAsync ( "like" ) ; // Get file byte array however you want e.g. Addressables.LoadAsset, Resources.Load, etc.
var sampleFile = File . ReadAllBytes ( "path/to/file" ) ;
var fileUploadResponse = await channel . UploadFileAsync ( sampleFile , "my-file-name" ) ;
var fileWebUrl = fileUploadResponse . FileUrl ; var sampleImage = File . ReadAllBytes ( "path/to/file" ) ;
var imageUploadResponse = await channel . UploadImageAsync ( sampleFile , "my-image-name" ) ;
var imageWebUrl = imageUploadResponse . FileUrl ; var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , channelId : "my-channel-id" ) ;
await channel . DeleteFileOrImageAsync ( "file-url" ) ; Os objetos de canal estão sendo atualizados automaticamente sempre que qualquer alteração ocorre (novas mensagens, reações etc.). Você pode reagir a essas mudanças assinando os eventos expostos IStreamChannel :
channel . MessageReceived += OnMessageReceived ;
channel . MessageUpdated += OnMessageUpdated ;
channel . MessageDeleted += OnMessageDeleted ;
channel . ReactionAdded += OnReactionAdded ;
channel . ReactionUpdated += OnReactionUpdated ;
channel . ReactionRemoved += OnReactionRemoved ; var localUserData = Client . LocalUserData ;
var localUser = localUserData . User ;StreamUser que representa o usuário no dispositivo local var users = await Client . QueryUsersAsync ( ) ; var users = await Client . QueryUsersAsync ( new Dictionary < string , object > ( )
{
{
"id" , new Dictionary < string , object >
{
{ "$eq" , otherUserId }
}
}
} ) ;
var otherUser = users . First ( ) ; var filters = new Dictionary < string , object >
{
{
"id" , new Dictionary < string , object >
{
{
"$in" , listOfUserIds
}
}
}
} ;
var users = await Client . QueryUsersAsync ( filters ) ;Leia mais sobre parâmetros e operadores de consulta suportados
Dependendo da configuração do seu aplicativo, os usuários podem precisar ingressar nos canais como membros para enviar mensagens ou ver mensagens de outros usuários
// Multiple overloads available depending on your needs
await channel . AddMembersAsync ( user ) ; // instance of IStreamUser
await channel . AddMembersAsync ( user1 , user1 ) ; // Multiple instances of IStreamUser
await channel . AddMembersAsync ( listOfUsers ) ; // List<IStreamUser>
await channel . AddMembersAsync ( "user-id" ) ; // string ID
await channel . AddMembersAsync ( listOfUserIds ) ; // List<string> that contains IDs // Multiple overloads available depending on your needs
await channel . RemoveMembersAsync ( member ) ; // instance of IStreamChannelMember
await channel . RemoveMembersAsync ( member1 , member2 ) ; // Multiple instances of IStreamChannelMember
await channel . RemoveMembersAsync ( listOfMembers ) ; // List<IStreamChannelMember>
await channel . RemoveMembersAsync ( user ) ; // instance of IStreamUser
await channel . RemoveMembersAsync ( user1 , user1 ) ; // Multiple instances of IStreamUser
await channel . RemoveMembersAsync ( listOfUsers ) ; // List<IStreamUser>
await channel . RemoveMembersAsync ( "user-id" ) ; // string ID
await channel . RemoveMembersAsync ( listOfUserIds ) ; // List<string> that contains IDsO Stream fornece todas as ferramentas e recursos necessários para gerenciar adequadamente uma grande comunidade.
Sinalização significa que esse usuário ou mensagem será relatado com a moderação do bate -papo. Administradores e moderadores de bate -papo podem visualizar usuários e mensagens relatados no painel.
await user . FlagAsync ( ) ; await message . FlagAsync ( ) ; await channel . BanUserAsync ( user ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; A proibição do IP ajuda a impedir o caso em que o usuário cria uma nova conta para ignorar a proibição.
await channel . BanUserAsync ( user , timeoutMinutes : 120 , isIpBan : true ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; var request = new StreamQueryBannedUsersRequest
{
CreatedAtAfterOrEqual = new DateTimeOffset ( ) . AddHours ( - 24 ) ,
Limit = 30 ,
Offset = 0 ,
} ;
var bannedUsersInfo = await Client . QueryBannedUsersAsync ( request ) ;O usuário proibido de Shadow não sabe que está sendo banido. Às vezes, isso é útil porque leva um tempo adicional para um usuário perceber que ele está proibido.
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;Os exemplos acima são apenas alguns de muitos - confira nossa documentação completa para obter mais informações e exemplos
Vá em frente e abra o problema do GitHub com sua solicitação e responderemos o mais rápido possível.
Alcançar nosso apoio.
Recentemente, fechamos uma rodada de financiamento da Série B de US $ 38 milhões e continuamos crescendo ativamente. Nossas APIs são usadas por mais de um bilhão de usuários finais e você terá a chance de causar um enorme impacto no produto dentro de uma equipe dos engenheiros mais fortes de todo o mundo. Confira nossas aberturas atuais e aplique no site da Stream.