Ejemplo n.º 1
0
        public void ClearHistory(TLDialogBase dialog)
        {
            var confirmation = MessageBox.Show(AppResources.ClearHistoryConfirmation, AppResources.Confirm, MessageBoxButton.OKCancel);

            if (confirmation != MessageBoxResult.OK)
            {
                return;
            }

            if (dialog.Peer is TLPeerChannel)
            {
                var channel = (TLChannel)dialog.With;

                MTProtoService.DeleteHistoryAsync(channel.ToInputChannel(),
                                                  result =>
                {
                    CacheService.ClearDialog(dialog.Peer);
                    BeginOnUIThread(() =>
                    {
                        if (dialog.With != null)
                        {
                            dialog.With.ClearBitmap();
                        }

                        dialog.NotifyOfPropertyChange(() => dialog.UnreadCount);
                        var dialog71 = dialog as TLDialog71;
                        if (dialog71 != null)
                        {
                            dialog71.NotifyOfPropertyChange(() => dialog71.UnreadMentionsCount);
                        }
                    });
                },
                                                  error =>
                {
                    Execute.ShowDebugMessage("channels.deleteHistory error " + error);
                });
            }
            else if (dialog.Peer is TLPeerUser)
            {
                var user      = (TLUserBase)dialog.With;
                var inputPeer = user.ToInputPeer();

                DeleteHistoryAsync(true, inputPeer,
                                   result =>
                {
                    CacheService.ClearDialog(dialog.Peer);
                    BeginOnUIThread(() =>
                    {
                        if (dialog.With != null)
                        {
                            dialog.With.ClearBitmap();
                        }

                        dialog.NotifyOfPropertyChange(() => dialog.UnreadCount);
                        var dialog71 = dialog as TLDialog71;
                        if (dialog71 != null)
                        {
                            dialog71.NotifyOfPropertyChange(() => dialog71.UnreadMentionsCount);
                        }
                    });
                },
                                   error =>
                {
                    Execute.ShowDebugMessage("messages.deleteHistory error " + error);
                });
            }
            else if (dialog.Peer is TLPeerChat)
            {
                var chat      = (TLChatBase)dialog.With;
                var inputPeer = chat.ToInputPeer();

                DeleteHistoryAsync(true, inputPeer,
                                   result =>
                {
                    CacheService.ClearDialog(dialog.Peer);
                    BeginOnUIThread(() =>
                    {
                        if (dialog.With != null)
                        {
                            dialog.With.ClearBitmap();
                        }
                        dialog.NotifyOfPropertyChange(() => dialog.UnreadCount);
                        var dialog71 = dialog as TLDialog71;
                        if (dialog71 != null)
                        {
                            dialog71.NotifyOfPropertyChange(() => dialog71.UnreadMentionsCount);
                        }
                    });
                },
                                   error =>
                {
                    Execute.ShowDebugMessage("messages.deleteHistory error " + error);
                });
            }
            else if (dialog.Peer is TLPeerEncryptedChat)
            {
                var chat = CacheService.GetEncryptedChat(dialog.Peer.Id) as TLEncryptedChat;
                if (chat == null)
                {
                    return;
                }

                var flushHistoryAction = new TLDecryptedMessageActionFlushHistory();

                var decryptedTuple = SecretDialogDetailsViewModel.GetDecryptedServiceMessageAndObject(flushHistoryAction, chat, MTProtoService.CurrentUserId, CacheService);

                SecretDialogDetailsViewModel.SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService,
                                                                  CacheService,
                                                                  sentEncryptedMessage =>
                {
                    CacheService.ClearDecryptedHistoryAsync(chat.Id);
                    BeginOnUIThread(() =>
                    {
                        if (dialog.With != null)
                        {
                            dialog.With.ClearBitmap();
                        }

                        dialog.NotifyOfPropertyChange(() => dialog.UnreadCount);
                    });
                });
            }
            else if (dialog.Peer is TLPeerBroadcast)
            {
                var broadcast = CacheService.GetBroadcast(dialog.Peer.Id);
                if (broadcast == null)
                {
                    return;
                }

                CacheService.ClearBroadcastHistoryAsync(broadcast.Id);
            }
        }
        public void Handle(TLDecryptedMessageBase decryptedMessage)
        {
            if (Chat != null &&
                decryptedMessage.ChatId.Value == Chat.Id.Value)
            {
                var serviceMessage = decryptedMessage as TLDecryptedMessageService;
                if (serviceMessage != null)
                {
                    var action = serviceMessage.Action;
                    var setMessageTTLAction = action as TLDecryptedMessageActionSetMessageTTL;
                    if (setMessageTTLAction != null)
                    {
                        Chat.MessageTTL = setMessageTTLAction.TTLSeconds;
                    }

                    var flushHistoryAction = action as TLDecryptedMessageActionFlushHistory;
                    if (flushHistoryAction != null)
                    {
                        Execute.BeginOnUIThread(() => Items.Clear());
                        CacheService.ClearDecryptedHistoryAsync(Chat.Id);
                    }

                    var readMessagesAction = action as TLDecryptedMessageActionReadMessages;
                    if (readMessagesAction != null)
                    {
                        Execute.BeginOnUIThread(() =>
                        {
                            foreach (var randomId in readMessagesAction.RandomIds)
                            {
                                foreach (var item in Items)
                                {
                                    if (item.RandomId.Value == randomId.Value)
                                    {
                                        item.Status = MessageStatus.Read;
                                        if (item.TTL != null && item.TTL.Value > 0)
                                        {
                                            item.DeleteDate = new TLLong(DateTime.Now.Ticks + Chat.MessageTTL.Value * TimeSpan.TicksPerSecond);
                                        }

                                        var decryptedMessage17 = item as TLDecryptedMessage17;
                                        if (decryptedMessage17 != null)
                                        {
                                            var decryptedMediaPhoto = decryptedMessage17.Media as TLDecryptedMessageMediaPhoto;
                                            if (decryptedMediaPhoto != null)
                                            {
                                                if (decryptedMediaPhoto.TTLParams == null)
                                                {
                                                    var ttlParams       = new TTLParams();
                                                    ttlParams.IsStarted = true;
                                                    ttlParams.Total     = decryptedMessage17.TTL.Value;
                                                    ttlParams.StartTime = DateTime.Now;
                                                    ttlParams.Out       = decryptedMessage17.Out.Value;

                                                    decryptedMediaPhoto.TTLParams = ttlParams;
                                                }
                                            }

                                            var decryptedMediaVideo17 = decryptedMessage17.Media as TLDecryptedMessageMediaVideo17;
                                            if (decryptedMediaVideo17 != null)
                                            {
                                                if (decryptedMediaVideo17.TTLParams == null)
                                                {
                                                    var ttlParams       = new TTLParams();
                                                    ttlParams.IsStarted = true;
                                                    ttlParams.Total     = decryptedMessage17.TTL.Value;
                                                    ttlParams.StartTime = DateTime.Now;
                                                    ttlParams.Out       = decryptedMessage17.Out.Value;

                                                    decryptedMediaVideo17.TTLParams = ttlParams;
                                                }
                                            }

                                            var decryptedMediaAudio17 = decryptedMessage17.Media as TLDecryptedMessageMediaAudio17;
                                            if (decryptedMediaAudio17 != null)
                                            {
                                                if (decryptedMediaAudio17.TTLParams == null)
                                                {
                                                    var ttlParams       = new TTLParams();
                                                    ttlParams.IsStarted = true;
                                                    ttlParams.Total     = decryptedMessage17.TTL.Value;
                                                    ttlParams.StartTime = DateTime.Now;
                                                    ttlParams.Out       = decryptedMessage17.Out.Value;

                                                    decryptedMediaAudio17.TTLParams = ttlParams;
                                                }
                                            }
                                        }

                                        item.NotifyOfPropertyChange(() => item.Status);
                                        break;
                                    }
                                }
                            }
                        });
                    }

                    var deleteMessagesAction = action as TLDecryptedMessageActionDeleteMessages;
                    if (deleteMessagesAction != null)
                    {
                        Execute.BeginOnUIThread(() =>
                        {
                            foreach (var randomId in deleteMessagesAction.RandomIds)
                            {
                                for (var i = 0; i < Items.Count; i++)
                                {
                                    if (Items[i].RandomId.Value == randomId.Value)
                                    {
                                        Items.RemoveAt(i);
                                        break;
                                    }
                                }
                            }
                            CacheService.DeleteDecryptedMessages(deleteMessagesAction.RandomIds);
                        });
                    }
                }

                if (!TLUtils.IsDisplayedDecryptedMessage(decryptedMessage))
                {
                    return;
                }

                Execute.OnUIThread(() =>
                {
                    var position = InsertMessageInOrder(decryptedMessage);
                    NotifyOfPropertyChange(() => DescriptionVisibility);

                    if (position != -1)
                    {
                        ReadMessages(decryptedMessage);
                        if (decryptedMessage is TLDecryptedMessage)
                        {
                            RemoveTypingUser(With.Index);
                        }
                    }
                });
            }
        }
        public void Handle(TLDecryptedMessageBase decryptedMessage)
        {
            if (Chat != null &&
                decryptedMessage.ChatId.Value == Chat.Id.Value)
            {
                System.Diagnostics.Debug.WriteLine("Handle random_id={0} date={1} qts={2}", decryptedMessage.RandomId, decryptedMessage.Date, decryptedMessage.Qts);

                var serviceMessage = decryptedMessage as TLDecryptedMessageService;
                if (serviceMessage != null)
                {
                    var action = serviceMessage.Action;

                    var typingAction = action as TLDecryptedMessageActionTyping;
                    if (typingAction != null)
                    {
                        var cancelAction = typingAction.Action as TLSendMessageCancelAction;
                        if (cancelAction != null)
                        {
                            InputTypingManager.RemoveTypingUser(With.Index);
                        }
                        else
                        {
                            InputTypingManager.AddTypingUser(With.Index, typingAction.Action);
                        }
                    }

                    var setMessageTTLAction = action as TLDecryptedMessageActionSetMessageTTL;
                    if (setMessageTTLAction != null)
                    {
                        Chat.MessageTTL = setMessageTTLAction.TTLSeconds;
                    }

                    var flushHistoryAction = action as TLDecryptedMessageActionFlushHistory;
                    if (flushHistoryAction != null)
                    {
                        Execute.BeginOnUIThread(() => Items.Clear());
                        CacheService.ClearDecryptedHistoryAsync(Chat.Id);
                    }

                    var readMessagesAction = action as TLDecryptedMessageActionReadMessages;
                    if (readMessagesAction != null)
                    {
                        Execute.BeginOnUIThread(() =>
                        {
                            foreach (var randomId in readMessagesAction.RandomIds)
                            {
                                foreach (var item in UngroupEnumerator(Items))
                                {
                                    if (item.RandomId.Value == randomId.Value)
                                    {
                                        item.Status = MessageStatus.Read;
                                        if (item.TTL != null && item.TTL.Value > 0)
                                        {
                                            item.DeleteDate = new TLLong(DateTime.Now.Ticks + Chat.MessageTTL.Value * TimeSpan.TicksPerSecond);
                                        }

                                        var decryptedMessage17 = item as TLDecryptedMessage17;
                                        if (decryptedMessage17 != null)
                                        {
                                            var decryptedMediaPhoto = decryptedMessage17.Media as TLDecryptedMessageMediaPhoto;
                                            if (decryptedMediaPhoto != null)
                                            {
                                                if (decryptedMediaPhoto.TTLParams == null)
                                                {
                                                    var ttlParams       = new TTLParams();
                                                    ttlParams.IsStarted = true;
                                                    ttlParams.Total     = decryptedMessage17.TTL.Value;
                                                    ttlParams.StartTime = DateTime.Now;
                                                    ttlParams.Out       = decryptedMessage17.Out.Value;

                                                    decryptedMediaPhoto.TTLParams = ttlParams;
                                                }
                                            }

                                            var decryptedMediaVideo17 = decryptedMessage17.Media as TLDecryptedMessageMediaVideo17;
                                            if (decryptedMediaVideo17 != null)
                                            {
                                                if (decryptedMediaVideo17.TTLParams == null)
                                                {
                                                    var ttlParams       = new TTLParams();
                                                    ttlParams.IsStarted = true;
                                                    ttlParams.Total     = decryptedMessage17.TTL.Value;
                                                    ttlParams.StartTime = DateTime.Now;
                                                    ttlParams.Out       = decryptedMessage17.Out.Value;

                                                    decryptedMediaVideo17.TTLParams = ttlParams;
                                                }
                                            }

                                            var decryptedMediaAudio17 = decryptedMessage17.Media as TLDecryptedMessageMediaAudio17;
                                            if (decryptedMediaAudio17 != null)
                                            {
                                                if (decryptedMediaAudio17.TTLParams == null)
                                                {
                                                    var ttlParams       = new TTLParams();
                                                    ttlParams.IsStarted = true;
                                                    ttlParams.Total     = decryptedMessage17.TTL.Value;
                                                    ttlParams.StartTime = DateTime.Now;
                                                    ttlParams.Out       = decryptedMessage17.Out.Value;

                                                    decryptedMediaAudio17.TTLParams = ttlParams;
                                                }
                                            }

                                            var decryptedMediaDocument45 = decryptedMessage17.Media as TLDecryptedMessageMediaDocument45;
                                            if (decryptedMediaDocument45 != null && (decryptedMessage17.IsVoice() || decryptedMessage17.IsVideo()))
                                            {
                                                if (decryptedMediaDocument45.TTLParams == null)
                                                {
                                                    var ttlParams       = new TTLParams();
                                                    ttlParams.IsStarted = true;
                                                    ttlParams.Total     = decryptedMessage17.TTL.Value;
                                                    ttlParams.StartTime = DateTime.Now;
                                                    ttlParams.Out       = decryptedMessage17.Out.Value;

                                                    decryptedMediaDocument45.TTLParams = ttlParams;
                                                }

                                                var message45 = decryptedMessage17 as TLDecryptedMessage45;
                                                if (message45 != null)
                                                {
                                                    message45.SetListened();
                                                }
                                                decryptedMediaDocument45.NotListened = false;
                                                decryptedMediaDocument45.NotifyOfPropertyChange(() => decryptedMediaDocument45.NotListened);
                                            }
                                        }

                                        item.NotifyOfPropertyChange(() => item.Status);
                                        break;
                                    }
                                }
                            }
                        });
                    }

                    var deleteMessagesAction = action as TLDecryptedMessageActionDeleteMessages;
                    if (deleteMessagesAction != null)
                    {
                        Execute.BeginOnUIThread(() =>
                        {
                            var group = new Dictionary <long, TLDecryptedMessageMediaGroup>();
                            foreach (var randomId in deleteMessagesAction.RandomIds)
                            {
                                for (var i = 0; i < Items.Count; i++)
                                {
                                    var groupedMessage = false;
                                    var message73      = Items[i] as TLDecryptedMessage73;
                                    if (message73 != null && message73.GroupedId != null)
                                    {
                                        var mediaGroup = message73.Media as TLDecryptedMessageMediaGroup;
                                        if (mediaGroup != null)
                                        {
                                            groupedMessage = true;
                                            for (var k = 0; k < mediaGroup.Group.Count; k++)
                                            {
                                                if (mediaGroup.Group[k].RandomId.Value == randomId.Value)
                                                {
                                                    mediaGroup.Group.RemoveAt(k);
                                                    if (mediaGroup.Group.Count == 0)
                                                    {
                                                        Items.Remove(message73);
                                                    }
                                                    else
                                                    {
                                                        group[message73.GroupedId.Value] = mediaGroup;
                                                    }
                                                    break;
                                                }
                                            }
                                        }
                                    }

                                    if (!groupedMessage && Items[i].RandomId.Value == randomId.Value)
                                    {
                                        Items.RemoveAt(i);
                                        break;
                                    }
                                }
                            }

                            foreach (var mediaGroup in group.Values)
                            {
                                mediaGroup.RaiseCalculate();
                            }

                            CacheService.DeleteDecryptedMessages(deleteMessagesAction.RandomIds);
                        });
                    }
                }

                if (!TLUtils.IsDisplayedDecryptedMessage(decryptedMessage))
                {
                    return;
                }

                ProcessMessages(new List <TLDecryptedMessageBase> {
                    decryptedMessage
                });

                Execute.OnUIThread(() =>
                {
                    var addedGrouped = false;
                    var message73    = decryptedMessage as TLDecryptedMessage73;
                    if (message73 != null && message73.GroupedId != null && Items.Count > 0)
                    {
                        var previousMessage = Items[0] as TLDecryptedMessage73;
                        if (previousMessage != null &&
                            previousMessage.GroupedId != null &&
                            previousMessage.GroupedId.Value == message73.GroupedId.Value)
                        {
                            Items.RemoveAt(0);
                            var items      = new List <TLDecryptedMessageBase>();
                            var mediaGroup = previousMessage.Media as TLDecryptedMessageMediaGroup;
                            if (mediaGroup != null)
                            {
                                items.Add(message73);

                                for (var i = mediaGroup.Group.Count - 1; i >= 0; i--)
                                {
                                    items.Add(mediaGroup.Group[i]);
                                }
                            }
                            else
                            {
                                items.Add(message73);
                                items.Add(previousMessage);
                            }

                            ProcessGroupedMessages(items);

                            for (var j = 0; j < items.Count; j++)
                            {
                                InsertMessageInOrder(items[j]);
                            }

                            addedGrouped = true;
                        }
                    }

                    var position = -1;
                    if (!addedGrouped)
                    {
                        position = InsertMessageInOrder(decryptedMessage);
                        System.Diagnostics.Debug.WriteLine("Handle.Insert random_id={0} date={1} position={2}", decryptedMessage.RandomId, decryptedMessage.Date, position);
                    }
                    else
                    {
                        position = 0;
                    }
                    NotifyOfPropertyChange(() => DescriptionVisibility);

                    if (position != -1)
                    {
                        ReadMessages(decryptedMessage);
                        if (decryptedMessage is TLDecryptedMessage)
                        {
                            InputTypingManager.RemoveTypingUser(With.Index);
                        }
                    }
                });
            }
        }
        public void ClearHistory(TLDialogBase dialog)
        {
            if (dialog == null)
            {
                return;
            }
            if (dialog.Peer is TLPeerUser)
            {
                return;
            }

            var confirmation = MessageBox.Show(string.Format("{0}?", AppResources.ClearHistory), AppResources.Confirm, MessageBoxButton.OKCancel);

            if (confirmation != MessageBoxResult.OK)
            {
                return;
            }


            if (dialog.Peer is TLPeerChat)
            {
                var chat      = (TLChatBase)dialog.With;
                var inputPeer = chat.ToInputPeer();

                DeleteHistoryAsync(inputPeer,
                                   result =>
                {
                    CacheService.DeleteDialog(dialog);     // TODO : move this line to MTProtoService
                    BeginOnUIThread(() =>
                    {
                        if (dialog.With != null)
                        {
                            dialog.With.Bitmap = null;
                        }
                        Items.Remove(dialog);
                    });
                },
                                   error =>
                {
                    Execute.ShowDebugMessage("messages.deleteHistory error " + error);
                });
            }
            else if (dialog.Peer is TLPeerEncryptedChat)
            {
                var chat = CacheService.GetEncryptedChat(dialog.Peer.Id) as TLEncryptedChat;
                if (chat == null)
                {
                    return;
                }

                var flushHistoryAction = new TLDecryptedMessageActionFlushHistory();

                var decryptedTuple = SecretDialogDetailsViewModel.GetDecryptedServiceMessageAndObject(flushHistoryAction, chat, MTProtoService.CurrentUserId, CacheService);

                SecretDialogDetailsViewModel.SendEncryptedService(chat, decryptedTuple.Item2, MTProtoService,
                                                                  CacheService,
                                                                  sentEncryptedMessage =>
                {
                    chat.SetBitmap(null);
                    CacheService.ClearDecryptedHistoryAsync(chat.Id);
                });
            }
            else if (dialog.Peer is TLPeerBroadcast)
            {
                var broadcast = CacheService.GetBroadcast(dialog.Peer.Id);
                if (broadcast == null)
                {
                    return;
                }

                CacheService.ClearBroadcastHistoryAsync(broadcast.Id);
            }
        }