
Официальный Unity SDK для потокового чата.
Веб -сайт | Учебник | Документация SDK | Зарегистрируйтесь для ключа API

Streamt Chat SDK - это официальный Unity SDK для потокового чата, услуга для строительного чата и обмена сообщениями и приложений.
IL2CPP поддерживается
WebGL поддерживается
Поток бесплатный для большинства боковых и хобби. Вы можете использовать Stream Chat бесплатно с менее чем пятью членами команды и не более чем в 10 000 долларов США в размере ежемесячного дохода. Посетите наш веб -сайт и подайте заявку на учетную запись производителей.
.unitypackageОзнакомьтесь с нашим руководством о том, как настроить свой проект и выполнить основные операции.
В папке StreamChat/SampleProject вы найдете полностью рабочий пример чата с включением:

Создан с помощью системы UGOI Unity Ugui и поддерживает как Legacy, так и систему ввода New Unity.
StreamChat/SampleProject/Config/DemoCredentials.assetStreamChat/SampleProject/Scenes/ChatDemo.scene и нажимайте PlayКак включить новую систему ввода 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.
Вы можете удалить [email protected] . Однако обратите внимание, что пакет Unity для Newtonsoft Json имеет поддержку IL2CPP. Если вы хотите заменить его и при этом использовать IL2CPP, убедитесь, что JSON реализация по вашему выбору также поддерживает IL2CPP.
Вот несколько быстрых образцов кода, чтобы вы начали. Для получения подробной информации, пожалуйста, ознакомьтесь с нашей документацией
StreamChatClient - Основной менеджер чата, который позволяет вам подключаться к серверу потокового чата, создавать каналы, каналы запросов, пользователи и участники на основе предоставленных критериевStreamChannel - каналы группы группы в разговоре. В зависимости от ваших настроек, которые пользователям может потребоваться присоединиться к каналам в качестве участников, чтобы отправлять сообщенияStreamUser - представляйте одного пользователя в вашем приложенииStreamChannelMember - объект, представляющий пользователя, который является членом определенного канала. Этот объект содержит member.User для доступа к объекту пользователяStreamMessage - представляет одно сообщение в канале Пользователь StreamChatClient.CreateDefaultClient(); фабричный метод создания экземпляра IStreamChatClient :
public class ChatManager : MonoBehaviour
{
public IStreamChatClient Client { get ; private set ; }
protected void Awake ( )
{
Client = StreamChatClient . CreateDefaultClient ( ) ;
}
}Самый простой способ начать-включить авторизацию разработчика и подключиться к клиентским токенам, сгенерированным на стороне клиента:
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 ) ; Каждая функция, которая ожидает ответа с сервера, вы можете либо позвонить, используя C# Modern Async/Await Syntax или добавить .AsCallback() и использовать в качестве классических обратных вызовов следующим образом:
Client . ConnectUserAsync ( "API_KEY" , userId , userToken )
. AsCallback ( onSuccess : result =>
{
var localUserData = result ;
} , onFailure : exception =>
{
Debug . LogException ( exception ) ;
} ) ; Метод .AsCallback() принимает два делегата: Action<TResponse> onSuccess и Action<Exception> onFailure , которое вы можете использовать для реагирования как на успешный, так и на случай ответа на ошибку. Вместо этого Lambda обратные вызовы вы также можете предоставить методы с той же подписью, что и в примере ниже:
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 ) ;
} Мы настоятельно рекомендуем использовать синтаксис async/await , который, как вы заметите в следующих примерах, делает код намного проще и проще для чтения и обслуживания.
После подключения вы можете начать использовать каналы, чтобы пользователи могли отправлять сообщения.
Есть 2 способа создания каналов:
Для предопределенных каналов, к которым могут присоединиться пользователи. Это отлично подходит для любых каналов или кланов общего назначения, клубов, групп, с которыми пользователи могут присоединиться или уйти.
var channel = await Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" ) ;или с обратным вызовом:
Client . GetOrCreateChannelWithIdAsync ( ChannelType . Messaging , "my-channel-id" )
. AsCallback ( channel =>
{
Debug . Log ( $ "Channel { channel . Id } created successfully" ) ;
} , exception =>
{
Debug . LogException ( exception ) ;
} ) ; Отлично подходит для публичных или частных групповых сообщений, порядок пользователей в группе не имеет значения, поэтому, когда пользователи подключены, используя этот метод, они всегда будут видеть свою историю чата:
var channel = await Client . GetOrCreateChannelWithMembersAsync ( ChannelType . Messaging , users ) ; Чтобы просмотреть все каналы или каналы, отфильтрованные по некоторым критериям. Используйте 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 ) ;Механизм фильтрации очень мощный и позволяет объединить несколько правил. Вы можете проверить полный список доступных полей и операторов, которые вы можете использовать для запросов каналов здесь.
// 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 )
} ; Сообщения доступны через свойство channel.Messages , которое содержит сбор самых последних сообщений. Поскольку в истории канала могут быть потенциальные сообщения, в истории channel.Messages содержит только последние сообщения. Вы можете загружать более старые сообщения, вызывая channel.LoadOlderMessagesAsync() , который загрузит дополнительную часть истории. Общим подходом является вызов channel.LoadOlderMessagesAsync() всякий раз, когда пользователи попадают в конец вашего представления прокрутки сообщений, таким образом вы загружаете только более старые сообщения, когда пользователь действительно хочет их просматривать. Вы можете увидеть пример такого подхода в MessageListView.cs Sample Project.
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" ,
} ) ;Безмолвные сообщения не запускают события для членов канала. Часто используется для системных сообщений
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" } }
}
} ) ;Только очищает текст, но оставляет другие родственные данные, реакции, подгруппы потоков и т. Д.
await message . SoftDeleteAsync ( ) ; Полностью удаляет сообщение и удаляет все данные, связанные с этим сообщением
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" ) ; Объекты канала автоматически обновляются при каких -либо изменениях (новые сообщения, реакции и т. Д.). Вы можете отреагировать на эти изменения, подписываясь на IStreamChannel Events:
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 , представляющий пользователя на локальном устройстве 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 ) ;Узнайте больше о поддерживаемых параметрах запроса и операторах
В зависимости от пользователям конфигурации вашего приложения пользователям может понадобиться присоединиться к каналам в качестве участников, чтобы отправлять сообщения или увидеть другие пользовательские сообщения
// 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 IDsStream предоставляет все необходимые инструменты и функции для правильного управления крупным сообществом.
Плачвание означает, что этот пользователь или сообщение будут сообщать о модерации чата. Администраторы чата и модераторы могут просматривать сообщенных пользователей и сообщений на панели инструментов.
await user . FlagAsync ( ) ; await message . FlagAsync ( ) ; await channel . BanUserAsync ( user ) ; await channel . BanUserAsync ( user , "You got banned for 2 hours for toxic behaviour." , 120 ) ; Запрет IP помогает предотвратить случай, когда пользователь создает новую учетную запись, чтобы обойти запрет.
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 ) ;Пользователь Shadow Banning не знает, что его запрещен. Иногда это полезно, потому что пользователю требуется дополнительное время, чтобы понять, что он запрещен.
StreamUser await channel . ShadowBanUserAsync ( user ) ; StreamChannelMember await channel . ShadowBanMemberAsync ( channelMember ) ; await user . MuteAsync ( ) ; await user . UnmuteAsync ( ) ; await channel . MuteChannelAsync ( ) ; await channel . UnmuteChannelAsync ( ) ;Приведенные выше примеры - лишь немногие из многих - ознакомьтесь с нашей полной документацией, чтобы узнать большее понимание и примеры
Идите вперед и откройте проблему GitHub с вашим запросом, и мы ответим как можно скорее.
Обратитесь к нашей поддержке.
Недавно мы закрыли раунд финансирования серии B в размере 38 миллионов долларов, и мы продолжаем активно расти. Наши API используются более чем миллиардами конечных пользователей, и у вас будет возможность оказать огромное влияние на продукт в команде самых сильных инженеров по всему миру. Ознакомьтесь с нашими текущими открытиями и примените через веб -сайт Stream.