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;
            }
        }
Exemple #3
0
 public News(News news)
 {
     ChannelId = news.ChannelId;
     Time = news.Time;
     Title = news.Title;
     Body = news.Body;
 }
Exemple #4
0
 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);
     }
 }
Exemple #8
0
        /// <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;
            }
        }
Exemple #9
0
 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();
     }
 }