示例#1
0
        private ImageSource ConvertPhoto(string title, BitmapImage preview)
        {
            if (preview != null)
            {
                return(preview);
            }

            return(PlaceholderHelper.GetNameForChat(title, 64));
        }
示例#2
0
        public void UpdateMessage(IProtoService protoService, INavigationService navigationService, Message message)
        {
            _protoService      = protoService;
            _navigationService = navigationService;

            var caption = message.GetCaption();

            if (caption == null)
            {
                return;
            }

            var text = message.Content as MessageText;

            var links    = new List <string>();
            var hasThumb = false;

            string title         = null;
            string description   = null;
            string description2  = null;
            string webPageLink   = null;
            bool   webPageCached = false;

            var webPage = text?.WebPage;

            if (webPage != null)
            {
                title = webPage.Title;
                if (string.IsNullOrEmpty(title))
                {
                    title = webPage.SiteName;
                }

                description   = string.IsNullOrEmpty(webPage.Description?.Text) ? null : webPage.Description?.Text;
                webPageLink   = webPage.Url;
                webPageCached = webPage.InstantViewVersion != 0;

                //hasThumb = webPage.HasPhoto && webPage.Photo is TLPhoto photo && photo.Thumb != null;
            }

            if (caption.Entities.Count > 0)
            {
                for (int a = 0; a < caption.Entities.Count; a++)
                {
                    var entity = caption.Entities[a];
                    if (entity.Length <= 0 || entity.Offset < 0 || entity.Offset >= caption.Text.Length)
                    {
                        continue;
                    }
                    else if (entity.Offset + entity.Length > caption.Text.Length)
                    {
                        entity.Length = caption.Text.Length - entity.Offset;
                    }

                    if (a == 0 && webPageLink != null && !(entity.Offset == 0 && entity.Length == caption.Text.Length))
                    {
                        if (caption.Entities.Count == 1)
                        {
                            if (description == null)
                            {
                                description2 = caption.Text;
                            }
                        }
                        else
                        {
                            description2 = caption.Text;
                        }
                    }

                    try
                    {
                        String link = null;
                        if (entity.Type is TextEntityTypeTextUrl || entity.Type is TextEntityTypeUrl)
                        {
                            if (entity.Type is TextEntityTypeUrl)
                            {
                                link = caption.Text.Substring(entity.Offset, entity.Length);
                            }
                            else if (entity.Type is TextEntityTypeTextUrl textUrl)
                            {
                                link = textUrl.Url;
                            }
                            if (title == null || title.Length == 0)
                            {
                                title = link;
                                var url = link;
                                if (url.StartsWith("http") == false)
                                {
                                    url = "http://" + url;
                                }

                                Uri uri = new Uri(url);
                                title = uri.Host;
                                if (title == null)
                                {
                                    title = link;
                                }
                                int index;
                                if (title != null && (index = title.LastIndexOf('.')) >= 0)
                                {
                                    title = title.Substr(0, index);
                                    if ((index = title.LastIndexOf('.')) >= 0)
                                    {
                                        title = title.Substring(index + 1);
                                    }
                                    title = title.Substring(0, 1).ToUpper() + title.Substring(1);
                                }
                                if (entity.Offset != 0 || entity.Length != caption.Text.Length)
                                {
                                    description = caption.Text;
                                }
                            }
                        }
                        else if (entity.Type is TextEntityTypeEmailAddress)
                        {
                            if (title == null || title.Length == 0)
                            {
                                link  = "mailto:" + caption.Text.Substring(entity.Offset, entity.Length);
                                title = caption.Text.Substring(entity.Offset, entity.Length);
                                if (entity.Offset != 0 || entity.Length != caption.Text.Length)
                                {
                                    description = caption.Text;
                                }
                            }
                        }
                        if (link != null)
                        {
                            if (link.ToLower().IndexOf("http") != 0 && link.ToLower().IndexOf("mailto") != 0)
                            {
                                links.Add("http://" + link);
                            }
                            else
                            {
                                links.Add(link);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        //FileLog.e(e);
                    }
                }
            }

            if (webPageLink != null && links.Count == 0)
            {
                links.Add(webPageLink);
            }

            //if (hasThumb)
            //{
            //    Thumbnail.Visibility = Visibility.Visible;
            //}
            //else
            //{
            //    Thumbnail.Visibility = Visibility.Collapsed;
            //}

            if (title != null)
            {
                TitleLabel.Text       = title.Replace('\n', ' ');
                TitleLabel.Visibility = Visibility.Visible;
            }
            else
            {
                TitleLabel.Visibility = Visibility.Collapsed;
            }

            if (description != null)
            {
                DescriptionLabel.Text       = description;
                DescriptionLabel.Visibility = Visibility.Visible;
            }
            else
            {
                DescriptionLabel.Visibility = Visibility.Collapsed;
            }

            if (description2 != null)
            {
                Description2Label.Text       = description2;
                Description2Label.Visibility = Visibility.Visible;

                if (description != null)
                {
                    Description2Label.Margin = new Thickness(0, 8, 0, 0);
                }
                else
                {
                    Description2Label.Margin = new Thickness(0);
                }
            }
            else
            {
                Description2Label.Visibility = Visibility.Collapsed;
            }

            LinksPanel.Children.Clear();
            LinksPanel.RowDefinitions.Clear();

            for (int i = 0; i < links.Count; i++)
            {
                var link = links[i];
                if (MessageHelper.TryCreateUri(link, out Uri uri))
                {
                    if (Photo.Source == null)
                    {
                        Photo.Source = PlaceholderHelper.GetNameForChat(uri.Host, 96, uri.GetHashCode());
                    }

                    var textBlock = new RichTextBlock {
                        TextWrapping = TextWrapping.NoWrap, TextTrimming = TextTrimming.CharacterEllipsis, IsTextSelectionEnabled = false
                    };
                    var paragraph = new Paragraph();
                    var hyperlink = new Hyperlink {
                        UnderlineStyle = UnderlineStyle.None
                    };

                    if (link == webPageLink && webPageCached)
                    {
                        hyperlink.Inlines.Add(new Run {
                            Text = "\uE611", FontSize = 12, FontFamily = App.Current.Resources["TelegramThemeFontFamily"] as FontFamily
                        });
                        hyperlink.Inlines.Add(new Run {
                            Text = " \u200D"
                        });

                        hyperlink.Click += (s, args) => InstantView_Click(s, link);
                    }
                    else
                    {
                        hyperlink.Click += (s, args) => Hyperlink_Click(s, uri);
                    }

                    hyperlink.Inlines.Add(new Run {
                        Text = link
                    });
                    paragraph.Inlines.Add(hyperlink);
                    paragraph.Inlines.Add(new Run {
                        Text = " "
                    });
                    textBlock.Blocks.Add(paragraph);
                    textBlock.ContextRequested += Paragraph_ContextRequested;

                    MessageHelper.SetEntityData(hyperlink, link);

                    ToolTipService.SetToolTip(hyperlink, link);
                    Grid.SetRow(textBlock, i);

                    LinksPanel.RowDefinitions.Add(new RowDefinition {
                        Height = new GridLength(1, GridUnitType.Auto)
                    });
                    LinksPanel.Children.Add(textBlock);
                }
            }
        }
        private void OnElementPrepared(ItemsRepeater sender, ItemsRepeaterElementPreparedEventArgs args)
        {
            var button = args.Element as Button;
            var result = button.DataContext as InlineQueryResult;

            var content = button.Content as Grid;

            if (content.Children[0] is Image image)
            {
                if (result is InlineQueryResultAnimation || result is InlineQueryResultPhoto || result is InlineQueryResultVideo)
                {
                    File file = null;
                    if (result is InlineQueryResultAnimation animation)
                    {
                        file = animation.Animation.Thumbnail?.File;
                    }
                    else if (result is InlineQueryResultPhoto photo)
                    {
                        file = photo.Photo.GetSmall().Photo;
                    }
                    else if (result is InlineQueryResultVideo video)
                    {
                        file = video.Video.Thumbnail?.File;
                    }

                    if (file == null)
                    {
                        return;
                    }

                    if (file.Local.IsDownloadingCompleted)
                    {
                        image.Source = new BitmapImage(new Uri("file:///" + file.Local.Path));
                    }
                    else if (file.Local.CanBeDownloaded && !file.Local.IsDownloadingActive)
                    {
                        image.Source = null;
                        DownloadFile(_thumbnails, file.Id, result);
                    }
                }
                else if (result is InlineQueryResultSticker sticker)
                {
                    var file = sticker.Sticker.Thumbnail.File;
                    if (file == null)
                    {
                        return;
                    }

                    if (file.Local.IsDownloadingCompleted)
                    {
                        image.Source = PlaceholderHelper.GetWebPFrame(file.Local.Path);
                    }
                    else if (file.Local.CanBeDownloaded && !file.Local.IsDownloadingActive)
                    {
                        image.Source = null;
                        DownloadFile(_thumbnails, file.Id, result);
                    }
                }
            }
            else if (content.Children[0] is Grid presenter)
            {
                //var presenter = content.Children[0] as Grid;
                var thumb = presenter.Children[0] as Image;

                var title       = content.Children[1] as TextBlock;
                var description = content.Children[2] as TextBlock;

                File file = null;
                Uri  uri  = null;

                if (result is InlineQueryResultArticle article)
                {
                    file             = article.Thumbnail?.File;
                    title.Text       = article.Title;
                    description.Text = article.Description;
                }
                else if (result is InlineQueryResultAudio audio)
                {
                    file             = audio.Audio.AlbumCoverThumbnail?.File;
                    title.Text       = audio.Audio.GetTitle();
                    description.Text = audio.Audio.GetDuration();
                }
                else if (result is InlineQueryResultContact contact)
                {
                    file             = contact.Thumbnail?.File;
                    title.Text       = contact.Contact.GetFullName();
                    description.Text = PhoneNumber.Format(contact.Contact.PhoneNumber);
                }
                else if (result is InlineQueryResultDocument document)
                {
                    file       = document.Document.Thumbnail?.File;
                    title.Text = document.Title;

                    if (string.IsNullOrEmpty(document.Description))
                    {
                        description.Text = FileSizeConverter.Convert(document.Document.DocumentValue.Size);
                    }
                    else
                    {
                        description.Text = document.Description;
                    }
                }
                else if (result is InlineQueryResultGame game)
                {
                    file             = game.Game.Animation?.Thumbnail?.File ?? game.Game.Photo.GetSmall().Photo;
                    title.Text       = game.Game.Title;
                    description.Text = game.Game.Description;
                }
                else if (result is InlineQueryResultLocation location)
                {
                    var latitude  = location.Location.Latitude.ToString(CultureInfo.InvariantCulture);
                    var longitude = location.Location.Longitude.ToString(CultureInfo.InvariantCulture);

                    uri              = new Uri(string.Format("https://dev.virtualearth.net/REST/v1/Imagery/Map/Road/{0},{1}/{2}?mapSize={3}&key=FgqXCsfOQmAn9NRf4YJ2~61a_LaBcS6soQpuLCjgo3g~Ah_T2wZTc8WqNe9a_yzjeoa5X00x4VJeeKH48wAO1zWJMtWg6qN-u4Zn9cmrOPcL", latitude, longitude, 15, "96,96"));
                    file             = location.Thumbnail?.File;
                    title.Text       = location.Title;
                    description.Text = $"{location.Location.Latitude};{location.Location.Longitude}";
                }
                else if (result is InlineQueryResultPhoto photo)
                {
                    file             = photo.Photo.GetSmall().Photo;
                    title.Text       = photo.Title;
                    description.Text = photo.Description;
                }
                else if (result is InlineQueryResultVenue venue)
                {
                    var latitude  = venue.Venue.Location.Latitude.ToString(CultureInfo.InvariantCulture);
                    var longitude = venue.Venue.Location.Longitude.ToString(CultureInfo.InvariantCulture);

                    uri  = new Uri(string.Format("https://dev.virtualearth.net/REST/v1/Imagery/Map/Road/{0},{1}/{2}?mapSize={3}&key=FgqXCsfOQmAn9NRf4YJ2~61a_LaBcS6soQpuLCjgo3g~Ah_T2wZTc8WqNe9a_yzjeoa5X00x4VJeeKH48wAO1zWJMtWg6qN-u4Zn9cmrOPcL", latitude, longitude, 15, "96,96"));
                    file = venue.Thumbnail?.File;

                    title.Text       = venue.Venue.Title;
                    description.Text = venue.Venue.Address;
                }
                else if (result is InlineQueryResultVideo video)
                {
                    file             = video.Video.Thumbnail?.File;
                    title.Text       = video.Title;
                    description.Text = video.Description;
                }
                else if (result is InlineQueryResultVoiceNote voiceNote)
                {
                    title.Text       = voiceNote.Title;
                    description.Text = voiceNote.VoiceNote.GetDuration();
                }

                if (file != null)
                {
                    if (file.Local.IsDownloadingCompleted)
                    {
                        thumb.Source = new BitmapImage(new Uri("file:///" + file.Local.Path));
                    }
                    else if (file.Local.CanBeDownloaded && !file.Local.IsDownloadingActive)
                    {
                        thumb.Source = null;
                        DownloadFile(_thumbnails, file.Id, result);
                    }
                }
                else if (uri != null)
                {
                    thumb.Source = new BitmapImage(uri);
                }
                else
                {
                    thumb.Source = PlaceholderHelper.GetNameForChat(title.Text, 96, title.Text.GetHashCode());
                }
            }
        }