mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	Fixed .stock command, closes #356
This commit is contained in:
		@@ -1,5 +1,9 @@
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
using YahooFinanceApi;
 | 
			
		||||
using CsvHelper;
 | 
			
		||||
using CsvHelper.Configuration;
 | 
			
		||||
using Google.Protobuf.WellKnownTypes;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Net.Http.Json;
 | 
			
		||||
using System.Text.Json;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Searches;
 | 
			
		||||
 | 
			
		||||
@@ -17,19 +21,14 @@ public sealed class DefaultStockDataService : IStockDataService, INService
 | 
			
		||||
            if (!query.IsAlphaNumeric())
 | 
			
		||||
                return default;
 | 
			
		||||
 | 
			
		||||
            var symbols = await Yahoo.Symbols(query)
 | 
			
		||||
                                     .Fields(Field.LongName,
 | 
			
		||||
                                         Field.Symbol,
 | 
			
		||||
                                         Field.RegularMarketPrice,
 | 
			
		||||
                                         Field.RegularMarketPreviousClose,
 | 
			
		||||
                                         Field.MarketCap,
 | 
			
		||||
                                         Field.FiftyDayAverageChangePercent,
 | 
			
		||||
                                         Field.TwoHundredDayAverageChangePercent,
 | 
			
		||||
                                         Field.AverageDailyVolume10Day,
 | 
			
		||||
                                         Field.FullExchangeName)
 | 
			
		||||
                                     .QueryAsync();
 | 
			
		||||
            using var http = _httpClientFactory.CreateClient();
 | 
			
		||||
            var data = await http.GetFromJsonAsync<YahooQueryModel>(
 | 
			
		||||
                $"https://query1.finance.yahoo.com/v7/finance/quote?symbols={query}");
 | 
			
		||||
 | 
			
		||||
            var symbol = symbols.Values.FirstOrDefault();
 | 
			
		||||
            if (data is null)
 | 
			
		||||
                return default; 
 | 
			
		||||
            
 | 
			
		||||
            var symbol = data.QuoteResponse.Result.FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
            if (symbol is null)
 | 
			
		||||
                return default;
 | 
			
		||||
@@ -79,11 +78,25 @@ public sealed class DefaultStockDataService : IStockDataService, INService
 | 
			
		||||
                  .ToList();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static CsvConfiguration _csvConfig = new(CultureInfo.InvariantCulture)
 | 
			
		||||
    {
 | 
			
		||||
        PrepareHeaderForMatch = args => args.Header.Humanize(LetterCasing.Title)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    public async Task<IReadOnlyCollection<CandleData>> GetCandleDataAsync(string query)
 | 
			
		||||
    {
 | 
			
		||||
        var candles = await Yahoo.GetHistoricalAsync(query, DateTime.Now.Subtract(30.Days()));
 | 
			
		||||
        using var http = _httpClientFactory.CreateClient();
 | 
			
		||||
        await using var resStream = await http.GetStreamAsync(
 | 
			
		||||
            $"https://query1.finance.yahoo.com/v7/finance/download/{query}"
 | 
			
		||||
            + $"?period1={DateTime.UtcNow.Subtract(30.Days()).ToTimestamp().Seconds}"
 | 
			
		||||
            + $"&period2={DateTime.UtcNow.ToTimestamp().Seconds}"
 | 
			
		||||
            + "&interval=1d");
 | 
			
		||||
 | 
			
		||||
        return candles
 | 
			
		||||
        using var textReader = new StreamReader(resStream);
 | 
			
		||||
        using var csv = new CsvReader(textReader, _csvConfig);
 | 
			
		||||
        var records = csv.GetRecords<YahooFinanceCandleData>().ToArray();
 | 
			
		||||
 | 
			
		||||
        return records
 | 
			
		||||
            .Map(static x => new CandleData(x.Open, x.Close, x.High, x.Low, x.Volume));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,42 @@
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Searches;
 | 
			
		||||
 | 
			
		||||
public class QuoteResponse
 | 
			
		||||
{
 | 
			
		||||
    public class ResultModel
 | 
			
		||||
    {
 | 
			
		||||
        [JsonPropertyName("longName")]
 | 
			
		||||
        public string LongName { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("regularMarketPrice")]
 | 
			
		||||
        public double RegularMarketPrice { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("regularMarketPreviousClose")]
 | 
			
		||||
        public double RegularMarketPreviousClose { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("fullExchangeName")]
 | 
			
		||||
        public string FullExchangeName { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("averageDailyVolume10Day")]
 | 
			
		||||
        public int AverageDailyVolume10Day { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("fiftyDayAverageChangePercent")]
 | 
			
		||||
        public double FiftyDayAverageChangePercent { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("twoHundredDayAverageChangePercent")]
 | 
			
		||||
        public double TwoHundredDayAverageChangePercent { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("marketCap")]
 | 
			
		||||
        public long MarketCap { get; set; }
 | 
			
		||||
 | 
			
		||||
        [JsonPropertyName("symbol")]
 | 
			
		||||
        public string Symbol { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    [JsonPropertyName("result")]
 | 
			
		||||
    public List<ResultModel> Result { get; set; }
 | 
			
		||||
 | 
			
		||||
    [JsonPropertyName("error")]
 | 
			
		||||
    public object Error { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
namespace NadekoBot.Modules.Searches;
 | 
			
		||||
 | 
			
		||||
public class YahooFinanceCandleData
 | 
			
		||||
{
 | 
			
		||||
    public DateTime Date { get; set; }
 | 
			
		||||
    public decimal Open { get; set; }
 | 
			
		||||
    public decimal High { get; set; }
 | 
			
		||||
    public decimal Low { get; set; }
 | 
			
		||||
    public decimal Close { get; set; }
 | 
			
		||||
    public decimal AdjClose { get; set; }
 | 
			
		||||
    public long Volume { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Searches;
 | 
			
		||||
 | 
			
		||||
public class YahooQueryModel
 | 
			
		||||
{
 | 
			
		||||
    [JsonPropertyName("quoteResponse")]
 | 
			
		||||
    public QuoteResponse QuoteResponse { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -26,6 +26,7 @@
 | 
			
		||||
        <PackageReference Include="AWSSDK.S3" Version="3.7.8.4" />
 | 
			
		||||
        <PackageReference Include="CodeHollow.FeedReader" Version="1.2.4" />
 | 
			
		||||
        <PackageReference Include="CommandLineParser" Version="2.8.0" />
 | 
			
		||||
        <PackageReference Include="CsvHelper" Version="27.2.1" />
 | 
			
		||||
        <PackageReference Include="Discord.Net" Version="3.5.0" />
 | 
			
		||||
        <PackageReference Include="CoreCLR-NCalc" Version="2.2.92" />
 | 
			
		||||
        <PackageReference Include="Google.Apis.Urlshortener.v1" Version="1.41.1.138" />
 | 
			
		||||
@@ -81,7 +82,6 @@
 | 
			
		||||
<!--        <PackageReference Include="System.Runtime.Experimental" Version="6.0.2" />-->
 | 
			
		||||
        
 | 
			
		||||
        <!-- Used by .crypto command -->
 | 
			
		||||
        <PackageReference Include="YahooFinanceApi" Version="2.1.2" />
 | 
			
		||||
        
 | 
			
		||||
        <!-- Used by stream notifications -->
 | 
			
		||||
        <PackageReference Include="TwitchLib.Api" Version="3.4.1" />
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ namespace NadekoBot.Services;
 | 
			
		||||
 | 
			
		||||
public sealed class StatsService : IStatsService, IReadyExecutor, INService
 | 
			
		||||
{
 | 
			
		||||
    public const string BOT_VERSION = "4.1.4";
 | 
			
		||||
    public const string BOT_VERSION = "4.1.5";
 | 
			
		||||
 | 
			
		||||
    public string Author
 | 
			
		||||
        => "Kwoth#2452";
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user