Exemple #1
0
        public static void AddToTTLQueue(TLDecryptedMessage message, TTLParams ttlParams, Action <TLDecryptedMessage> callback)
        {
            if (message == null)
            {
                return;
            }
            if (ttlParams == null)
            {
                return;
            }

            if (_ttlQueue == null)
            {
                _ttlQueue = new DecryptedTTLQueue();
            }

            _ttlQueue.Add(message, ttlParams, callback);
        }
Exemple #2
0
        public void Add(TLDecryptedMessage message, TTLParams ttlParams, Action <TLDecryptedMessage> callback)
        {
            _timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);

            var newItem = new Tuple <TLDecryptedMessage, TTLParams, Action <TLDecryptedMessage> >(message, ttlParams, callback);

            var added = false;

            for (var i = 0; i < _items.Count; i++)
            {
                if (_items[i].Item2.StartTime.AddSeconds(_items[i].Item2.Total) >= ttlParams.StartTime.AddSeconds(ttlParams.Total))
                {
                    _items.Insert(i, newItem);
                    added = true;
                    break;
                }
            }
            if (!added)
            {
                _items.Add(newItem);
            }

            SetTimer(_items[0]);
        }
        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 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);
                        }
                    }
                });
            }
        }