示例#1
0
        private DataTemplate GenerateServiceMessageTemplate(TLMessageBase message)
        {
            var serviceMessage = message as TLMessageService;

            if (serviceMessage == null)
            {
                return(EmptyMessageTemplate);
            }

            if (serviceMessage.Action is TLMessageActionAdminLogEvent adminLog)
            {
                if (adminLog.Event.Action is TLChannelAdminLogEventActionChangePhoto changePhotoAction)
                {
                    if (changePhotoAction.NewPhoto is TLChatPhotoEmpty)
                    {
                        return(EventMessageTemplate);
                    }

                    return(EventMessagePhotoTemplate);
                }
                //else if (adminLog.Event.Action is TLChannelAdminLogEventActionEditMessage)
                //{
                //    return EditedTemplate;
                //}

                return(EventMessageTemplate);
            }
            else if (serviceMessage.Action is TLMessageActionChatEditPhoto)
            {
                return(ServiceMessagePhotoTemplate);
            }

            return(ServiceMessageTemplate);
        }
        private string UpdateStateIcon(TLDraftMessageBase draft, TLMessageBase message, TLMessageState state)
        {
            if (draft is TLDraftMessage)
            {
                return(string.Empty);
            }

            if (message is TLMessage topMessage)
            {
                if (topMessage.IsOut && IsOut(ViewModel))
                {
                    switch (state)
                    {
                    case TLMessageState.Sending:
                        return("\uE600");

                    case TLMessageState.Confirmed:
                        return("\uE602");

                    case TLMessageState.Read:
                        return("\uE601");
                    }
                }
            }

            return(string.Empty);
        }
示例#3
0
        protected override bool SkipMessage(TLMessageBase messageBase)
        {
            var message = messageBase as TLMessage;

            if (message == null)
            {
                return(true);
            }

            var mediaDocument = message.Media as TLMessageMediaDocument;

            if (mediaDocument == null)
            {
                return(true);
            }

            var document = mediaDocument.Document as TLDocument;

            if (document == null)
            {
                return(true);
            }

            if (message.IsSticker() ||
                document.FileName.ToString().EndsWith(".webp", StringComparison.OrdinalIgnoreCase))
            {
                return(true);
            }

            return(false);
        }
示例#4
0
        private void DeleteMessagesInternal(TLObject owner, TLMessageBase lastMessage, IList <TLMessageBase> messages)
        {
            var ids = new TLVector <TLInt>();

            for (int i = 0; i < messages.Count; i++)
            {
                ids.Add(messages[i].Id);
            }

            // duplicate: deleting performed through updates
            CacheService.DeleteMessages(ids);

            BeginOnUIThread(() =>
            {
                for (var i = 0; i < messages.Count; i++)
                {
                    for (var j = 0; j < Items.Count; j++)
                    {
                        var dialog = Items[j] as TLDialog;
                        if (dialog != null &&
                            dialog.TopMessage != null &&
                            dialog.TopMessage.Id.Value == messages[i].Index)
                        {
                            Items.RemoveAt(j);
                            break;
                        }
                    }
                }
            });

            EventAggregator.Publish(new DeleteMessagesEventArgs {
                Owner = owner, Messages = messages
            });
        }
示例#5
0
        public Visual Push(int index, int group, TLMessageBase message)
        {
            if (_cache.Count > 0)
            {
                var border  = _cache.Pop() as Border;
                var ellipse = border.Child as Ellipse;
                ellipse.Fill = Convert.Bubble(group);
                border.Tag   = message;

                _inUse[index] = border;
                ////Headers.Children.Add(border);

                return(ElementCompositionPreview.GetElementVisual(ellipse));
            }
            else
            {
                var ellipse = new Ellipse();
                ellipse.Fill = Convert.Bubble(group);
                ellipse.Tag  = group;

                var border = new Border();
                border.Width  = 32;
                border.Height = 32;
                border.HorizontalAlignment = HorizontalAlignment.Left;
                border.VerticalAlignment   = VerticalAlignment.Top;
                border.Margin = new Thickness(12, 18, 0, 0);
                border.Child  = ellipse;
                border.Tag    = message;

                _inUse[index] = border;
                ////Headers.Children.Add(border);

                return(ElementCompositionPreview.GetElementVisual(ellipse));
            }
        }
示例#6
0
        public async void DeleteMessages(TLMessageBase lastItem, IList <TLMessageBase> localMessages, IList <TLMessageBase> remoteMessages, bool revoke, Action <TLMessageBase, IList <TLMessageBase> > localCallback = null, Action <TLMessageBase, IList <TLMessageBase> > remoteCallback = null)
        {
            if (localMessages != null && localMessages.Count > 0)
            {
                localCallback?.Invoke(lastItem, localMessages);
            }
            if (remoteMessages != null && remoteMessages.Count > 0)
            {
                var messages = new TLVector <int>(remoteMessages.Select(x => x.Id).ToList());

                Task <MTProtoResponse <TLMessagesAffectedMessages> > task;

                if (Peer is TLInputPeerChannel)
                {
                    task = ProtoService.DeleteMessagesAsync(new TLInputChannel {
                        ChannelId = ((TLInputPeerChannel)Peer).ChannelId, AccessHash = ((TLInputPeerChannel)Peer).AccessHash
                    }, messages);
                }
                else
                {
                    task = ProtoService.DeleteMessagesAsync(messages, revoke);
                }

                var response = await task;
                if (response.IsSucceeded)
                {
                    remoteCallback?.Invoke(lastItem, remoteMessages);
                }
            }
        }
示例#7
0
        public void DeleteMessage(TLMessageBase message)
        {
            if (message == null)
            {
                return;
            }

            var messages = new List <TLMessageBase> {
                message
            };

            var owner = CurrentItem as TLObject;

            if (CurrentItem is TLBroadcastChat)
            {
                DeleteMessagesInternal(owner, messages);
                return;
            }

            if ((message.Id == null || message.Id.Value == 0) && message.RandomIndex != 0)
            {
                DeleteMessagesInternal(owner, messages);
                return;
            }

            DialogDetailsViewModel.DeleteMessages(MTProtoService, null, null, messages, null, (result1, result2) => DeleteMessagesInternal(owner, result2));
        }
        private TLMessageBase GetNextMention(TLMessageBase currentMention, TLVector <TLMessageBase> mentions)
        {
            if (mentions == null)
            {
                return(null);
            }
            if (currentMention == null)
            {
                return(mentions.LastOrDefault());
            }

            for (var i = mentions.Count - 1; i >= 0; i--)
            {
                if (mentions[i].Index == currentMention.Index)
                {
                    if (i >= 1)
                    {
                        return(mentions[i - 1]);
                    }
                    break;
                }
            }

            if (mentions.Count > 0)
            {
                return(mentions.LastOrDefault());
            }

            return(null);
        }
        private void PreloadResultHistory(TLMessageBase message)
        {
            var maxId  = message.Id;
            var offset = new TLInt(-10);
            var limit  = new TLInt(Constants.MessagesSlice + 10);

            IList <TLMessageBase> resultHistory;

            if (_resultHistoryCache.TryGetValue(maxId.Value, out resultHistory))
            {
                return;
            }

            var messageCommon = message as TLMessageCommon;

            if (messageCommon != null)
            {
                if (Peer is TLInputPeerChannel)
                {
                    if (messageCommon.ToId is TLPeerChat)
                    {
                        var chat = CacheService.GetChat(messageCommon.ToId.Id);
                        if (chat != null)
                        {
                            MTProtoService.GetHistoryAsync(Stopwatch.StartNew(), chat.ToInputPeer(), new TLPeerChat {
                                Id = chat.Id
                            }, false, new TLInt(0), offset, maxId, limit,
                                                           result =>
                            {
                                ProcessMessages(result.Messages);
                                BeginOnUIThread(() =>
                                {
                                    _resultHistoryCache[maxId.Value] = result.Messages;
                                });
                            },
                                                           error => BeginOnUIThread(() =>
                            {
                                Execute.ShowDebugMessage("messages.getHistory error " + error);
                            }));
                        }

                        return;
                    }
                }
            }

            MTProtoService.GetHistoryAsync(Stopwatch.StartNew(), Peer, TLUtils.InputPeerToPeer(Peer, StateService.CurrentUserId), false, new TLInt(0), offset, maxId, limit,
                                           result =>
            {
                ProcessMessages(result.Messages);
                BeginOnUIThread(() =>
                {
                    _resultHistoryCache[maxId.Value] = result.Messages;
                });
            },
                                           error => BeginOnUIThread(() =>
            {
                Execute.ShowDebugMessage("messages.getHistory error " + error);
            }));
        }
        private void SendContactInternal(TLMessageBase message)
        {
            var message25 = message as TLMessage25;

            if (message25 == null)
            {
                return;
            }

            var mediaContact = message25.Media as TLMessageMediaContact;

            if (mediaContact == null)
            {
                return;
            }

            var inputMediaContact = new TLInputMediaContact
            {
                FirstName   = mediaContact.FirstName,
                LastName    = mediaContact.LastName,
                PhoneNumber = mediaContact.PhoneNumber
            };

            message25.InputMedia = inputMediaContact;

            ShellViewModel.SendMediaInternal(message25, MTProtoService, StateService, CacheService);
        }
        private void SendGeoPointInternal(TLMessageBase message)
        {
            var message25 = message as TLMessage25;

            if (message25 == null)
            {
                return;
            }

            var mediaGeo = message25.Media as TLMessageMediaGeo;

            if (mediaGeo == null)
            {
                return;
            }

            var geoPoint = mediaGeo.Geo as TLGeoPoint;

            if (geoPoint == null)
            {
                return;
            }

            var inputMediaGeoPoint = new TLInputMediaGeoPoint
            {
                GeoPoint = new TLInputGeoPoint {
                    Lat = geoPoint.Lat, Long = geoPoint.Long
                }
            };

            message25.InputMedia = inputMediaGeoPoint;

            ShellViewModel.SendMediaInternal(message25, MTProtoService, StateService, CacheService);
        }
示例#12
0
        protected override bool SkipMessage(TLMessageBase messageBase)
        {
            var message = messageBase as TLMessage;

            if (message == null)
            {
                return(true);
            }

            var mediaDocument = message.Media as TLMessageMediaDocument;

            if (mediaDocument == null)
            {
                return(true);
            }

            var document = mediaDocument.Document as TLDocument22;

            if (document == null)
            {
                return(true);
            }

            var audioAttribute = document.Attributes.FirstOrDefault(x => x is TLDocumentAttributeAudio46) as TLDocumentAttributeAudio46;

            if (audioAttribute == null || audioAttribute.Voice)
            {
                return(true);
            }

            return(false);
        }
示例#13
0
        public void AddToStickers(TLMessageBase messageBase)
        {
            if (messageBase == null)
            {
                return;
            }

            var message = messageBase as TLMessage;

            if (message == null)
            {
                return;
            }

            var mediaDocument = message.Media as TLMessageMediaDocument;

            if (mediaDocument == null)
            {
                return;
            }

            var document = mediaDocument.Document as TLDocument22;

            if (document != null)
            {
                var inputStickerSet = document.StickerSet;
                if (inputStickerSet != null)
                {
                    TelegramViewBase.NavigateToStickers(MTProtoService, StateService, inputStickerSet);
                }
            }
        }
示例#14
0
        private DataTemplate GenerateServiceMessageTemplate(TLMessageBase message)
        {
            var serviceMessage = message as TLMessageService;

            if (serviceMessage == null)
            {
                return(EmptyMessageTemplate);
            }

            if (serviceMessage.Action is TLMessageActionChatEditPhoto)
            {
                return(ServiceMessagePhotoTemplate);
            }
            else if (serviceMessage.Action is TLMessageActionHistoryClear)
            {
                return(EmptyMessageTemplate);
            }
            else if (serviceMessage.Action is TLMessageActionDate)
            {
                return(ServiceMessageLocalTemplate);
            }
            else if (serviceMessage.Action is TLMessageActionUnreadMessages)
            {
                //return ServiceMessageUnreadTemplate;
                return(ServiceMessageLocalTemplate);
            }
            else if (serviceMessage.Action is TLMessageActionPhoneCall)
            {
                return(serviceMessage.IsOut ? ServiceUserCallTemplate : ServiceFriendCallTemplate);
            }

            return(ServiceMessageTemplate);
        }
示例#15
0
        private void SendContactInternal(TLMessageBase messageBase)
        {
            var message = messageBase as TLMessage34;

            if (message == null)
            {
                return;
            }

            var mediaContact = message.Media as TLMessageMediaContact;

            if (mediaContact == null)
            {
                return;
            }

            var inputMediaContact = new TLInputMediaContact82
            {
                FirstName   = mediaContact.FirstName,
                LastName    = mediaContact.LastName,
                PhoneNumber = mediaContact.PhoneNumber,
                VCard       = TLString.Empty
            };

            message.InputMedia = inputMediaContact;

            UploadService.SendMediaInternal(message, MTProtoService, StateService, CacheService);
        }
        private string GetBriefLabel(TLMessageBase value, bool showContent)
        {
            if (ViewModel.Draft is TLDraftMessage draft && !string.IsNullOrWhiteSpace(draft.Message))
            {
                return(draft.Message);
            }

            if (value is TLMessageEmpty messageEmpty)
            {
                return("Resources.EmptyMessage");
            }

            if (value is TLMessageService messageService)
            {
                return(string.Empty);
            }

            if (value is TLMessage message)
            {
                var result = string.Empty;
                if (message.Media != null)
                {
                    if (message.Media is TLMessageMediaDocument documentMedia)
                    {
                        if (string.IsNullOrEmpty(documentMedia.Caption))
                        {
                            return(result);
                        }

                        return(result + documentMedia.Caption.Replace("\r\n", "\n").Replace("\n", " "));
                    }
                    else if (message.Media is TLMessageMediaPhoto photoMedia)
                    {
                        if (string.IsNullOrEmpty(photoMedia.Caption))
                        {
                            return(result);
                        }

                        return(result + photoMedia.Caption.Replace("\r\n", "\n").Replace("\n", " "));
                    }
                    else if (message.Media is TLMessageMediaGame)
                    {
                        return(string.Empty);
                    }
                }

                if (message.Message != null)
                {
                    if (showContent)
                    {
                        return(result + message.Message.Replace("\r\n", "\n").Replace("\n", " "));
                    }

                    //return text + Resources.Message;
                    return(result + "Message");
                }
            }

            return(string.Empty);
        }
        private void PreloadResultHistory(TLMessageBase message)
        {
            var maxId  = message.Id;
            var offset = new TLInt(-6);
            var limit  = new TLInt(14);

            IList <TLMessageBase> resultHistory;

            if (_resultHistoryCache.TryGetValue(maxId.Value, out resultHistory))
            {
                return;
            }

            IsWorking = true;
            MTProtoService.GetHistoryAsync("PreloadResultHistory", Peer, TLUtils.InputPeerToPeer(Peer, StateService.CurrentUserId), false, offset, maxId, limit,
                                           result => BeginOnUIThread(() =>
            {
                IsWorking = false;

                ProcessRepliesAndAudio(result.Messages);

                _resultHistoryCache[maxId.Value] = result.Messages;
            }),
                                           error => BeginOnUIThread(() =>
            {
                IsWorking = false;
                Execute.ShowDebugMessage("messages.getHistory error " + error);
            }));
        }
        // TODO: Encrypted public TLDecryptedMessageBase DecryptedMessage { get; protected set; }

        public MessagesRemovedEventArgs(TLDialog dialog, TLMessageBase message)
        {
            Dialog   = dialog;
            Messages = new List <TLMessageBase> {
                message
            };
        }
示例#19
0
        private void SendLocationInternal(TLMessageBase messageBase)
        {
            var message = messageBase as TLMessage34;

            if (message == null)
            {
                return;
            }

            var mediaGeo = message.Media as TLMessageMediaGeo;

            if (mediaGeo == null)
            {
                return;
            }

            var geoPoint = mediaGeo.Geo as TLGeoPoint;

            if (geoPoint == null)
            {
                return;
            }

            var inputMediaGeoPoint = new TLInputMediaGeoPoint
            {
                GeoPoint = new TLInputGeoPoint {
                    Lat = geoPoint.Lat, Long = geoPoint.Long
                }
            };

            message.InputMedia = inputMediaGeoPoint;

            UploadService.SendMediaInternal(message, MTProtoService, StateService, CacheService);
        }
        private void OpenReplyInternal(TLMessageBase reply, IList <TLMessageBase> messages)
        {
            IsFirstSliceLoaded = false;

            var startPosition = 0;

            for (var i = 0; i < messages.Count; i++)
            {
                startPosition = i;
                if (messages[i].Index == reply.Index)
                {
                    break;
                }
            }

            for (var i = startPosition + 1; i < messages.Count; i++)
            {
                Items.Add(messages[i]);
            }

            HoldScrollingPosition = true;
            BeginOnUIThread(() =>
            {
                for (var i = 0; i < startPosition - 1; i++)
                {
                    Items.Insert(i, messages[i]);
                }
                HoldScrollingPosition = false;
            });
        }
        private void CreateGroupedItems(TLMessageBase currentItem)
        {
            var message73 = currentItem as TLMessage73;

            if (message73 != null && message73.GroupedId != null)
            {
                var firstItem = GroupedItems.FirstOrDefault() as TLMessage73;
                if (firstItem == null ||
                    (firstItem.GroupedId != null &&
                     firstItem.GroupedId.Value != message73.GroupedId.Value))
                {
                    var items = new List <TLMessageBase>();
                    for (var i = _items.Count - 1; i >= 0; i--)
                    {
                        var item = _items[i] as TLMessage73;
                        if (item != null &&
                            item.GroupedId != null &&
                            item.GroupedId.Value == message73.GroupedId.Value)
                        {
                            items.Add(item);
                        }
                    }

                    GroupedItems.IsNotifying = false;
                    GroupedItems.Clear();
                    if (items.Count > 1)
                    {
                        foreach (var item in items)
                        {
                            GroupedItems.Add(item);
                        }
                    }
                    GroupedItems.IsNotifying = true;
                    GroupedItems.Refresh();
                    var view = GetView() as ImageViewerView;
                    if (view != null)
                    {
                        view.ScrollTo(currentItem, 0.0);
                    }
                }
                else if (firstItem.GroupedId != null &&
                         firstItem.GroupedId.Value == message73.GroupedId.Value)
                {
                    var view = GetView() as ImageViewerView;
                    if (view != null)
                    {
                        view.ScrollTo(currentItem, 0.0);
                    }
                }
                else
                {
                    GroupedItems.Clear();
                }
            }
            else
            {
                GroupedItems.Clear();
            }
        }
 private void HighlightMessage(TLMessageBase message)
 {
     message.IsHighlighted = true;
     BeginOnUIThread(TimeSpan.FromSeconds(2.0), () =>
     {
         message.IsHighlighted = false;
     });
 }
示例#23
0
        private async void MessageForwardExecute(TLMessageBase messageBase)
        {
            if (messageBase is TLMessage message)
            {
                SelectionMode = ListViewSelectionMode.None;

                await ShareView.Current.ShowAsync(message);
            }
        }
示例#24
0
        public void ForwardMessage(TLMessageBase message)
        {
            if (message == null)
            {
                return;
            }

            DialogDetailsViewModel.ForwardMessagesCommon(new List <TLMessageBase> {
                message
            }, StateService, NavigationService);
        }
示例#25
0
        public static void SetMessage(DependencyObject obj, TLMessageBase value)
        {
            // TODO: shitty hack!!!
            var oldValue = obj.GetValue(MessageProperty);

            obj.SetValue(MessageProperty, value);

            if (oldValue == value)
            {
                OnMessageChanged(obj as RichTextBlock, value);
            }
        }
示例#26
0
        private DataTemplate GenerateCommonMessageTemplate(TLMessageBase m)
        {
            var messageCommon = m as TLMessageCommon;

            if (messageCommon != null)
            {
                var message40 = messageCommon as TLMessage40;
                //if (message40 != null && message40.Views != null && message40.Views.Value > 0)
                if (message40 != null && (message40.FromId == null || message40.FromId.Value < 0))
                {
                    if (message40.IsSticker())
                    {
                        return(ChatStickerTemplate);
                    }

                    return(ChatMessageTemplate);
                }

                if (messageCommon.IsSticker())
                {
                    if (messageCommon.Out.Value)
                    {
                        return(UserStickerTemplate ?? EmptyMessageTemplate);
                    }

                    if (messageCommon.ToId is TLPeerChat || messageCommon.ToId is TLPeerBroadcast)
                    {
                        return(ChatFriendStickerTemplate ?? EmptyMessageTemplate);
                    }

                    return(FriendStickerTemplate ?? EmptyMessageTemplate);
                }
                else
                {
                    if (messageCommon.Out.Value)
                    {
                        return(UserMessageTemplate ?? EmptyMessageTemplate);
                    }

                    if (messageCommon.ToId is TLPeerChat || messageCommon.ToId is TLPeerBroadcast || messageCommon.ToId is TLPeerChannel)
                    {
                        return(ChatFriendMessageTemplate ?? EmptyMessageTemplate);
                    }

                    return(FriendMessageTemplate ?? EmptyMessageTemplate);
                }

                return(EmptyMessageTemplate);
            }

            return(EmptyMessageTemplate);
        }
示例#27
0
        private void MessageForwardExecute(TLMessageBase message)
        {
            if (message is TLMessage)
            {
                //await ShareView.Current.ShowAsync(new TLStickerSet());
                //return;

                App.InMemoryState.ForwardMessages = new List <TLMessage> {
                    message as TLMessage
                };
                NavigationService.GoBackAt(0);
            }
        }
示例#28
0
        private DataTemplate GenerateCommonMessageTemplate(TLMessageBase m)
        {
            var message = m as TLMessage;

            if (message == null)
            {
                return(EmptyMessageTemplate);
            }

            if (message.Media is TLMessageMediaPhoto photoMedia && photoMedia.HasTTLSeconds && (photoMedia.Photo is TLPhotoEmpty || !photoMedia.HasPhoto))
            {
                return(ServiceMessageTemplate);
            }
示例#29
0
        public void ScrollTo(TLMessageBase currentItem, double duration)
        {
#if !NO_RIBBON
            var index = ViewModel.GroupedItems.IndexOf(currentItem);
            if (index != -1)
            {
                _index    = index;
                _duration = duration;

                Ribbon.LayoutUpdated += Ribbon_LayoutUpdated;
            }
#endif
        }
示例#30
0
        public void Handle(TLMessageBase message)
        {
            var serviceMessage = message as TLMessageService;

            if (serviceMessage != null)
            {
                var editTitleAction = serviceMessage.Action as TLMessageActionChatEditTitle;
                if (editTitleAction != null && serviceMessage.ToId.Id.Value == Chat.Index)
                {
                    NotifyOfPropertyChange(() => Chat);
                }
            }
        }