|
23 | 23 |
|
24 | 24 | namespace Signal_Windows.Lib
|
25 | 25 | {
|
| 26 | + public class AppendResult |
| 27 | + { |
| 28 | + public long Index { get; } |
| 29 | + public AppendResult(long index) |
| 30 | + { |
| 31 | + Index = index; |
| 32 | + } |
| 33 | + } |
| 34 | + |
26 | 35 | public interface ISignalFrontend
|
27 | 36 | {
|
28 | 37 | void AddOrUpdateConversation(SignalConversation conversation, SignalMessage updateMessage);
|
29 |
| - void HandleMessage(SignalMessage message, SignalConversation conversation); |
| 38 | + AppendResult HandleMessage(SignalMessage message, SignalConversation conversation); |
| 39 | + void HandleUnreadMessage(SignalMessage message); |
| 40 | + void HandleMessageRead(long messageIndex, SignalConversation conversation); |
30 | 41 | void HandleIdentitykeyChange(LinkedList<SignalMessage> messages);
|
31 | 42 | void HandleMessageUpdate(SignalMessage updatedMessage);
|
32 | 43 | void ReplaceConversationList(List<SignalConversation> conversations);
|
@@ -435,16 +446,62 @@ internal void DispatchAddOrUpdateConversation(SignalConversation conversation, S
|
435 | 446 | }
|
436 | 447 |
|
437 | 448 | internal void DispatchHandleMessage(SignalMessage message, SignalConversation conversation)
|
| 449 | + { |
| 450 | + List<TaskCompletionSource<AppendResult>> operations = new List<TaskCompletionSource<AppendResult>>(); |
| 451 | + foreach (var dispatcher in Frames.Keys) |
| 452 | + { |
| 453 | + TaskCompletionSource<AppendResult> b = new TaskCompletionSource<AppendResult>(); |
| 454 | + var a = dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => |
| 455 | + { |
| 456 | + b.SetResult(Frames[dispatcher].HandleMessage(message, conversation)); |
| 457 | + }); |
| 458 | + operations.Add(b); |
| 459 | + } |
| 460 | + SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(message, Events.SignalMessageType.NormalMessage)); |
| 461 | + if (message.Author != null) |
| 462 | + { |
| 463 | + bool wasInstantlyRead = false; |
| 464 | + foreach (var b in operations) |
| 465 | + { |
| 466 | + AppendResult result = b.Task.Result; |
| 467 | + if (result != null) |
| 468 | + { |
| 469 | + SignalDBContext.UpdateMessageRead(result.Index, conversation); |
| 470 | + DispatchMessageRead(result.Index, conversation); |
| 471 | + wasInstantlyRead = true; |
| 472 | + break; |
| 473 | + } |
| 474 | + } |
| 475 | + if (!wasInstantlyRead) |
| 476 | + { |
| 477 | + DispatchHandleUnreadMessage(message); |
| 478 | + } |
| 479 | + } |
| 480 | + } |
| 481 | + |
| 482 | + internal void DispatchHandleUnreadMessage(SignalMessage message) |
438 | 483 | {
|
439 | 484 | List<Task> operations = new List<Task>();
|
440 | 485 | foreach (var dispatcher in Frames.Keys)
|
441 | 486 | {
|
442 | 487 | operations.Add(dispatcher.RunTaskAsync(() =>
|
443 | 488 | {
|
444 |
| - Frames[dispatcher].HandleMessage(message, conversation); |
| 489 | + Frames[dispatcher].HandleUnreadMessage(message); |
| 490 | + })); |
| 491 | + } |
| 492 | + Task.WaitAll(operations.ToArray()); |
| 493 | + } |
| 494 | + |
| 495 | + internal void DispatchMessageRead(long messageIndex, SignalConversation conversation) |
| 496 | + { |
| 497 | + List<Task> operations = new List<Task>(); |
| 498 | + foreach (var dispatcher in Frames.Keys) |
| 499 | + { |
| 500 | + operations.Add(dispatcher.RunTaskAsync(() => |
| 501 | + { |
| 502 | + Frames[dispatcher].HandleMessageRead(messageIndex, conversation); |
445 | 503 | }));
|
446 | 504 | }
|
447 |
| - SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(message, Events.SignalMessageType.NormalMessage)); |
448 | 505 | Task.WaitAll(operations.ToArray());
|
449 | 506 | }
|
450 | 507 |
|
|
0 commit comments