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); }
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); } } }); } }