/// <summary> /// databind function of listview is called from this function. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { // See if feed data is in the cache IEnumerable <SyndicationItem> items = Cache["Feeds"] as IEnumerable <SyndicationItem>; if (items == null) { // If not present in cache then get it from sender's website try { SyndicationFeed sfFeed = SyndicationFeed.Load(XmlReader.Create("FEED URL OF senders website")); // every website has a static url which contains their feed and we can get the feed from that url. items = sfFeed.Items; } catch { items = new List <SyndicationItem>(); } // Add the items to the cache Cache.Insert("Feeds", items, null, DateTime.Now.AddHours(1.0), TimeSpan.Zero); } // Creating the datatable to bind it to the listview. This datatable will contain all the feeds from the senders website. DataTable dtItems = new DataTable(); dtItems.Columns.Add("Title", typeof(string)); dtItems.Columns.Add("Link", typeof(string)); foreach (SyndicationItem synItem in items) { dtItems.Rows.Add(synItem.Title.Text, synItem.Links[0].Uri.ToString()); } FeedList.DataSource = dtItems; FeedList.DataBind(); }
async Task asyAll4Steps() { try { DF = FC = DC = AG = Brushes.LightGray; MUProgressPerc = 0; MUProgressState = TaskbarItemProgressState.Normal; //Bpr.BeepFDNK(2000, 100, 20); #if DEBUG_THIS Bpr.BeepDone(); await asy4AnonsGenr(); #else await asy1UpdtFeeds(); await asy2FindNewDL(); onDbSave(); await asy3UpdtDnLds(); onDbSave(); await asy4AnonsGenr(); await asy2FindNewDL(FeedList.Where(r => !r.IsDeleted).ToList()); onDbSave(null); #endif RecentCmd.Execute(null); } finally { MUProgressPerc = 1; MUProgressState = TaskbarItemProgressState.Paused; Bpr.BeepDone(); } }
async Task asy1UpdtFeeds(List <Feed> feeds = null) { MUProgressPerc += .06; MUProgressState = TaskbarItemProgressState.Normal; if (feeds == null) { feeds = FeedList.ToList(); } //todo: var feeds2 = FeedList.Select(r => r); _crlnTS = DateTime.Now; _sw = Stopwatch.StartNew(); DF = Brushes.Blue; _cts = new CancellationTokenSource(); try { Appender = "F1. Updating Feeds ... "; await asyUpdtFeedsCT(_cts.Token, feeds); //////////////////////////////////////////////////////////////////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Appender += "complete. \r\n"; // InfoMsg += DbSaveLib.TrySaveReport(db) + " Updating Feeds ... complete."; _cts = null; IsBusy = false; DF = Brushes.LightGreen; MUProgressPerc += .1; MUProgressState = TaskbarItemProgressState.Paused; } catch (OperationCanceledException ex) { ex.Log(); Appender += "\r\nDownloads canceled.\r\n"; DF = Brushes.Violet; } catch (Exception ex) { ex.Log(); Appender += "\r\nDownloads failed.\r\n" + ex.ToString(); DF = Brushes.Violet; } }
public async Task <ActionResult> Index(int?page) { List <RootObject> FeedList; ApiHelper apihelper = new ApiHelper(); if (storedlist == null) { FeedList = await apihelper.GetAPIData("", "", ""); storedlist = FeedList; } else { FeedList = storedlist; } var FeedCount = FeedList.Count(); ViewBag.PageCount = FeedCount / 100; ViewBag.Pageno = page; ViewBag.FeedsCount = FeedCount; int pageindex = 1; pageindex = page.HasValue ? Convert.ToInt32(page) : 1; List <RootObject> feedlist = new List <RootObject>(); var test = FeedList.ToPagedList(pageindex, 10); return(View(test)); }
private Task ExtractFeedListFromXmlAsync(string responseString, FeedList feedList) { return(Task.Run(() => { XDocument doc = XDocument.Parse(responseString); var channel = doc.Root?.Descendants() .First(i => i.Name.LocalName == "channel") .Elements().ToList(); //extract feed items var feedItems = channel .Where(i => i.Name.LocalName == "item") .Select(item => new FeedItem { Description = item.Elements().First(i => i.Name.LocalName == "description").Value, Content = item.Elements().First(i => i.Name.ToString().Contains("content")).Value, Link = item.Elements().First(i => i.Name.LocalName == "link").Value, PublishDate = this.ParseDate(item.Elements().First(i => i.Name.LocalName == "pubDate").Value), Title = item.Elements().First(i => i.Name.LocalName == "title").Value }); feedList.Items = feedItems.ToList(); feedList.Title = channel.FirstOrDefault(i => i.Name.LocalName == "title")?.Value; feedList.Link = channel.FirstOrDefault(i => i.Name.LocalName == "link" && !i.IsEmpty)?.Value; feedList.Description = channel.FirstOrDefault(i => i.Name.LocalName == "description")?.Value; var dtString = channel.FirstOrDefault(i => i.Name.LocalName == "lastBuildDate")?.Value; feedList.PublishDate = this.ParseDate(dtString); })); }
/// <summary> /// Create a new ItemDescriptionView connected to <paramref name="listView"/>. /// </summary> /// <param name="listView"></param> public ItemDescriptionView(FeedList feeds) { this.feeds = feeds; fadeTimer = new Timer(); fadeTimer.Tick += new EventHandler(fadeTimer_Tick); fadeTimer.Enabled = true; fadeTimer.Start(); }
public IActionResult Get(int id) { FeedList feedList = db.UrlsList.FirstOrDefault(x => x.Id == id); if (feedList == null) { return(NotFound()); } return(new ObjectResult(feedList)); }
public FeedListView(string title, FeedList feeds) { if (feeds == null) { throw new ArgumentNullException("feeds"); } this.feeds = feeds; this.title = title; }
public void save(Kategorier kategorier, FeedList feedList) { var xmlFeed = new System.Xml.Serialization.XmlSerializer(typeof(FeedList)); saveOpen.saveXML(feedList, xmlFeed, false); var xmlCategory = new System.Xml.Serialization.XmlSerializer(typeof(Kategorier)); saveOpen.saveXML(kategorier, xmlCategory, true); }
public void AddFeed(Feed feed) { if (feed != null) { if (!FeedList.Contains(feed)) { UrlList.Add(feed.Link); FeedList.Add(feed); } } }
public IActionResult Delete(int id) { FeedList url = db.UrlsList.FirstOrDefault(x => x.Id == id); if (url == null) { return(NotFound()); } db.UrlsList.Remove(url); db.SaveChanges(); return(Ok(url)); }
public IActionResult Put([FromBody] FeedList url) { if (url == null) { return(BadRequest()); } if (!db.UrlsList.Any(x => x.Id == url.Id)) { return(NotFound()); } db.Update(url); db.SaveChanges(); return(Ok(url)); }
protected void Page_Load(object sender, EventArgs e) { var feeds = CurrentBlog.SyndicationFeeds; if (feeds == null || feeds.Count() == 0) { this.Visible = false; return; } if (FeedList != null) { FeedList.DataSource = feeds; FeedList.DataBind(); } }
private static FeedList FeedListParser(string json) { JObject jsonObj = JsonConvert.DeserializeObject <JObject>(json); FeedList feeds = new FeedList(); object[] feedsData = ((JArray)jsonObj["feeds"]).ToObject <object[]>(); foreach (JObject feed in feedsData) { feeds.Feeds.Add(feed.ToObject <Dictionary <string, object> >()); } feeds.Status = jsonObj["status"].ToObject <string>(); return(feeds); }
public IActionResult Post([FromBody] FeedList url) { if (url == null) { ModelState.AddModelError("", "Не указан адрес ресурса"); return(BadRequest(ModelState)); } // если есть ошибки - возвращаем ошибку 400 if (!ModelState.IsValid) { return(BadRequest(ModelState)); } // если ошибок нет, сохраняем в базу данных db.UrlsList.Add(url); db.SaveChanges(); return(Ok(url)); }
async Task asy3UpdtDnLds() { MUProgressPerc += .06; MUProgressState = TaskbarItemProgressState.Normal; _sw = Stopwatch.StartNew(); _crlnTS = DateTime.Now; DC = Brushes.Blue; _cts = new CancellationTokenSource(); try { Appender += $"F3. Downloading {FeedList.Sum(r => r.NewCastCount)} new casts ... "; await asyUpdtDnLdsCT(_cts.Token); //////////////////////////////////////////////////////////////////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Appender += "done. "; SelectFeed = null; // <== show dnld list. _cts = null; IsBusy = false; DC = Brushes.LightGreen; } catch (OperationCanceledException ex) { ex.Log(); Appender += "\r\nDownloads canceled.\r\n"; DC = Brushes.Violet; } catch (Exception ex) { ex.Log(); Appender += "\r\nDownloads failed.\r\n" + ex.ToString(); DC = Brushes.Violet; } MUProgressPerc += .09; MUProgressState = TaskbarItemProgressState.Paused; }
private void ShowFeeds() { try { string url = State.Element("url").Value; int count = State.Element("count") == null ? 3 : int.Parse(State.Element("count").Value); var rss = default(XElement); if (Services.Get <ICache>().Contains(this.Url)) { string cachedXml = Services.Get <ICache>().Get(this.Url) as string; rss = XElement.Parse(cachedXml); } else { rss = XElement.Load(this.Url); Services.Get <ICache>().Add(this.Url, rss.Xml()); } if (null == rss) { Message.Text = "There was a problem loading the feed"; Message.Visible = true; } else { FeedList.DataSource = RssHelper.ConvertXmlToRss(rss, count); FeedList.DataBind(); } } catch { } //Cache[url] = feed; }
async Task asy2FindNewDL(List <Feed> feedsParam = null) { MUProgressPerc += .06; MUProgressState = TaskbarItemProgressState.Normal; var feeds = feedsParam ?? FeedList.Where(r => r.RunTimeNote.StartsWith(__new)).ToList(); //var lst = FeedList.Where(r => r.Name == "CBC Ideas "); //.RunTimeNote.StartsWith(__new)); Max2 = feeds.Sum(r => r.DnLds.Where(d => d.IsStillOnline == true).Count()); try { FC = Brushes.Blue; Appender += $"F2. Checking {feeds.Count}{(feedsParam == null ? " NEW" : " ALL")} feeds for new casts ... "; #if !AwaitNotWorking await Task.Delay(3); foreach (var feed in feeds.ToList()) { try { Debug.WriteLine(feed.Name); var ri = RssHelper.FindNewCasts(feed)?.RssDnldInfos; Debug.WriteLine("~> {0,-32} {1,5} casts found in RSS", feed.Name, ri.Count); await addUPdate_SetIdrFlag(feed, ri); //Val2++; } catch (Exception ex) { ex.Log(); feed.RunTimeNote = ex.Message; FC = Brushes.Violet; } } //WARNING!!! This one does not AWAIT!!! ->lst.ToList().ForEach(async feed => { try { await addUPdate_SetIdrFlag(feed, RssHelper.FindNewCasts(feed).RssDnldInfos); } catch (Exception ex) { ex.Log(); feed.RunTimeNote = ex.Message; FC = Brushes.Violet; } }); Appender += $"done. ({Val2} / {Max2} / {feeds.Sum(r => r.DnLds.Where(d => d.IsStillOnline == true).Count())})"; //saving must be donw only after dnldg finished otherwise there will be omissions from F2Same case: InfoMsg += DbSaveLib.TrySaveReport(_db, "Db-saving new found casts done. \r\n"); //recursive calling itwself: onChgdSelectFeed1(); if (feeds.Count == 1) { reload1(feeds[0]); } else { reloadActiveRecentDnlds(); } FC = Brushes.LightGreen; #else var t = Task.Run(() => FeedList.ToList().ForEach(feed => { try { addUPdate_SetIdrFlag(feed, RssHelper.FindNewCasts(feed).RssDnldInfos); } catch (Exception ex) { ex.Log(); feed.RunTimeNote = ex.Message; FC = Brushes.Violet; } })); await t.ContinueWith(_ => { InfoMsg += DbSaveLib.TrySaveReport(_db, "Db-Saving new casts"); FC = Brushes.LightGreen; }, TaskScheduler.FromCurrentSynchronizationContext()); InfoMsg += "\r\nWaiting ..."; t.Wait(); #endif } catch (Exception ex) { ex.Log(); Appender += "\r\nasy2FindNewDL() failed.\r\n" + ex.ToString(); FC = Brushes.Violet; } MUProgressPerc += .09; MUProgressState = TaskbarItemProgressState.Paused; }
public void ScrapeEventFinder(Feed specificFeed) { FeedList feeds; if (specificFeed == null) { feeds = FeedList.LoadByFeedType("Eventfinder").ToList(); } else { feeds = new FeedList(); feeds.Add(specificFeed); } var runResult = ""; var feedIsActive = true; foreach (var feed in feeds) { try { string username = "******"; string password = "******"; WebClient wc = new WebClient(); wc.Credentials = new NetworkCredential(username, password); string url = "http://api.eventfinder.co.nz/v2/events.json?rows=20"; url += "&fields=event:(id,url,name,description~200,datetime_summary,point,location_summary,address,username,images),images:(image),image:(transforms),transforms:(transform),transform:(url,width)"; //url += "&order=popularity"; //url += "&created_since=" + Fmt.DateISO(DateTime.UtcNow.Date); //url += "&end_date=" + Fmt.DateISO(DateTime.UtcNow.Date.AddDays(14)); //url += "&point=-36.796581,174.777978&radius=100"; url += "&point=" + feed.Latitude + "," + feed.Longitude + "&radius=" + feed.Radius; //url += "&free=1"; var jsonString = wc.DownloadString(url); //Web.WriteLine(jsonString); //string currentUserToken = "52e0eaf6e4b07e1b6390a5dc"; //mikes dynamic json = JsonHelper.Parse(jsonString); foreach (var obj in json.events) { var uniqueStringValue = "eventfinda:" + obj.id; var story = FeedStory.LoadByUniqueString(uniqueStringValue); if (story == null) { string currentUserName = obj.username + " via Eventfinder"; var shortUrl = UrlShortenerController.UrlShortener.Create(obj.url, currentUserName, true); string message = ((String)obj.name).StripTags() + " " + obj.datetime_summary + ". " + ((String)obj.description).StripTags(); message = (message.Length > 130 ? Fmt.TruncHTML(message, 130) + "..." : message) + " #events " + shortUrl; //var imageUrl = node.ElementValue("enclosure"); story = new FeedStory(); story.UniqueString = uniqueStringValue; //story.Title = node.ElementValue("title"); story.ImageUrl = GetImage(obj); story.Message = message; story.OriginalLinkUrl = obj.url; //story.DateAdded = node.ElementValue("pub-date").ConvertToDate(DateTime.Now); story.Status = "new"; story.AuthorName = currentUserName; story.FeedID = feed.FeedID; story.ProfileImageUrl = "https://pbs.twimg.com/profile_images/2461203629/2kvvznykuqzo46kj6kec_normal.jpeg"; story.Latitude = (decimal)obj.point.lat; story.Longitude = (decimal)obj.point.lng; story.Priority = feed.DefaultPriority; story.Save(); story.ApplyFilters(); Web.Write("<p><strong>Added new event as feed story (Feed ID: " + feed.FeedID + ")</strong></p><p>" + message + "</p><hr/>"); } } runResult = "Success"; } catch (Exception ex) { Web.Write("<p><strong style='color:red'>Error! Event Finder Feed ID: " + feed.FeedID + "</strong></p><p>" + ex.Message + "</p><hr/>"); runResult = ex.Message; //SendFeedErrorEmail(feed, ex); //feedIsActive = false; } finally { feed.LastResult = runResult; feed.LastTimeRunning = DateTime.Now; feed.IsActive = feedIsActive; feed.Save(); } } }
public ItemListView(FeedList feeds) { this.feeds = feeds; }
public void ScrapeRss(Feed specificFeed) { FeedList feeds; if (specificFeed == null) { feeds = FeedList.LoadByFeedType("RSS").Where(f => f.IsActive).ToList(); } else { feeds = new FeedList(); feeds.Add(specificFeed); } var runResult = ""; var xmlString = ""; var feedIsActive = true; foreach (var feed in feeds) { try { string url = feed.FeedUrl; xmlString = Http.Get(url); //Web.WriteLine(xmlString); //string profileImageUrl = "https://pbs.twimg.com/profile_images/2461203629/2kvvznykuqzo46kj6kec_normal.jpeg"; //string currentUserToken = "52e0eaf6e4b07e1b6390a5dc"; //mikes var xml = bwbXml.Parse(xmlString); foreach (var node in xml.Descendants("item")) { var uniqueStringValue = "rss:" + Crypto.CreateHash(node.ElementValue("guid") ?? node.ElementValue("link")); var story = FeedStory.LoadByUniqueString(uniqueStringValue); if (story == null) { string link = node.ElementValue("link"); if (String.IsNullOrEmpty(link)) { link = ExtractUrlFromHTML(node.ElementValue("description")); } var shortUrl = ""; if (!String.IsNullOrEmpty(link)) { shortUrl = UrlShortenerController.UrlShortener.Create(link, "RSS Feed", true); } //string message = Fmt.TruncHTML(node.ElementValue("title").StripTags() + ". " + node.ElementValue("description").StripTags(), 130) + " " + shortUrl; string message = node.ElementValue("title").StripTags() + ". " + node.ElementValue("description").StripTags(); message = (message.Length > 130 ? Fmt.TruncHTML(message, 130) + "..." : message) + " " + shortUrl; //var imageUrl = node.ElementValue("enclosure"); story = new FeedStory(); story.UniqueString = uniqueStringValue; story.Title = node.ElementValue("title"); story.Message = message; story.OriginalLinkUrl = node.ElementValue("link"); story.DateAdded = node.ElementValue("pub-date").ConvertToDate(DateTime.Now); story.Status = "new"; story.AuthorName = feed.Author.Name + (feed.Author.Via.IsNotBlank() ? " via " + feed.Author.Via : ""); story.FeedID = feed.FeedID; story.ProfileImageUrl = feed.Author.ProfilePicUrl; story.Priority = feed.DefaultPriority; story.Save(); story.ApplyFilters(); // If it didn't match any filter and it's still null, get from the feed if (story.Latitude == null || story.Longitude == null) { story.Latitude = feed.Latitude; story.Longitude = feed.Longitude; story.Save(); } Web.Write("<p><strong>Added new item as feed story (RSS Feed ID: " + feed.FeedID + ")</strong></p><p>" + message + "</p><hr/>"); } } runResult = "Success"; } catch (Exception ex) { Web.Write("<p><strong style='color:red'>Error! RSS Feed ID: " + feed.FeedID + "</strong></p><p>" + ex.Message + "</p><hr/>"); runResult = ex.Message; //SendFeedErrorEmail(feed, ex); //feedIsActive = false; //SendEMail.SimpleSendHtmlEmail("*****@*****.**", "Herepin Feed error", "RSS Feed ID: " + feed.FeedID + "<br>"+ex.Message+"<br><br>" + xmlString); } finally { feed.LastResult = runResult; feed.LastTimeRunning = DateTime.Now; feed.IsActive = feedIsActive; feed.Save(); } } }
public FeedsCfg() { Feeds = new FeedList(); }
private void ListWallCallback() { if (_wl != null) { return; } _wl = new FeedList(); var web = (HttpWebRequest)WebRequest.Create(string.Format("https://api.vk.com/method/wall.get?owner_id={0}&count=20&access_token={1}", _uid, Client.Instance.Access_token.token)); web.Method = "POST"; web.ContentType = "application/x-www-form-urlencoded"; web.BeginGetResponse(delegate(IAsyncResult e) { var request = (HttpWebRequest)e.AsyncState; var response = (HttpWebResponse)request.EndGetResponse(e); var responseReader = new StreamReader(response.GetResponseStream()); var responseString = responseReader.ReadToEnd(); try { var o = JObject.Parse(responseString); var responseFeeds = (JArray)o["response"]; for (int i = 1; i < responseFeeds.Count; i++) { var text = (string)responseFeeds[i]["text"]; var attachments = responseFeeds[i].SelectToken("attachments", false); if (text.Length > 100) { text = text.Substring(0, 100); } var wallItem = new FeedItem { Date = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(Convert.ToDouble((int)responseFeeds[i]["date"])), Text = text + "...", Uid = (int)responseFeeds[i]["from_id"], PostId = (int)responseFeeds[i]["id"], CntComments = "комментариев: " + (int)responseFeeds[i]["comments"]["count"] }; if ((string)responseFeeds[i]["post_source"]["data"] == "profile_photo") { wallItem.Text = "обновил(а) фотографию на странице"; } else if (attachments != null) { wallItem.Text = wallItem.Text + "\n + " + attachments.Count() + " файл."; } _wl.Add(wallItem); _uidlist.Add((int)responseFeeds[i]["from_id"]); } Dispatcher.BeginInvoke(ListProfileWallCallback); } catch (Exception exception) { Dispatcher.BeginInvoke(() => { MessageBox.Show(exception.Message); if (!progressBar1.IsIndeterminate) return; progressBar1.IsIndeterminate = false; }); } }, web); if (progressBar1.IsIndeterminate == false) { progressBar1.IsIndeterminate = true; } }
public void ScrapeTwitter(Feed specificFeed) { var consumerKey = Util.GetSetting("TwitterOAuthConsumerKey", ""); var consumerSecret = Util.GetSetting("TwitterOAuthConsumerSecret", ""); FeedList feeds; if (specificFeed == null) { feeds = FeedList.LoadByFeedType("Twitter").Where(f => f.IsActive).ToList(); } else { feeds = new FeedList(); feeds.Add(specificFeed); } var twitter = new TwitterAPI(consumerKey, consumerSecret); var runResult = ""; var feedIsActive = true; string jsonString = ""; foreach (var feed in feeds) { try { jsonString = twitter.GetJson(feed.FeedUrl); Web.Write("<br><br><br>" + jsonString); dynamic json = JsonHelper.Parse(jsonString); dynamic tweets; if (jsonString.Trim().StartsWith("[")) { // json format is an array of tweets tweets = json; } else { // json format is an object containing a list of tweets as 'statuses' property tweets = json.statuses; } const string twitterDateTimeFormat = "ddd MMM dd HH:mm:ss zzzz yyyy"; foreach (var tweet in tweets) { var createdAt = DateTime.ParseExact(tweet.created_at, twitterDateTimeFormat, CultureInfo.InvariantCulture); if (createdAt < DateTime.Now.AddDays(-1)) { continue; } var uniqueStringValue = "twitter:" + tweet.id_str; var story = FeedStory.LoadByUniqueString(uniqueStringValue); if (story == null) { story = new FeedStory(); story.UniqueString = uniqueStringValue; story.AuthorName = tweet.user.name + " via Twitter"; story.ProfileImageUrl = tweet.user.profile_image_url; story.ImageUrl = tweet.entities.media != null ? tweet.entities.media[0].media_url : null; story.Message = tweet.text; story.FeedID = feed.FeedID; story.Status = "new"; story.Priority = feed.DefaultPriority; // get location from tweet if supplied in "geo" // note: weirdly it seems that these checks on dynamic objects cannot put in a single if statement together, maybe the short cut logic does not work the same if (tweet.geo != null) { if (tweet.geo.type == "Point") { if (tweet.geo.coordinates != null) { if (tweet.geo.coordinates.Length == 2) { story.Latitude = tweet.geo.coordinates[0]; story.Longitude = tweet.geo.coordinates[1]; } } } } story.Save(); story.ApplyFilters(); // If it didn't match any filter and it's still null, get from the feed if (story.Latitude == null || story.Longitude == null) { story.Latitude = feed.Latitude; story.Longitude = feed.Longitude; story.Save(); } Web.Write("<p><strong>Added new tweet as feed story (Twitter Feed ID: " + feed.FeedID + ")</strong></p><p>" + story.Message + "</p><hr/>"); } } runResult = "Success"; } catch (Exception ex) { Web.Write("<p><strong style='color:red'>Error! Twitter Feed ID: " + feed.FeedID + "</strong></p><p>" + ex.Message + "</p><hr/>"); Web.Write(jsonString); runResult = ex.Message; //SendFeedErrorEmail(feed, ex); //feedIsActive = false; } finally { feed.LastResult = runResult; feed.LastTimeRunning = DateTime.Now; feed.IsActive = feedIsActive; feed.Save(); } } }
private void UpdateUI() { var started = Client.Instance.Active; if (!started) { NavigationService.Navigate(new Uri("/SignInPage.xaml", UriKind.Relative)); } else { ListProfileCallback(); if (_fl == null) { _fl = new FeedList(); ListFeedsCallback(); } ListWallCallback(); } }