mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	Fixed .stock
This commit is contained in:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<YahooQueryModel>(
 | 
			
		||||
                $"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<YahooQueryModel>(
 | 
			
		||||
            //     $"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<SymbolData>();
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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; }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user