Skip to content

Commit d2008e3

Browse files
implement message forwarding and getting current user mentions
1 parent 9c0d0e9 commit d2008e3

File tree

7 files changed

+123
-62
lines changed

7 files changed

+123
-62
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public async Task TestGetCurrentUserMentions()
5454

5555
await Task.Delay(3000);
5656

57-
var mentions = await chat.GetCurrentUserMentions("99999999999999999", "00000000000000000", 10);
57+
var mentions = TestUtils.AssertOperation(await chat.GetCurrentUserMentions("99999999999999999", "00000000000000000", 10));
5858

5959
Assert.True(mentions != null);
6060
Assert.True(mentions.Mentions.Any(x => x.ChannelId == channel.Id && x.Message.MessageText == messageContent));
@@ -137,7 +137,7 @@ public async Task TestForwardMessage()
137137
forwardingChannel.Join();
138138
await Task.Delay(2500);
139139

140-
channel.OnMessageReceived += async message => { await chat.ForwardMessage(message, forwardingChannel); };
140+
channel.OnMessageReceived += async message => { await message.Forward(forwardingChannel.Id); };
141141

142142
await channel.SendText("message_to_forward");
143143

@@ -169,7 +169,7 @@ public async Task TestGetUnreadMessagesCounts()
169169

170170
await Task.Delay(3000);
171171

172-
Assert.True((await chat.GetUnreadMessagesCounts(limit: 50)).Any(x => x.Channel.Id == channel.Id && x.Count > 0));
172+
Assert.True(TestUtils.AssertOperation(await chat.GetUnreadMessagesCounts(limit: 50)).Any(x => x.Channel.Id == channel.Id && x.Count > 0));
173173
}
174174

175175
[Test]
@@ -179,13 +179,13 @@ public async Task TestMarkAllMessagesAsRead()
179179

180180
await Task.Delay(10000);
181181

182-
Assert.True((await chat.GetUnreadMessagesCounts()).Any(x => x.Channel.Id == channel.Id && x.Count > 0));
182+
Assert.True(TestUtils.AssertOperation(await chat.GetUnreadMessagesCounts()).Any(x => x.Channel.Id == channel.Id && x.Count > 0));
183183

184184
var res = chat.MarkAllMessagesAsRead();
185185

186186
await Task.Delay(2000);
187187

188-
var counts = await chat.GetUnreadMessagesCounts();
188+
var counts = TestUtils.AssertOperation(await chat.GetUnreadMessagesCounts());
189189

190190
Assert.False(counts.Any(x => x.Channel.Id == channel.Id && x.Count > 0));
191191
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,12 +338,15 @@ async delegate(Pubnub pn, PNPresenceEventResult p)
338338
}));
339339
}
340340

341-
public async Task ForwardMessage(Message message)
341+
public async Task<ChatOperationResult> ForwardMessage(Message message)
342342
{
343-
await chat.ForwardMessage(message, this);
343+
return await SendText(message.MessageText, new SendTextParams()
344+
{
345+
Meta = message.Meta
346+
});
344347
}
345348

346-
public async Task<ChatOperationResult> EmitUserMention(string userId, string timeToken, string text)
349+
public virtual async Task<ChatOperationResult> EmitUserMention(string userId, string timeToken, string text)
347350
{
348351
var jsonDict = new Dictionary<string, string>()
349352
{

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

Lines changed: 82 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -78,29 +78,6 @@ internal Chat(PubnubChatConfig chatConfig, PNConfiguration pubnubConfig, ChatLis
7878
RateLimiter = new ExponentialRateLimiter(chatConfig.RateLimitFactor);
7979
}
8080

81-
/// <summary>
82-
/// Initializes a new instance of the <see cref="Chat"/> class.
83-
/// <para>
84-
/// Creates a new chat instance.
85-
/// </para>
86-
/// </summary>
87-
/// <param name="chatConfig">Config with Chat specific parameters</param>
88-
/// <param name="pubnub">An already initialised instance of Pubnub</param>
89-
/// /// <param name="listenerFactory">Optional injectable listener factory, used in Unity to allow for dispatching Chat callbacks on main thread.</param>
90-
/// <remarks>
91-
/// The constructor initializes the Chat object with the provided existing Pubnub instance.
92-
/// </remarks>
93-
public static async Task<Chat> CreateInstance(PubnubChatConfig chatConfig, Pubnub pubnub, ChatListenerFactory? listenerFactory = null)
94-
{
95-
var chat = new Chat(chatConfig, pubnub, listenerFactory);
96-
var user = await chat.GetCurrentUser();
97-
if (user == null)
98-
{
99-
await chat.CreateUser(chat.PubnubInstance.GetCurrentUserId());
100-
}
101-
return chat;
102-
}
103-
10481
internal Chat(PubnubChatConfig chatConfig, Pubnub pubnub, ChatListenerFactory? listenerFactory = null)
10582
{
10683
Config = chatConfig;
@@ -518,7 +495,9 @@ public async Task<ChannelsResponseWrapper> GetChannels(string filter = "", strin
518495
/// <seealso cref="ChatChannelData"/>
519496
public async Task<ChatOperationResult> UpdateChannel(string channelId, ChatChannelData updatedData)
520497
{
521-
throw new NotImplementedException();
498+
var result = new ChatOperationResult();
499+
result.RegisterOperation(await Channel.UpdateChannelData(this, channelId, updatedData));
500+
return result;
522501
}
523502

524503
/// <summary>
@@ -545,10 +524,54 @@ public async Task<ChatOperationResult> DeleteChannel(string channelId)
545524

546525
#region Users
547526

548-
public async Task<UserMentionsWrapper> GetCurrentUserMentions(string startTimeToken, string endTimeToken,
527+
public async Task<ChatOperationResult<UserMentionsWrapper>> GetCurrentUserMentions(string startTimeToken, string endTimeToken,
549528
int count)
550529
{
551-
throw new NotImplementedException();
530+
var result = new ChatOperationResult<UserMentionsWrapper>();
531+
var id = PubnubInstance.GetCurrentUserId();
532+
var getEventHistory = await GetEventsHistory(id, startTimeToken, endTimeToken, count);
533+
if (result.RegisterOperation(getEventHistory))
534+
{
535+
return result;
536+
}
537+
var wrapper = new UserMentionsWrapper()
538+
{
539+
IsMore = getEventHistory.Result.IsMore,
540+
Mentions = new List<UserMentionData>()
541+
};
542+
var mentionEvents = getEventHistory.Result.Events.Where(x => x.Type == PubnubChatEventType.Mention);
543+
foreach (var mentionEvent in mentionEvents)
544+
{
545+
var payloadDict =
546+
PubnubInstance.JsonPluggableLibrary.DeserializeToDictionaryOfObject(mentionEvent.Payload);
547+
if (!payloadDict.TryGetValue("text", out var mentionText)
548+
|| !payloadDict.TryGetValue("messageTimetoken", out var messageTimeToken)
549+
|| !payloadDict.TryGetValue("channel", out var mentionChannel))
550+
{
551+
continue;
552+
}
553+
var getMessage = await GetMessage(mentionChannel.ToString(), messageTimeToken.ToString());
554+
if (getMessage.Error)
555+
{
556+
Logger.Warn($"Could not find message with ID/Timetoken from mention event. Event payload: {mentionEvent.Payload}");
557+
continue;
558+
}
559+
560+
var mention = new UserMentionData()
561+
{
562+
ChannelId = mentionChannel.ToString(),
563+
Event = mentionEvent,
564+
Message = getMessage.Result,
565+
UserId = mentionEvent.UserId
566+
};
567+
if (payloadDict.TryGetValue("parentChannel", out var parentChannelId))
568+
{
569+
mention.ParentChannelId = parentChannelId.ToString();
570+
}
571+
wrapper.Mentions.Add(mention);
572+
}
573+
result.Result = wrapper;
574+
return result;
552575
}
553576

554577
/// <summary>
@@ -980,9 +1003,11 @@ public async Task UpdateUser(string userId, ChatUserData updatedData)
9801003
/// chat.DeleteUser("user_id");
9811004
/// </code>
9821005
/// </example>
983-
public async Task DeleteUser(string userId)
1006+
public async Task<ChatOperationResult> DeleteUser(string userId)
9841007
{
985-
throw new NotImplementedException();
1008+
var result = new ChatOperationResult();
1009+
result.RegisterOperation(await PubnubInstance.RemoveUuidMetadata().Uuid(userId).ExecuteAsync());
1010+
return result;
9861011
}
9871012

9881013
#endregion
@@ -1205,22 +1230,32 @@ public async Task<ChatOperationResult<EventsHistoryWrapper>> GetMessageReportsHi
12051230
/// <returns>Message object if one was found, null otherwise.</returns>
12061231
public async Task<ChatOperationResult<Message>> GetMessage(string channelId, string messageTimeToken)
12071232
{
1208-
throw new NotImplementedException();
1209-
/*return await Task.Run(() =>
1233+
var result = new ChatOperationResult<Message>();
1234+
var startTimeToken = (long.Parse(messageTimeToken) + 1).ToString();
1235+
var getHistory = await GetChannelMessageHistory(channelId, startTimeToken, messageTimeToken, 1);
1236+
if (result.RegisterOperation(getHistory))
1237+
{
1238+
return result;
1239+
}
1240+
if (!getHistory.Result.Any())
12101241
{
1211-
var result = TryGetMessage(channelId, messageTimeToken, out var message);
1212-
return result ? message : null;
1213-
});*/
1242+
result.Error = true;
1243+
result.Exception = new PNException($"Didn't find any message with timetoken {messageTimeToken} on channel {channelId}");
1244+
return result;
1245+
}
1246+
//TODO: wrappers rethink
1247+
result.Result = getHistory.Result[0];
1248+
return result;
12141249
}
12151250

1216-
public async Task<MarkMessagesAsReadWrapper> MarkAllMessagesAsRead(string filter = "", string sort = "",
1251+
public async Task<ChatOperationResult<MarkMessagesAsReadWrapper>> MarkAllMessagesAsRead(string filter = "", string sort = "",
12171252
int limit = 0,
12181253
PNPageObject page = null)
12191254
{
12201255
throw new NotImplementedException();
12211256
}
12221257

1223-
public async Task<List<UnreadMessageWrapper>> GetUnreadMessagesCounts(string filter = "", string sort = "",
1258+
public async Task<ChatOperationResult<List<UnreadMessageWrapper>>> GetUnreadMessagesCounts(string filter = "", string sort = "",
12241259
int limit = 0,
12251260
PNPageObject page = null)
12261261
{
@@ -1279,9 +1314,16 @@ public async Task<ChatOperationResult<ThreadChannel>> GetThreadChannel(Message m
12791314
return result;
12801315
}
12811316

1282-
public async Task<ChatOperationResult> ForwardMessage(Message message, Channel channel)
1317+
public async Task<ChatOperationResult> ForwardMessage(string messageTimeToken, string channelId)
12831318
{
1284-
throw new NotImplementedException();
1319+
var result = new ChatOperationResult();
1320+
var getMessage = await GetMessage(channelId, messageTimeToken);
1321+
if (result.RegisterOperation(getMessage))
1322+
{
1323+
return result;
1324+
}
1325+
result.RegisterOperation(await getMessage.Result.Forward(channelId));
1326+
return result;
12851327
}
12861328

12871329
public async void AddListenerToMessagesUpdate(string channelId, List<string> messageTimeTokens,
@@ -1356,16 +1398,18 @@ public async Task<ChatOperationResult<List<Message>>> GetChannelMessageHistory(s
13561398
var getHistory = await PubnubInstance.FetchHistory().Channels(new[] { channelId })
13571399
.Start(long.Parse(startTimeToken)).End(long.Parse(endTimeToken)).MaximumPerChannel(count).IncludeMessageActions(true)
13581400
.IncludeMeta(true).ExecuteAsync();
1359-
if (result.RegisterOperation(getHistory) || !getHistory.Result.Messages.ContainsKey(channelId))
1401+
if (result.RegisterOperation(getHistory) || getHistory.Result.Messages == null || !getHistory.Result.Messages.ContainsKey(channelId))
13601402
{
13611403
return result;
13621404
}
13631405

1406+
//TODO: should be in "MessageHistoryWrapper" object?
13641407
var isMore = getHistory.Result.More != null;
13651408
foreach (var historyItem in getHistory.Result.Messages[channelId])
13661409
{
13671410
if (ChatParsers.TryParseMessageFromHistory(this, channelId, historyItem, out var message))
13681411
{
1412+
//TODO: wrappers rethink
13691413
result.Result.Add(message);
13701414
}
13711415
}

c-sharp-chat/PubnubChatApi/PubnubChatApi/Entities/Data/UserMentionData.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ namespace PubnubChatApi.Entities.Data
77
public class UserMentionData
88
{
99
public string ChannelId;
10+
public string ParentChannelId;
1011
public string UserId;
1112
public ChatEvent Event;
1213
public Message Message;
13-
14-
public string ParentChannelId;
15-
public string ThreadChannelId;
1614
}
1715
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,12 +360,12 @@ public async Task<ChatOperationResult> Report(string reason)
360360
public async Task<ChatOperationResult> Forward(string channelId)
361361
{
362362
var result = new ChatOperationResult();
363-
var channel = await chat.GetChannel(channelId);
364-
if (result.RegisterOperation(channel))
363+
var getChannel = await chat.GetChannel(channelId);
364+
if (result.RegisterOperation(getChannel))
365365
{
366366
return result;
367367
}
368-
result.RegisterOperation(await chat.ForwardMessage(this, channel.Result));
368+
result.RegisterOperation(await getChannel.Result.ForwardMessage(this));
369369
return result;
370370
}
371371

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,19 @@ public async Task<ChatOperationResult<List<ThreadMessage>>> GetThreadHistory(str
7676
return result;
7777
}
7878

79+
public override async Task<ChatOperationResult> EmitUserMention(string userId, string timeToken, string text)
80+
{
81+
var jsonDict = new Dictionary<string, string>()
82+
{
83+
{"text",text},
84+
{"messageTimetoken",timeToken},
85+
{"channel",Id},
86+
{"parentChannel", ParentChannelId}
87+
};
88+
return await chat.EmitEvent(PubnubChatEventType.Mention, userId,
89+
chat.PubnubInstance.JsonPluggableLibrary.SerializeToJsonString(jsonDict));
90+
}
91+
7992
public async Task PinMessageToParentChannel(ThreadMessage message)
8093
{
8194
throw new NotImplementedException();

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,27 @@ namespace PubNubChatAPI.Entities
1111
public class ThreadMessage : Message
1212
{
1313
public event Action<ThreadMessage> OnThreadMessageUpdated;
14-
14+
1515
public string ParentChannelId { get; }
16-
17-
internal ThreadMessage(Chat chat, string timeToken, string originalMessageText, string channelId, string parentChannelId, string userId, PubnubChatMessageType type, Dictionary<string, object> meta, List<MessageAction> messageActions) : base(chat, timeToken, originalMessageText, channelId, userId, type, meta, messageActions)
16+
17+
internal ThreadMessage(Chat chat, string timeToken, string originalMessageText, string channelId,
18+
string parentChannelId, string userId, PubnubChatMessageType type, Dictionary<string, object> meta,
19+
List<MessageAction> messageActions) : base(chat, timeToken, originalMessageText, channelId, userId, type,
20+
meta, messageActions)
1821
{
1922
ParentChannelId = parentChannelId;
2023
}
2124

2225
protected override SubscribeCallback CreateUpdateListener()
2326
{
24-
return chat.ListenerFactory.ProduceListener(messageActionCallback: delegate(Pubnub pn, PNMessageActionEventResult e)
25-
{
26-
if (ChatParsers.TryParseMessageUpdate(chat, this, e))
27+
return chat.ListenerFactory.ProduceListener(
28+
messageActionCallback: delegate(Pubnub pn, PNMessageActionEventResult e)
2729
{
28-
OnThreadMessageUpdated?.Invoke(this);
29-
}
30-
});
30+
if (ChatParsers.TryParseMessageUpdate(chat, this, e))
31+
{
32+
OnThreadMessageUpdated?.Invoke(this);
33+
}
34+
});
3135
}
3236

3337
public async Task PinMessageToParentChannel()
@@ -39,6 +43,5 @@ public async Task UnPinMessageFromParentChannel()
3943
{
4044
throw new NotImplementedException();
4145
}
42-
4346
}
4447
}

0 commit comments

Comments
 (0)