From d86b5b2b6c7983b4ec08d56be323cbaa1dab32c6 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Fri, 5 Apr 2024 03:07:40 +0000 Subject: [PATCH] Fixed .stock --- .../Modules/Searches/Crypto/CryptoCommands.cs | 6 +- .../Crypto/DefaultStockDataService.cs | 83 +++++++++++++------ .../Searches/Crypto/_Common/StockData.cs | 2 +- 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs b/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs index 241a2172a..68ecf0868 100644 --- a/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs +++ b/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs @@ -85,11 +85,11 @@ public partial class Searches .WithUrl($"https://www.tradingview.com/chart/?symbol={stock.Symbol}") .WithTitle(stock.Name) .AddField(GetText(strs.price), $"{sign} **{price}**", true) - .AddField(GetText(strs.market_cap), stock.MarketCap.ToString("C0", localCulture), true) + .AddField(GetText(strs.market_cap), stock.MarketCap, true) .AddField(GetText(strs.volume_24h), stock.DailyVolume.ToString("C0", localCulture), true) .AddField("Change", $"{change} ({changePercent})", true) - .AddField("Change 50d", $"{sign50}{change50}", true) - .AddField("Change 200d", $"{sign200}{change200}", true) + // .AddField("Change 50d", $"{sign50}{change50}", true) + // .AddField("Change 200d", $"{sign200}{change200}", true) .WithFooter(stock.Exchange); var message = await ctx.Channel.EmbedAsync(eb); diff --git a/src/NadekoBot/Modules/Searches/Crypto/DefaultStockDataService.cs b/src/NadekoBot/Modules/Searches/Crypto/DefaultStockDataService.cs index 1203550ab..f66c197ed 100644 --- a/src/NadekoBot/Modules/Searches/Crypto/DefaultStockDataService.cs +++ b/src/NadekoBot/Modules/Searches/Crypto/DefaultStockDataService.cs @@ -1,5 +1,8 @@ -using CsvHelper; +using AngleSharp; +using AngleSharp.Html.Dom; +using CsvHelper; using CsvHelper.Configuration; +using CsvHelper.Configuration.Attributes; using Google.Protobuf.WellKnownTypes; using System.Globalization; using System.Net.Http.Json; @@ -23,33 +26,61 @@ public sealed class DefaultStockDataService : IStockDataService, INService return default; using var http = _httpClientFactory.CreateClient(); - var data = await http.GetFromJsonAsync( - $"https://query1.finance.yahoo.com/v7/finance/quote?symbols={query}"); - if (data is null) - return default; - - var symbol = data.QuoteResponse.Result.FirstOrDefault(); - if (symbol is null) - return default; + + var quoteHtmlPage = $"https://finance.yahoo.com/quote/{query.ToUpperInvariant()}"; + + var config = Configuration.Default.WithDefaultLoader(); + using var document = await BrowsingContext.New(config).OpenAsync(quoteHtmlPage); + var divElem = + document.QuerySelector( + "#quote-header-info > div:nth-child(2) > div > div > h1"); + var tickerName = (divElem)?.TextContent; + + var marketcap = document + .QuerySelectorAll("table") + .Skip(1) + .First() + .QuerySelector("tbody > tr > td:nth-child(2)") + ?.TextContent; + + + var volume = document.QuerySelector("td[data-test='AVERAGE_VOLUME_3MONTH-value']") + ?.TextContent; + var close= document.QuerySelector("td[data-test='PREV_CLOSE-value']") + ?.TextContent ?? "0"; + + var price = document + .QuerySelector("#quote-header-info") + ?.QuerySelector("fin-streamer[data-field='regularMarketPrice']") + ?.TextContent ?? close; + + // var data = await http.GetFromJsonAsync( + // $"https://query1.finance.yahoo.com/v7/finance/quote?symbols={query}"); + // + // if (data is null) + // return default; + + // var symbol = data.QuoteResponse.Result.FirstOrDefault(); + + // if (symbol is null) + // return default; + return new() { - Name = symbol.LongName, - Symbol = symbol.Symbol, - Price = symbol.RegularMarketPrice, - Close = symbol.RegularMarketPreviousClose, - MarketCap = symbol.MarketCap, - Change50d = symbol.FiftyDayAverageChangePercent, - Change200d = symbol.TwoHundredDayAverageChangePercent, - DailyVolume = symbol.AverageDailyVolume10Day, - Exchange = symbol.FullExchangeName + Name = tickerName, + Symbol = query, + Price = double.Parse(price, NumberStyles.Any, CultureInfo.InvariantCulture), + Close = double.Parse(close, NumberStyles.Any, CultureInfo.InvariantCulture), + MarketCap = marketcap, + DailyVolume = (long)double.Parse(volume ?? "0", NumberStyles.Any, CultureInfo.InvariantCulture), }; } - catch (Exception) + catch (Exception ex) { - // Log.Warning(ex, "Error getting stock data: {ErrorMessage}", ex.Message); + Log.Warning(ex, "Error getting stock data: {ErrorMessage}", ex.ToString()); return default; } } @@ -60,9 +91,9 @@ public sealed class DefaultStockDataService : IStockDataService, INService throw new ArgumentNullException(nameof(query)); query = Uri.EscapeDataString(query); - + using var http = _httpClientFactory.CreateClient(); - + var res = await http.GetStringAsync( "https://finance.yahoo.com/_finance_doubledown/api/resource/searchassist" + $";searchTerm={query}" @@ -72,11 +103,11 @@ public sealed class DefaultStockDataService : IStockDataService, INService if (data is null or { Items: null }) return Array.Empty(); - + return data.Items - .Where(x => x.Type == "S") - .Select(x => new SymbolData(x.Symbol, x.Name)) - .ToList(); + .Where(x => x.Type == "S") + .Select(x => new SymbolData(x.Symbol, x.Name)) + .ToList(); } private static CsvConfiguration _csvConfig = new(CultureInfo.InvariantCulture) diff --git a/src/NadekoBot/Modules/Searches/Crypto/_Common/StockData.cs b/src/NadekoBot/Modules/Searches/Crypto/_Common/StockData.cs index e18525b21..d0c191b1d 100644 --- a/src/NadekoBot/Modules/Searches/Crypto/_Common/StockData.cs +++ b/src/NadekoBot/Modules/Searches/Crypto/_Common/StockData.cs @@ -6,7 +6,7 @@ public class StockData public string Name { get; set; } public string Symbol { get; set; } public double Price { get; set; } - public long MarketCap { get; set; } + public string MarketCap { get; set; } public double Close { get; set; } public double Change50d { get; set; } public double Change200d { get; set; }