public override void GetNews() { if (tickers.Count == 0) return; var newsBody = new StringBuilder(string.Format("[#fmt]#&newstype=yahoo_index#&" + "publishdate={0:dd.MM.yyyy HH:mm:ss}", DateTime.Now)); int countRead = 0; foreach (var ticker in tickers) { // запросить страницу var tickValue = ticker.ParseHttpResponce(QueryPage(QueryBase, ticker.NameYahoo)); if (!tickValue.HasValue) continue; countRead++; newsBody.AppendFormat("#&{0}={1}", ticker.TickerName, tickValue.ToStringUniform()); } if (countRead == 0) { loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Error, LogMsgNoData, 1000 * 60 * 10, "Нет данных"); return; } // отправить новостишку на сервер var news = new News(channelId, DateTime.Now, newsTitle, newsBody.ToString()); PutNewsOnServer(new [] {news}); loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Info, LogMsgReadOk, 1000 * 60 * 10, "Yahoo: данные успешно прочитаны"); }
protected bool PutNewsOnServer(News[] news) { try { NewsProxy.PutNews(news); return true; } catch (System.ServiceModel.CommunicationException) { // попробовать обновить соединение try { newsProxy = new NewsReceiverProxy("INewsReceiverBinding"); NewsProxy.PutNews(news); return true; } catch (Exception ex) { loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Error, LogMsgErrorPutNews, 1000 * 60, "Ошибка доставки новости провайдеру: {0}", ex); return false; } } catch (Exception ex) { loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Error, LogMsgErrorPutNews, 1000 * 60, "Ошибка доставки новости провайдеру: {0}", ex); return false; } }
public News(News news) { ChannelId = news.ChannelId; Time = news.Time; Title = news.Title; Body = news.Body; }
public bool AddNews(News[] news) { if (news.Length == 0) return false; try { lockNews.AcquireWriterLock(LockTimeout); } catch (ApplicationException) { return false; } try { foreach (var ns in news) { if (!dicNews.ContainsKey(ns.ChannelId)) { var lst = new List<News> {ns}; dicNews.Add(ns.ChannelId, lst); } else dicNews[ns.ChannelId].Add(ns); } } finally { lockNews.ReleaseWriterLock(); } return true; }
public void TestMerge() { // перечитать NewsLocalStorage.ReInstantiate(); var allNews = MakeSomeNews(); // добавить свежака var chan1news = allNews[1]; var midNews = chan1news[chan1news.Count/2]; var insertedNews = new News(1, midNews.Time, "Middle news", "Empty body"); // эта будет перезатерта chan1news.Insert(chan1news.Count/2, insertedNews); chan1news.Insert(chan1news.Count / 2, new News(insertedNews) { Time = insertedNews.Time.AddSeconds(16) }); chan1news.Add(new News(1, DateTime.Now.AddMinutes(-10), "Latest news", "Empty body")); chan1news.Add(new News(1, DateTime.Now.AddMinutes(-8), "Latest news - 2", "Empty body")); NewsLocalStorage.Instance.UpdateNews(chan1news); // проверить адекватность var updatedChan1news = NewsLocalStorage.Instance.GetNews(1); Assert.AreEqual(chan1news.Count - 1, updatedChan1news.Count, "rewritten news: count is ok"); var midNewsNew = updatedChan1news.FirstOrDefault(n => n.Title == "Middle news"); Assert.IsNotNull(midNewsNew, "rewritten news is not null"); }
public static void StoreNews(StreamWriter sw, News[] news) { if (news.Length == 0) return; foreach (var ns in news) { sw.Write(ns.ToString()); sw.Write(MessagesSeparator[0]); } }
public static void StoreNews(string fileName, News[] news) { using (var sw = new StreamWriter(fileName, false, Encoding.UTF8)) { StoreNews(sw, news); } }
/// <summary> /// формат строки: N:ChannelId;Time;Title;[Body] /// </summary> public static News Parse(String str) { if (string.IsNullOrEmpty(str)) return null; if (!str.StartsWith(NewsPrefix)) return null; str = str.Substring(NewsPrefix.Length); if (string.IsNullOrEmpty(str)) return null; var nsParts = str.Split(new[] { PartSeparator }, StringSplitOptions.None); if (nsParts.Length < 3 || nsParts.Length > 4) return null; try { var news = new News { ChannelId = nsParts[0].ToInt(), Time = nsParts[1].ToDateTimeUniform(), Title = nsParts[2].Replace(PartSeparatorPlaceHolder, PartSeparator) }; if (nsParts.Length > 3) news.Body = nsParts[3].Replace(PartSeparatorPlaceHolder, PartSeparator); return news; } catch (Exception ex) { Logger.Error("News.Parse: неправильный формат данных", ex); return null; } }
public bool GetLastNews(out News news) { news = null; try { lockNews.AcquireReaderLock(LockTimeout); } catch (ApplicationException) { return false; } try { foreach (var lst in dicNews.Values) { foreach (var ns in lst) { if (news == null) { news = ns; continue; } if (ns.Time > news.Time) news = ns; } } return true; } finally { lockNews.ReleaseReaderLock(); } }