public async Task <Model.Feed> RetrieveSportsFeed()
        {
            var stopwatch = new System.Diagnostics.Stopwatch();

            stopwatch.Start();
            if (!_config.HasProperty(feedClientConfigKey))
            {
                throw new Failure("[feedClientUrl] config is null.");
            }
            string url = _config.ReadProperty(feedClientConfigKey);

            Model.Feed result = new Model.Feed();
            using (var httpClient = new HttpClient())
            {
                var request  = new HttpRequestMessage(HttpMethod.Get, url);
                var response = await httpClient.SendAsync(request);

                using (var content = await response.Content.ReadAsStreamAsync())
                {
                    result.Sports = _feedSerializer.SerializeFeed(content);
                }
            }
            stopwatch.Stop();
            return(result);
        }
        public Task <IList <Model.FeedItem> > DownloadRssFeedAsync(Model.Feed feed)
        {
            return(Task.Run(async() =>
            {
                IList <Model.FeedItem> feedItems = new List <Model.FeedItem>();

                var rssFeed = await FeedReader.ReadAsync(feed.Url);

                // TO ACCESS CUSTOM FEED METADATA BY RSS FEED VERSION
                // NOT USED AT THE MOMENT
                if (rssFeed.Type == FeedType.Rss_2_0)
                {
                    var rss20feed = (CodeHollow.FeedReader.Feeds.Rss20Feed)rssFeed.SpecificFeed;
                }

                Console.WriteLine($"FeedDownloader.DownloadRssFeedAsync(): loading RSS feed from {feed.Url}");

                foreach (var item in rssFeed.Items)
                {
                    var newItem = MapSyndicationFeedItemToFeedItem(item, rssFeed.Type);
                    if (newItem != null)
                    {
                        newItem.FeedId = feed.Id;
                        feedItems.Add(newItem);
                    }
                }

                Console.WriteLine($"FeedDownloader.DownloadRssFeedAsync(): retrieved {feedItems.Count} feed items");

                return feedItems;
            }));
        }
        private void MarkFeedRead(RoutedEventArgs e)
        {
            if (_selectedNode == null)
            {
                return;
            }
            SimpleTreeNodeViewModel tvm = (SimpleTreeNodeViewModel)_selectedNode;

            if (tvm.Node is Model.Feed)
            {
                Model.Feed selectedFeed = (Model.Feed)tvm.Node;
                Data.Feed  df           = new Data.Feed(selectedFeed);
                df.MarkAllRead();
            }
            else if (tvm.Node is Model.Host)
            {
                Model.Host selectedHost = (Model.Host)tvm.Node;
                Data.Host  dh           = new Data.Host(selectedHost);
                dh.MarkAllRead();
            }
            else
            {
                return;
            }

            foreach (Article a in Articles)
            {
                a.Unread = false;
            }
        }
 /// <summary>
 /// Formats a description based on feed and latest message
 /// </summary>
 /// <param name="feed">feed object</param>
 /// <param name="latestMessage">latest message</param>
 /// <returns>markdown-formatted description of feed and latest message</returns>
 private static string FormatDescription(Model.Feed feed, Model.Message latestMessage)
 {
     return($"FindMeSpot feed for {feed.Name}\n" +
            $"Current coordinates: Latitude: {latestMessage.Latitude}\n" +
            $"Longitude: {latestMessage.Longitude}\n" +
            $"Altitude: {latestMessage.Altitude}\n" +
            $"Date/time: {latestMessage.DateTime}\n");
 }
 private void SeedFeeds(dbContext db)
 {
     if (!db.Feeds.Any())
     {
         var feed = new Model.Feed()
         {
             RssUrl = "http://feeds.arstechnica.com/arstechnica/index", Title = "ARS Technica", CreatedOn = DateTime.Now, LastRetrievedOn = DateTime.Now
         };
         db.Feeds.Add(feed);
         db.SaveChanges();
     }
 }
        private async void DeleteFeed(RoutedEventArgs e)
        {
            if (_selectedNode == null)
            {
                return;
            }
            SimpleTreeNodeViewModel tvm = (SimpleTreeNodeViewModel)_selectedNode;

            Model.Feed selectedFeed = null;
            if (tvm.Node is Model.Feed)
            {
                selectedFeed = (Model.Feed)tvm.Node;
            }
            else
            {
                return;
            }


            // Hides browser otherwise dialog gets behind it
            IsBrowserVisible = false;
            RaisePropertyChanged("IsBrowserVisible");

            MessageDialogResult result = await _dialogCoordinator.ShowMessageAsync(this, "Delete Feed", "This action also deletes all downloaded articles and cannot be undone. Are you sure?", MessageDialogStyle.AffirmativeAndNegative);

            if (result == MessageDialogResult.Affirmative)
            {
                string errMsg = null;
                try
                {
                    Data.Feed feed = new Data.Feed(selectedFeed);
                    feed.Delete();
                }
                catch (Exception ex)
                {
                    errMsg = ex.Message;
                }
                if (errMsg != null)
                {
                    await _dialogCoordinator.ShowMessageAsync(this, "Edit Feed", "Unable to edit feed with the supplied URL: " + errMsg);
                }
            }
            IsBrowserVisible = true;
            RaisePropertyChanged("IsBrowserVisible");
            InitializeData(true);
        }
        public Model.OperationStatus UpdateFeed(Model.Feed feed)
        {
            var opStatus = new OperationStatus()
            {
                Status = true
            };

            using (var context = DataContext)
            {
                var item = context.Feeds.FirstOrDefault(m => m.Id == feed.Id);
                item.CreatedOn       = feed.CreatedOn;
                item.LastRetrievedOn = feed.LastRetrievedOn;
                item.RssUrl          = feed.RssUrl;

                opStatus.RecordsAffected = context.SaveChanges();
            }

            return(opStatus);
        }
        public Model.OperationStatus InsertFeed(Model.Feed feed)
        {
            var opStatus = new OperationStatus()
            {
                Status = true
            };

            using (var context = DataContext)
            {
                var item = new Feed();

                item.CreatedOn       = feed.CreatedOn;
                item.LastRetrievedOn = feed.LastRetrievedOn;
                item.RssUrl          = feed.RssUrl;

                context.Feeds.Add(item);

                opStatus.RecordsAffected = context.SaveChanges();

                RetrieveItems(item.Id);
            }

            return(opStatus);
        }
Exemple #9
0
 public Feed(Model.Feed f) : base(f)
 {
 }
        private void InitializeData(Boolean refreshTreeView)
        {
            SetStatusMessage("Loading");
            //
            // Read from Database
            //
            _allData = Data.Host.LoadAll();

            SetStatusMessage("Loaded");

            //
            // Update the treeview
            //

            if (refreshTreeView)
            {
                //Set selected item
                TreeModel.Items[0].IsSelected = true;
                RaisePropertyChanged("TreeModel");
                SelectedItemChanged(new RoutedPropertyChangedEventArgs <object>(null, TreeModel.Items[0]));
            }

            //
            // Update articles
            //
            if (_selectedNode != null)
            {
                SimpleTreeNodeViewModel tvm = (SimpleTreeNodeViewModel)_selectedNode;
                if (tvm.Node is Model.Feed)
                {
                    SetStatusMessage("Updating Articles (feed)... ");
                    Model.Feed selectedFeed = (Model.Feed)tvm.Node;
                    // Find the feed and add the Articles
                    foreach (Host h in _allData)
                    {
                        Feed f = h.Feeds.FirstOrDefault(el => el.Location.Equals(selectedFeed.Location));
                        if (f != null)
                        {
                            Articles.AddMissing(f.Articles, new ArticleEqualityComparer(), _uiContext);
                        }
                    }
                }
                else if (tvm.Node is Model.Host)
                {
                    SetStatusMessage("Updating Articles (host)... ");
                    Model.Host selectedHost = (Model.Host)tvm.Node;
                    // Find the host and add the Articels
                    Model.Host h = _allData.FirstOrDefault(el => el.Location.Equals(selectedHost.Location));
                    foreach (Model.Feed feed in h.Feeds)
                    {
                        Articles.AddMissing(feed.Articles, new ArticleEqualityComparer(), _uiContext);
                    }
                }
                else
                {
                    SetStatusMessage("Updating Articles (article)... ");
                    foreach (Model.Host h in _allData)
                    {
                        foreach (Model.Feed feed in h.Feeds)
                        {
                            Articles.AddMissing(feed.Articles, new ArticleEqualityComparer(), _uiContext);
                        }
                    }
                }
            }
            if (refreshTreeView)
            {
                SetStatusMessage("Refreshing Article list");
                SetSortOrder();
            }
            SetStatusMessage("Ready");
        }
        private async void EditFeed(RoutedEventArgs e)
        {
            if (_selectedNode == null)
            {
                return;
            }
            SimpleTreeNodeViewModel tvm = (SimpleTreeNodeViewModel)_selectedNode;

            Model.Feed selectedFeed = null;
            if (tvm.Node is Model.Feed)
            {
                selectedFeed = (Model.Feed)tvm.Node;
            }
            else
            {
                if (tvm.Node is Model.Host)
                {
                    try
                    {
                        Model.Host selectedHost = (Model.Host)tvm.Node;
                        IsBrowserVisible = false;
                        RaisePropertyChanged("IsBrowserVisible");
                        MetroDialogSettings diagSettings = new MetroDialogSettings();
                        diagSettings.DefaultText = selectedHost.Zoom.ToString();
                        var ZoomLevel = await _dialogCoordinator.ShowInputAsync(this, "Set Zoom Level", "Enter the desired zoom level for this host: ", diagSettings);

                        int prevZoom = selectedHost.Zoom;
                        selectedHost.Zoom = Int32.Parse(ZoomLevel.ToString());
                        Data.Host dh = new Data.Host(selectedHost);
                        dh.Save();

                        if (prevZoom != selectedHost.Zoom)
                        {
                            var msg = new SendSetZoomMessage(selectedHost.Zoom);
                            msg.SetImmediately = true;
                            Messenger.Default.Send <SendSetZoomMessage>(msg);
                        }
                    }
                    catch (Exception ex)
                    {
                        await _dialogCoordinator.ShowMessageAsync(this, "Set Zoom Level", "Unable to set zoom: " + ex.Message);
                    }
                    finally
                    {
                        IsBrowserVisible = true;
                        RaisePropertyChanged("IsBrowserVisible");
                    }
                }
                return;
            }


            // Hides browser otherwise dialog gets behind it
            IsBrowserVisible = false;
            RaisePropertyChanged("IsBrowserVisible");
            MetroDialogSettings dialogSettings = new MetroDialogSettings();

            dialogSettings.DefaultText = selectedFeed.Location.ToString();
            var FeedText = await _dialogCoordinator.ShowInputAsync(this, "Edit feed", "Enter the URL of the feed:", dialogSettings);

            if (FeedText != null)
            {
                string errMsg = null;
                try
                {
                    Uri       feedUri = new Uri(FeedText);
                    Data.Feed f       = new Data.Feed(selectedFeed);
                    f.Location = feedUri;
                    f.UpdateFromUri(true, RetentionDays);
                    f.Save(true);
                    InitializeData(true);
                }
                catch (Exception ex)
                {
                    errMsg = ex.Message;
                }
                if (errMsg != null)
                {
                    await _dialogCoordinator.ShowMessageAsync(this, "Edit Feed", "Unable to edit feed with the supplied URL: " + errMsg);
                }
            }
            IsBrowserVisible = true;
            RaisePropertyChanged("IsBrowserVisible");
        }