Skip to content

Commit 39a085f

Browse files
implement message draft
1 parent 7d3fac2 commit 39a085f

20 files changed

+3223
-168
lines changed

c-sharp-chat/PubnubChatApi/PubNubChatApi.Tests/ChannelTests.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,6 @@ public async Task TestLeaveChannel()
109109

110110
Assert.False(memberships.Memberships.Any(x => x.UserId == currentChatUser.Id), "Leave failed, current user found in channel memberships");
111111
}
112-
113-
[Test]
114-
public async Task TestGetUserSuggestions()
115-
{
116-
var channel = await chat.CreatePublicConversation("user_suggestions_test_channel");
117-
channel.Join();
118-
119-
await Task.Delay(5000);
120-
121-
var suggestions = await channel.GetUserSuggestions("@Test");
122-
Assert.True(suggestions.Any(x => x.UserId == user.Id));
123-
}
124112

125113
[Test]
126114
public async Task TestGetMemberships()

c-sharp-chat/PubnubChatApi/PubNubChatApi.Tests/MembershipTests.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public async Task Setup()
2222
SubscribeKey = PubnubTestsParameters.SubscribeKey
2323
});
2424
channel = await chat.CreatePublicConversation("membership_tests_channel");
25+
if (channel == null)
26+
{
27+
Assert.Fail();
28+
}
2529
if (!chat.TryGetCurrentUser(out user))
2630
{
2731
Assert.Fail();
@@ -34,6 +38,8 @@ public async Task Setup()
3438
[TearDown]
3539
public async Task CleanUp()
3640
{
41+
await chat.PubnubInstance.RemoveMemberships().Channels(new List<string>() { "membership_tests_channel", "test_invite_group_channel" })
42+
.Uuid("membership_tests_user_54").ExecuteAsync();
3743
channel.Leave();
3844
await Task.Delay(3000);
3945
chat.Destroy();
@@ -63,7 +69,9 @@ public async Task TestUpdateMemberships()
6369
CustomData = new Dictionary<string, object>()
6470
{
6571
{"key", Guid.NewGuid().ToString()}
66-
}
72+
},
73+
Type = "some_membership",
74+
Status = "active"
6775
};
6876

6977
var manualUpdatedEvent = new ManualResetEvent(false);

c-sharp-chat/PubnubChatApi/PubNubChatApi.Tests/MessageDraftTests.cs

Lines changed: 26 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,9 @@ void InsertDelegateCallback(List<MessageElement> elements, List<SuggestedMention
7777
}
7878

7979
[Test]
80-
public async Task TestInsertSuggestedMention()
80+
public async Task TestInsertSuggestedMentionsAndSend()
8181
{
82-
var messageDraft = channel.CreateMessageDraft();
83-
messageDraft.SetSearchForSuggestions(true);
82+
var messageDraft = channel.CreateMessageDraft(shouldSearchForSuggestions:true);
8483
var successReset = new ManualResetEvent(false);
8584
var step = "user_suggestion";
8685
messageDraft.OnDraftUpdated += (elements, mentions) =>
@@ -101,8 +100,7 @@ public async Task TestInsertSuggestedMention()
101100
Assert.True(elements.Any(x => x.Text.Contains("Mock Usernamiski")));
102101
successReset.Set();
103102
break;
104-
//TODO: to be re-enabled after Channel and Link mentions approach unification
105-
/*case "channel_suggestion":
103+
case "channel_suggestion":
106104
var channelSuggestion =
107105
mentions.FirstOrDefault(x => x.Target is { Target: "message_draft_tests_channel", Type: MentionType.Channel });
108106

@@ -113,9 +111,13 @@ public async Task TestInsertSuggestedMention()
113111
messageDraft.InsertSuggestedMention(channelSuggestion, channelSuggestion.ReplaceTo);
114112
break;
115113
case "channel_inserted":
116-
Assert.True(elements.Any(x => x.Text.Contains("MessageDraftTestingChannel")));
114+
Assert.True(elements.Any(x => x.Text.Contains("MessageDraftTestingChannel")), "channel wasn't inserted into MD");
115+
successReset.Set();
116+
break;
117+
case "link_inserted":
118+
Assert.True(elements.Any(x => x.MentionTarget is {Type:MentionType.Url, Target:"www.pubnub.com"}), "text link wasn't insterted into MD");
117119
successReset.Set();
118-
break;*/
120+
break;
119121
default:
120122
Assert.Fail("Unexpected draft update callback flow in test");
121123
break;
@@ -124,57 +126,36 @@ public async Task TestInsertSuggestedMention()
124126
messageDraft.InsertText(0, "maybe i'll mention @Mock");
125127
var userInserted = successReset.WaitOne(5000);
126128
Assert.True(userInserted, "didn't receive user insertion callback");
127-
128-
//TODO: to be re-enabled after Channel and Link mentions approach unification
129-
/*step = "channel_suggestion";
129+
130+
step = "channel_suggestion";
130131
successReset = new ManualResetEvent(false);
131132
messageDraft.InsertText(0, "now mention #MessageDraft ");
132133
var channelInserted = successReset.WaitOne(5000);
133134
Assert.True(channelInserted, "didn't receive channel insertion callback");
134135

136+
step = "link_inserted";
137+
successReset = new ManualResetEvent(false);
138+
messageDraft.AddMention(0, 3, new MentionTarget(){Target = "www.pubnub.com", Type = MentionType.Url});
139+
var linkAdded = successReset.WaitOne(5000);
140+
Assert.True(channelInserted, "didn't receive text link insertion callback");
141+
135142
var messageReset = new ManualResetEvent(false);
143+
Message messageFromDraft = null;
136144
channel.OnMessageReceived += message =>
137145
{
138-
Assert.True(message.ReferencedChannels.Any(x => x.Id == channel.Id), "received message doesn't contain expected referenced channel");
139-
Assert.True(message.MentionedUsers.Any(x => x.Id == dummyUser.Id), "received message doesn't contain expected mentioned user");
146+
messageFromDraft = message;
140147
messageReset.Set();
141148
};
142149
await messageDraft.Send();
143150
var receivedMessage = messageReset.WaitOne(10000);
144-
Assert.True(receivedMessage, "didn't receive message callback");*/
145-
}
146-
147-
//TODO: to be re-enabled after Channel and Link mentions approach unification
148-
/*[Test]
149-
public async Task TestAddAndSendTextLink()
150-
{
151-
var messageDraft = channel.CreateMessageDraft();
152-
messageDraft.InsertText(0, "some text goes here");
153-
var updateReset = new ManualResetEvent(false);
154-
messageDraft.OnDraftUpdated += (elements, mentions) =>
151+
Assert.True(receivedMessage, "didn't receive message callback");
152+
if (messageFromDraft != null)
155153
{
156-
Assert.True(elements.Any(x => x is { Text: "some", MentionTarget: {Target: "www.pubnub.com", Type: MentionType.Url} })
157-
, "updated message draft doesn't contain expected element");
158-
updateReset.Set();
159-
};
160-
messageDraft.AddMention(0, 4, new MentionTarget()
161-
{
162-
Target = "www.pubnub.com",
163-
Type = MentionType.Url
164-
});
165-
var updated = updateReset.WaitOne(3000);
166-
Assert.True(updated, "didn't receive md update callback");
167-
168-
var messageReset = new ManualResetEvent(false);
169-
channel.OnMessageReceived += message =>
170-
{
171-
Assert.True(message.TextLinks.Any(x => x.Link == "www.pubnub.com"), "didn't find expected link in received message");
172-
messageReset.Set();
173-
};
174-
await messageDraft.Send();
175-
var received = messageReset.WaitOne(6000);
176-
Assert.True(received, "didn't receive message callback after md send");
177-
}*/
154+
Assert.True(messageFromDraft.TextLinks.Any(x => x.Link == "www.pubnub.com"), "received message doesn't contain expected text link");
155+
Assert.True(messageFromDraft.ReferencedChannels.Any(x => x.Id == channel.Id), "received message doesn't contain expected referenced channel");
156+
Assert.True(messageFromDraft.MentionedUsers.Any(x => x.Id == dummyUser.Id), "received message doesn't contain expected mentioned user");
157+
}
158+
}
178159

179160
[Test]
180161
public async Task TestAddAndRemoveMention()

c-sharp-chat/PubnubChatApi/PubnubChatApi/Entities/Base/ChatEntity.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@
22
using System.Diagnostics;
33
using System.Runtime.InteropServices;
44
using System.Threading.Tasks;
5+
using PubnubApi;
56
using PubnubChatApi.Utilities;
67

78
namespace PubNubChatAPI.Entities
89
{
910
public abstract class ChatEntity
1011
{
11-
public abstract Task Resync();
12-
12+
protected Subscription? updateSubscription;
13+
1314
public virtual void SetListeningForUpdates(bool listen)
1415
{
1516
throw new NotImplementedException();
1617
}
18+
19+
public abstract Task Resync();
1720
}
1821
}

c-sharp-chat/PubnubChatApi/PubnubChatApi/Entities/Channel.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using PubnubApi;
77
using PubnubChatApi.Entities.Data;
88
using PubnubChatApi.Entities.Events;
9+
using PubnubChatApi.Enums;
910
using PubnubChatApi.Utilities;
1011

1112
namespace PubNubChatAPI.Entities
@@ -309,12 +310,12 @@ public async Task EmitUserMention(string userId, string timeToken, string text)
309310

310311
public async Task StartTyping()
311312
{
312-
throw new NotImplementedException();
313+
await chat.EmitEvent(PubnubChatEventType.Typing, Id, $"{{\"value\":true}}");
313314
}
314315

315316
public async Task StopTyping()
316317
{
317-
throw new NotImplementedException();
318+
await chat.EmitEvent(PubnubChatEventType.Typing, Id, $"{{\"value\":false}}");
318319
}
319320

320321
public virtual async Task PinMessage(Message message)
@@ -352,23 +353,19 @@ public bool TryGetPinnedMessage(out Message pinnedMessage)
352353
});
353354
}
354355

355-
public async Task<List<Membership>> GetUserSuggestions(string text, int limit = 10)
356-
{
357-
throw new NotImplementedException();
358-
}
359-
360356
/// <summary>
361357
/// Creates a new MessageDraft.
362358
/// </summary>
363359
/// <param name="userSuggestionSource">Source of the user suggestions</param>
364360
/// <param name="isTypingIndicatorTriggered">Typing indicator trigger status.</param>
365361
/// <param name="userLimit">User limit.</param>
366362
/// <param name="channelLimit">Channel limit.</param>
363+
/// <param name="shouldSearchForSuggestions">Whether the MessageDraft should search for suggestions whenever the text is changed.</param>
367364
/// <returns></returns>
368365
public MessageDraft CreateMessageDraft(UserSuggestionSource userSuggestionSource = UserSuggestionSource.GLOBAL,
369-
bool isTypingIndicatorTriggered = true, int userLimit = 10, int channelLimit = 10)
366+
bool isTypingIndicatorTriggered = true, int userLimit = 10, int channelLimit = 10, bool shouldSearchForSuggestions = false)
370367
{
371-
throw new NotImplementedException();
368+
return new MessageDraft(chat, this, userSuggestionSource, isTypingIndicatorTriggered, userLimit, channelLimit, shouldSearchForSuggestions);
372369
}
373370

374371
/// <summary>
@@ -607,8 +604,7 @@ public virtual async Task SendText(string message, SendTextParams sendTextParams
607604
{"text", message},
608605
{"type", "text"}
609606
};
610-
//TODO: "meta" here too?
611-
var meta = new Dictionary<string, object>();
607+
var meta = sendTextParams.Meta ?? new Dictionary<string, object>();
612608
if (sendTextParams.QuotedMessage != null)
613609
{
614610
//TODO: may create some "ToJSON()" methods for chat entities
@@ -770,7 +766,21 @@ public async Task<bool> IsUserPresent(string userId)
770766
/// <seealso cref="IsUserPresent"/>
771767
public async Task<List<string>> WhoIsPresent()
772768
{
773-
throw new NotImplementedException();
769+
var result = new List<string>();
770+
var response = await chat.PubnubInstance.HereNow().Channels(new[] { Id }).IncludeState(true)
771+
.IncludeUUIDs(true).ExecuteAsync();
772+
if (response.Status.Error)
773+
{
774+
chat.Logger.Error($"Error when trying to perform WhoIsPresent(): {response.Status.ErrorData.Information}");
775+
return result;
776+
}
777+
778+
foreach (var occupant in response.Result.Channels[Id].Occupants)
779+
{
780+
result.Add(occupant.Uuid);
781+
}
782+
783+
return result;
774784
}
775785

776786
/// <summary>

0 commit comments

Comments
 (0)