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