public async Task StockNews(string symbol) { StockNews[] news = await Service.GetNewsAsync(symbol.ParseStockTicker()).ConfigureAwait(false); if (news == null) { await Context.Channel.SendErrorAsync("Unknown Symbol").ConfigureAwait(false); return; } await Context.SendPaginatedMessageAsync(0, p => { StockNews article = news[p]; EmbedBuilder embed = new EmbedBuilder().WithDynamicColor(Context) .WithTitle(article.Headline) .WithAuthor(article.Source, url: article.Url) .WithDescription($"{article.Summary}\nSource: [{article.Source}]({article.Url})".TrimTo(2048)) .WithImageUrl(article.Image) .WithFooter($"{article.DateTime.ToEasternStandardTime():yyyy/MM/dd h:mm tt} EST"); if (article.HasPayWall) { embed.WithDescription("NOTE: article has paywall\n\n" + article.Summary); } return(embed); }, news.Length, 1, false).ConfigureAwait(false);
public void InsertStockNewsTest() { var stockNewsData = GetStockNewsList(); var stockNewsSet = new Mock <DbSet <StockNews> >().SetupData(stockNewsData); var context = new Mock <Context>(); context.Setup(ctx => ctx.Set <StockNews>()).Returns(stockNewsSet.Object); var unitOfWork = new UnitOfWork(context.Object); var stockNews = new StockNews() { ReferencedStocks = new List <Stock>(), PublicationDate = DateTimeOffset.Now, Title = "News8", Content = "This is the news number 8", IsDeleted = false, }; unitOfWork.StockNewsRepository.Insert(stockNews); var result = unitOfWork.StockNewsRepository.GetAll(); Assert.Equal(stockNews, unitOfWork.StockNewsRepository.GetById(stockNews.Id)); }
public void RegisterStockNewsReturnsCreatedAtRouteTest() { var mockStockNewsLogic = new Mock <IStockNewsLogic>(); mockStockNewsLogic.Setup(x => x.RegisterStockNews(It.IsAny <StockNews>())) .Returns(true); var controller = new StockNewsController(mockStockNewsLogic.Object); var stockNews = new StockNews() { ReferencedStocks = new List <Stock>(), PublicationDate = DateTimeOffset.Now, Title = "News5", Content = "This is the news number 5", IsDeleted = false, Id = 1 }; IHttpActionResult actionResult = controller.PostStockNews(stockNews); var contentResult = Assert.IsType <CreatedAtRouteNegotiatedContentResult <StockNews> >(actionResult); Assert.NotNull(contentResult); Assert.Equal(contentResult.Content, stockNews); }
public IHttpActionResult DeleteStockNews(StockNews stockNews) { if (stockNewsLogic.DeleteStockNews(stockNews)) { return(StatusCode(HttpStatusCode.NoContent)); } return(NotFound()); }
public bool RegisterStockNews(StockNews news) { UnitOfWork.StockNewsRepository.Insert(news); foreach (var stock in news.ReferencedStocks) { var dbStock = UnitOfWork.StockRepository.Get(x => x.Id == stock.Id, null, "StockNews").SingleOrDefault(); dbStock.StockNews.Add(news); UnitOfWork.StockRepository.Update(dbStock); } UnitOfWork.Save(); return(true); }
public IHttpActionResult Get(long stockId) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } StockNews stockNews = stockNewsLogic.GetStockNews(stockId); if (stockNews == null) { return(NotFound()); } return(Ok(stockNews)); }
public void DeleteStockNewsReturnsNoContentTest() { var mockStockNewsLogic = new Mock <IStockNewsLogic>(); mockStockNewsLogic.Setup(x => x.DeleteStockNews(It.IsAny <StockNews>())).Returns(true); var controller = new StockNewsController(mockStockNewsLogic.Object); var stockNews = new StockNews(); IHttpActionResult actionResult = controller.DeleteStockNews(stockNews); StatusCodeResult contentResult = Assert.IsType <StatusCodeResult>(actionResult); Assert.NotNull(contentResult); Assert.Equal(contentResult.StatusCode, HttpStatusCode.NoContent); }
public IHttpActionResult PostStockNews(StockNews stockNews) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } try { if (stockNewsLogic.RegisterStockNews(stockNews)) { return(Ok(stockNews)); } return(BadRequest()); } catch (UserException ue) { return(BadRequest(ue.Message)); } }
public static void refreshStockNews() { foreach (InfoType it in Enum.GetValues(typeof(InfoType))) { List <EastMoneyModel> news = EastMoney.GetInfo(it); for (int i = 0; i < news.Count(); i++) { StockNews stockNews = new StockNews(); stockNews.code = news[i].code; stockNews.stockname = news[i].stockName; stockNews.title = news[i].title; stockNews.sort = 1; stockNews.Date = news[i].Date; stockNews.url = news[i].url; if (news[i].type == InfoType.finace.ToString()) { stockNews.type = "融资公告"; } else if (news[i].type == InfoType.danger.ToString()) { stockNews.type = "风险提示"; } else if (news[i].type == InfoType.infochange.ToString()) { stockNews.type = "信息变更"; } else if (news[i].type == InfoType.havestockchange.ToString()) { stockNews.type = "持股变动"; } else if (news[i].type == InfoType.recombo.ToString()) { stockNews.type = "资产重组"; } UpodateOrderByKey(ref stockNews); db.StockNews.Add(stockNews); } Thread.Sleep(100); } db.SaveChanges(); }
public static void UpodateOrderByKey(ref StockNews stockNews) { if (stockNews.type == "持股变动") { if (!stockNews.title.Contains("增持") && !stockNews.title.Contains("减持") && !stockNews.title.Contains("进展") && !stockNews.title.Contains("完毕") && !stockNews.title.Contains("结果") && !stockNews.title.Contains("完成") && !stockNews.title.Contains("终止")) { stockNews.sort = 3; } if (stockNews.title.Contains("增持") || stockNews.title.Contains("减持")) { var result = ""; try { result = httpRequestHelper.GetHtml(stockNews.url); } catch (Exception) { UpodateOrderByKey(ref stockNews); return; } string pattern = @"证券代码[\s|\S]+特此公告"; var content = ""; foreach (Match match in Regex.Matches(result, pattern)) { content = match.Value; } stockNews.sort = 100; string[] patterns = new string[] { @"减持不超过[\n|\d|\s|,]+股", @"减持公司股份不超过[\n|\d|\s|,]+股", @"减持股份[\n|\d|\s|,]+股", @"减持公司股票数量不超过[\n|\d|\s|,]+股", @"减持股份不超过[\n|\d|\s|,]+股", @"减持本公司股份不超过[\n|\d|\s|,]+股", @"减持股份数量不超过[\n|\d|\s|,]+股", @"减持本公司股份[\n|\d|\s|,]+股", @"增持[\n|\d|\s|,]+股", @"增持公司股份[\n|\d|\s|,]+股", @"增持股份[\n|\d|\s|,]+股", @"增持公司股票数量[\n|\d|\s|,]+股", @"增持股份[\n|\d|\s|,]+股", @"增持本公司股份[\n|\d|\s|,]+股", @"增持股份数量[\n|\d|\s|,]+股" }; string[] patterns2 = new string[] { "减持不超过", "减持公司股份不超过", "减持股份", "减持公司股票数量不超过", "减持股份不超过", "减持本公司股份不超过", "减持股份数量不超过", "减持本公司股份", "增持", "增持公司股份", "增持股份", "增持公司股票数量", "增持股份", "增持本公司股份", "增持股份数量" }; int cnd = 0; foreach (string pattern2 in patterns) { string content2 = ""; foreach (Match match in Regex.Matches(content, pattern2)) { content2 = match.Value; } content2 = content2.Replace(patterns2[cnd++], "").Replace("股", "").Replace("\n", "").Replace(" ", "").Replace(",", ""); int int_content = 100; try { int_content = int.Parse(content2); } catch (Exception) { } stockNews.sort = int_content > stockNews.sort ? int_content : stockNews.sort; } } if (stockNews.title.Contains("进展")) { stockNews.sort = 2; } if (stockNews.title.Contains("完毕") || stockNews.title.Contains("结果") || stockNews.title.Contains("完成") || stockNews.title.Contains("终止")) { stockNews.sort = 1; } } else if (stockNews.type == "资产重组") { if (stockNews.title.Contains("进展") || stockNews.title.Contains("结果") || stockNews.title.Contains("完成") || stockNews.title.Contains("完毕") || stockNews.title.Contains("延长")) { stockNews.sort = 1; } else if (stockNews.title.Contains("转让") || stockNews.title.Contains("出售") || stockNews.title.Contains("回购") || stockNews.title.Contains("收购") || stockNews.title.Contains("购买")) { stockNews.sort = 3; } else { stockNews.sort = 2; } } else if (stockNews.type == "风险提示") { if (stockNews.title.Contains("进展") || stockNews.title.Contains("终止") || stockNews.title.Contains("完成") || stockNews.title.Contains("歉")) { stockNews.sort = 1; } else if (stockNews.title.Contains("交易异常波动")) { var result = ""; try { result = httpRequestHelper.GetHtml(stockNews.url); } catch (Exception) { UpodateOrderByKey(ref stockNews); return; } string pattern = @"证券代码[\s|\S]+特此公告"; var content = ""; foreach (Match match in Regex.Matches(result, pattern)) { content = match.Value; } stockNews.sort = 100; if (content.Contains("涨幅")) { stockNews.sort = 101; } else if (content.Contains("跌幅")) { stockNews.sort = 102; } } else { stockNews.sort = 2; } } }
public bool DeleteStockNews(StockNews news) { UnitOfWork.StockNewsRepository.Delete(news); UnitOfWork.Save(); return(true); }