diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/IStreamUser.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/IStreamUser.cs
index 630b3fbd..30e90a18 100644
--- a/Assets/Plugins/StreamChat/Core/StatefulModels/IStreamUser.cs
+++ b/Assets/Plugins/StreamChat/Core/StatefulModels/IStreamUser.cs
@@ -48,7 +48,7 @@ public interface IStreamUser : IStreamStatefulModel
///
/// Invisible user will appear as offline to other users
- /// You can change user visibility with
+ /// You can change user visibility with &
///
/// https://getstream.io/chat/docs/unity/presence_format/?language=unity
bool Invisible { get; }
diff --git a/Assets/Plugins/StreamChat/Samples/MessagesCodeSamples.cs b/Assets/Plugins/StreamChat/Samples/MessagesCodeSamples.cs
index 40e83172..6a354cb1 100644
--- a/Assets/Plugins/StreamChat/Samples/MessagesCodeSamples.cs
+++ b/Assets/Plugins/StreamChat/Samples/MessagesCodeSamples.cs
@@ -17,8 +17,8 @@ internal sealed class MessagesCodeSamples
///
public async Task Overview()
{
-var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
-var message = await channel.SendNewMessageAsync("Hello world!");
+ var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
+ var message = await channel.SendNewMessageAsync("Hello world!");
}
///
@@ -26,30 +26,30 @@ public async Task Overview()
///
public async Task ComplexExample()
{
-var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, "my-channel-id");
+ var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, "my-channel-id");
-IStreamUser someUser = null;
+ IStreamUser someUser = null;
// Send simple message with text only
-var message3 = await channel.SendNewMessageAsync("Hello");
+ var message3 = await channel.SendNewMessageAsync("Hello");
// Send simple message with text only
-var message2 = await channel.SendNewMessageAsync("Let's start a thread!");
+ var message2 = await channel.SendNewMessageAsync("Let's start a thread!");
-var message = await channel.SendNewMessageAsync(new StreamSendMessageRequest
-{
- MentionedUsers = new List { someUser }, // Mention a user
- ParentId = message2.Id, // Write in thread
- PinExpires = new DateTimeOffset(DateTime.Now).AddDays(7), // Pin for 7 days
- Pinned = true,
- QuotedMessage = message3,
- ShowInChannel = true,
- Text = "Hello",
- CustomData = new StreamCustomDataRequest
- {
- { "my_lucky_numbers", new List { 7, 13, 81 } }
- }
-});
+ var message = await channel.SendNewMessageAsync(new StreamSendMessageRequest
+ {
+ MentionedUsers = new List { someUser }, // Mention a user
+ ParentId = message2.Id, // Write in thread
+ PinExpires = new DateTimeOffset(DateTime.Now).AddDays(7), // Pin for 7 days
+ Pinned = true,
+ QuotedMessage = message3,
+ ShowInChannel = true,
+ Text = "Hello",
+ CustomData = new StreamCustomDataRequest
+ {
+ { "my_lucky_numbers", new List { 7, 13, 81 } }
+ }
+ });
}
///
@@ -65,18 +65,18 @@ public async Task GetMessageById()
///
public async Task UpdateAMessage()
{
-var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
-var message = await channel.SendNewMessageAsync("Hello world!");
+ var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
+ var message = await channel.SendNewMessageAsync("Hello world!");
// Edit message text and some custom data
-await message.UpdateAsync(new StreamUpdateMessageRequest
-{
- Text = "Hi everyone!",
- CustomData = new StreamCustomDataRequest
- {
- {"tags", new [] {"Funny", "Unique"}}
- }
-});
+ await message.UpdateAsync(new StreamUpdateMessageRequest
+ {
+ Text = "Hi everyone!",
+ CustomData = new StreamCustomDataRequest
+ {
+ { "tags", new[] { "Funny", "Unique" } }
+ }
+ });
}
///
@@ -92,14 +92,14 @@ public async Task PartialUpdate()
///
public async Task DeleteAMessage()
{
-var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
-var message = await channel.SendNewMessageAsync("Hello world!");
+ var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
+ var message = await channel.SendNewMessageAsync("Hello world!");
// Soft delete
-await message.SoftDeleteAsync();
+ await message.SoftDeleteAsync();
// Hard delete
-await message.HardDeleteAsync();
+ await message.HardDeleteAsync();
}
///
@@ -118,15 +118,14 @@ public async Task UploadFileOrImage()
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
// 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 sampleFile = File.ReadAllBytes("path/to/file");
+ var fileUploadResponse = await channel.UploadFileAsync(sampleFile, "my-file-name");
+ var fileWebUrl = fileUploadResponse.FileUrl;
// Get image byte array however you want e.g. Addressables.LoadAsset, Resources.Load, etc.
-var sampleImage = File.ReadAllBytes("path/to/file");
-var imageUploadResponse = await channel.UploadImageAsync(sampleFile, "my-image-name");
-var imageWebUrl = imageUploadResponse.FileUrl;
-
+ var sampleImage = File.ReadAllBytes("path/to/file");
+ var imageUploadResponse = await channel.UploadImageAsync(sampleFile, "my-image-name");
+ var imageWebUrl = imageUploadResponse.FileUrl;
}
///
@@ -134,8 +133,8 @@ public async Task UploadFileOrImage()
///
public async Task DeleteFileOrImage()
{
-var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
-await channel.DeleteFileOrImageAsync("file-url");
+ var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
+ await channel.DeleteFileOrImageAsync("file-url");
}
///
@@ -146,19 +145,19 @@ public async Task UsingYourOwnCdn()
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
//Implement your own CDN upload and obtain the file URL
-var fileUrl = "file-url-to-your-cdn";
+ var fileUrl = "file-url-to-your-cdn";
-await channel.SendNewMessageAsync(new StreamSendMessageRequest
-{
- Text = "Message with file attachment",
- Attachments = new List
- {
- new StreamAttachmentRequest
- {
- AssetUrl = fileUrl,
- }
- }
-});
+ await channel.SendNewMessageAsync(new StreamSendMessageRequest
+ {
+ Text = "Message with file attachment",
+ Attachments = new List
+ {
+ new StreamAttachmentRequest
+ {
+ AssetUrl = fileUrl,
+ }
+ }
+ });
await Task.CompletedTask;
}
@@ -172,16 +171,16 @@ public async Task ReactionOverview()
var message = await channel.SendNewMessageAsync("Hello world!");
// Send simple reaction with a score of 1
-await message.SendReactionAsync("like");
+ await message.SendReactionAsync("like");
// Send reaction with a custom score value
-await message.SendReactionAsync("clap", 10);
+ await message.SendReactionAsync("clap", 10);
// Send reaction with a custom score value
-await message.SendReactionAsync("clap", 10);
+ await message.SendReactionAsync("clap", 10);
// Send reaction and replace all previous reactions (if any) from this user
-await message.SendReactionAsync("love", enforceUnique: true);
+ await message.SendReactionAsync("love", enforceUnique: true);
}
///
@@ -192,7 +191,7 @@ public async Task RemoveReaction()
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
var message = await channel.SendNewMessageAsync("Hello world!");
-await message.DeleteReactionAsync("like");
+ await message.DeleteReactionAsync("like");
}
///
@@ -214,7 +213,7 @@ public async Task CumulativeReactions()
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
var message = await channel.SendNewMessageAsync("Hello world!");
-await message.SendReactionAsync("clap", score: 3);
+ await message.SendReactionAsync("clap", score: 3);
}
///
@@ -228,14 +227,14 @@ public async Task ThreadsAndReplies()
var message3 = await channel.SendNewMessageAsync("Hello");
// Send simple message with text only
-var parentMessage = await channel.SendNewMessageAsync("Let's start a thread!");
+ var parentMessage = await channel.SendNewMessageAsync("Let's start a thread!");
-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 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",
+ });
}
///
@@ -259,11 +258,11 @@ public async Task QuoteMessage()
// Send simple message with text only
var quotedMessage = await channel.SendNewMessageAsync("Let's start a thread!");
-var messageWithQuote = await channel.SendNewMessageAsync(new StreamSendMessageRequest
-{
- QuotedMessage = quotedMessage,
- Text = "Hello",
-});
+ var messageWithQuote = await channel.SendNewMessageAsync(new StreamSendMessageRequest
+ {
+ QuotedMessage = quotedMessage,
+ Text = "Hello",
+ });
}
///
@@ -282,11 +281,11 @@ public async Task SilentMessages()
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, "my-channel-id");
// This message will not trigger events for channel members
-var silentMessage = await channel.SendNewMessageAsync(new StreamSendMessageRequest
-{
- Text = "System message",
- Silent = true
-});
+ var silentMessage = await channel.SendNewMessageAsync(new StreamSendMessageRequest
+ {
+ Text = "System message",
+ Silent = true
+ });
}
///
@@ -294,34 +293,33 @@ public async Task SilentMessages()
///
public async Task Search()
{
-
// Access to low-level client is left for backward compatibility. Soon simplified syntax for searching will be implemented
-var searchResponse = await Client.LowLevelClient.MessageApi.SearchMessagesAsync(new SearchRequest
-{
- //Filter is required for search
- FilterConditions = new Dictionary
- {
- {
- //Get channels that local user is a member of
- "members", new Dictionary
+ var searchResponse = await Client.LowLevelClient.MessageApi.SearchMessagesAsync(new SearchRequest
+ {
+ //Filter is required for search
+ FilterConditions = new Dictionary
+ {
+ {
+ //Get channels that local user is a member of
+ "members", new Dictionary
+ {
+ { "$in", new[] { "John" } }
+ }
+ }
+ },
+
+ //search phrase
+ Query = "supercalifragilisticexpialidocious"
+ });
+
+ foreach (var searchResult in searchResponse.Results)
{
- { "$in", new[] { "John" } }
+ Debug.Log(searchResult.Message.Id); //Message ID
+ Debug.Log(searchResult.Message.Text); //Message text
+ Debug.Log(searchResult.Message.User); //Message author info
+ Debug.Log(searchResult.Message.Channel); //Channel info
}
}
- },
-
- //search phrase
- Query = "supercalifragilisticexpialidocious"
-});
-
-foreach (var searchResult in searchResponse.Results)
-{
- Debug.Log(searchResult.Message.Id); //Message ID
- Debug.Log(searchResult.Message.Text); //Message text
- Debug.Log(searchResult.Message.User); //Message author info
- Debug.Log(searchResult.Message.Channel); //Channel info
-}
- }
///
/// https://getstream.io/chat/docs/unity/search/?language=unity#pagination
@@ -339,13 +337,13 @@ public async Task PinAndUnpinMessage()
IStreamMessage message = null;
// Pin until unpinned
-await message.PinAsync();
+ await message.PinAsync();
// Pin for 7 days
-await message.PinAsync(new DateTime().AddDays(7));
+ await message.PinAsync(new DateTime().AddDays(7));
// Unpin previously pinned message
-await message.UnpinAsync();
+ await message.UnpinAsync();
}
///
diff --git a/Assets/Plugins/StreamChat/Samples/UserPresenceCodeExamples.cs b/Assets/Plugins/StreamChat/Samples/UserPresenceCodeExamples.cs
new file mode 100644
index 00000000..0b8aada5
--- /dev/null
+++ b/Assets/Plugins/StreamChat/Samples/UserPresenceCodeExamples.cs
@@ -0,0 +1,78 @@
+using System.Linq;
+using StreamChat.Core;
+
+namespace StreamChat.Samples
+{
+ internal class UserPresenceCodeExamples
+ {
+ public async void UserObject()
+ {
+ // Get a channel
+ var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, "my-channel-id");
+
+ // Members are users belonging to this channel
+ var member = channel.Members.First();
+
+ // Each member object contains a user object. A single user can be a member of many channels
+ var user = member.User;
+
+ var message = channel.Messages.First();
+
+ // Each message contains the author user object
+ var user2 = message.User;
+
+ // Presence related fields on a user object
+ var isOnline = user.Online;
+ var lastActive = user.LastActive;
+ }
+
+ public async void Invisible()
+ {
+ // Get local user object
+ var localUserData = await Client.ConnectUserAsync("api-key", "user-id", "user-token");
+
+ // Or like this
+ var localUserData2 = Client.LocalUserData;
+
+ // Get local user object
+ var localUser = localUserData.User;
+
+ // Check local user invisibility status
+ var isInvisible = localUser.Invisible;
+
+ // Mark invisible
+ await localUser.MarkInvisibleAsync();
+
+ // Mark visible
+ await localUser.MarkVisibleAsync();
+ }
+
+ public void SetVisibilityOnConnect()
+ {
+ //StreamTodo: implement https://getstream.io/chat/docs/unity/presence_format/?language=csharp#invisible (second example)
+
+ // Will be implemented soon, please send a support ticket if you need this feature
+ }
+
+ public async void ListeningForPresenceEvents()
+ {
+ // Get a channel
+ var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, "my-channel-id");
+
+ // Members are users belonging to this channel
+ var member = channel.Members.First();
+
+ // Each member object contains a user object. A single user can be a member of many channels
+ var user = member.User;
+
+ // Each user object exposes the PresenceChange event that will trigger when Online status changes
+ user.PresenceChanged += (userObj, isOnline, isActive) =>
+ {
+
+ };
+ }
+
+
+ private IStreamChatClient Client { get; } = StreamChatClient.CreateDefaultClient();
+ }
+}
\ No newline at end of file
diff --git a/Assets/Plugins/StreamChat/Samples/UserPresenceCodeExamples.cs.meta b/Assets/Plugins/StreamChat/Samples/UserPresenceCodeExamples.cs.meta
new file mode 100644
index 00000000..18b3df52
--- /dev/null
+++ b/Assets/Plugins/StreamChat/Samples/UserPresenceCodeExamples.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: fdb1b9e3741c4e30a1b2831cff99a617
+timeCreated: 1711627976
\ No newline at end of file