mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-10 09:18:27 -04:00
Fixed .stock command, closes #356
This commit is contained in:
@@ -5,6 +5,8 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog.
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
## [4.1.5] - 11.05.2022
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- `.clubdesc <msg>` will now have a nicer response
|
- `.clubdesc <msg>` will now have a nicer response
|
||||||
@@ -12,7 +14,8 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog.
|
|||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- `.give` DM will once again show an amount
|
- `.give` DM will once again show an amount
|
||||||
- Fixed an issue with filters not working and with custom reactions no longer being able to override commands.
|
- Fixed an issue with filters not working and with custom reactions no longer being able to override commands.
|
||||||
|
- Fixed `.stock` command
|
||||||
|
|
||||||
## [4.1.4] - 06-05-2022
|
## [4.1.4] - 06-05-2022
|
||||||
|
|
||||||
|
@@ -1,5 +1,9 @@
|
|||||||
using System.Text.Json;
|
using CsvHelper;
|
||||||
using YahooFinanceApi;
|
using CsvHelper.Configuration;
|
||||||
|
using Google.Protobuf.WellKnownTypes;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Net.Http.Json;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Searches;
|
namespace NadekoBot.Modules.Searches;
|
||||||
|
|
||||||
@@ -17,19 +21,14 @@ public sealed class DefaultStockDataService : IStockDataService, INService
|
|||||||
if (!query.IsAlphaNumeric())
|
if (!query.IsAlphaNumeric())
|
||||||
return default;
|
return default;
|
||||||
|
|
||||||
var symbols = await Yahoo.Symbols(query)
|
using var http = _httpClientFactory.CreateClient();
|
||||||
.Fields(Field.LongName,
|
var data = await http.GetFromJsonAsync<YahooQueryModel>(
|
||||||
Field.Symbol,
|
$"https://query1.finance.yahoo.com/v7/finance/quote?symbols={query}");
|
||||||
Field.RegularMarketPrice,
|
|
||||||
Field.RegularMarketPreviousClose,
|
|
||||||
Field.MarketCap,
|
|
||||||
Field.FiftyDayAverageChangePercent,
|
|
||||||
Field.TwoHundredDayAverageChangePercent,
|
|
||||||
Field.AverageDailyVolume10Day,
|
|
||||||
Field.FullExchangeName)
|
|
||||||
.QueryAsync();
|
|
||||||
|
|
||||||
var symbol = symbols.Values.FirstOrDefault();
|
if (data is null)
|
||||||
|
return default;
|
||||||
|
|
||||||
|
var symbol = data.QuoteResponse.Result.FirstOrDefault();
|
||||||
|
|
||||||
if (symbol is null)
|
if (symbol is null)
|
||||||
return default;
|
return default;
|
||||||
@@ -79,11 +78,25 @@ public sealed class DefaultStockDataService : IStockDataService, INService
|
|||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static CsvConfiguration _csvConfig = new(CultureInfo.InvariantCulture)
|
||||||
|
{
|
||||||
|
PrepareHeaderForMatch = args => args.Header.Humanize(LetterCasing.Title)
|
||||||
|
};
|
||||||
|
|
||||||
public async Task<IReadOnlyCollection<CandleData>> GetCandleDataAsync(string query)
|
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));
|
.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="AWSSDK.S3" Version="3.7.8.4" />
|
||||||
<PackageReference Include="CodeHollow.FeedReader" Version="1.2.4" />
|
<PackageReference Include="CodeHollow.FeedReader" Version="1.2.4" />
|
||||||
<PackageReference Include="CommandLineParser" Version="2.8.0" />
|
<PackageReference Include="CommandLineParser" Version="2.8.0" />
|
||||||
|
<PackageReference Include="CsvHelper" Version="27.2.1" />
|
||||||
<PackageReference Include="Discord.Net" Version="3.5.0" />
|
<PackageReference Include="Discord.Net" Version="3.5.0" />
|
||||||
<PackageReference Include="CoreCLR-NCalc" Version="2.2.92" />
|
<PackageReference Include="CoreCLR-NCalc" Version="2.2.92" />
|
||||||
<PackageReference Include="Google.Apis.Urlshortener.v1" Version="1.41.1.138" />
|
<PackageReference Include="Google.Apis.Urlshortener.v1" Version="1.41.1.138" />
|
||||||
@@ -81,7 +82,6 @@
|
|||||||
<!-- <PackageReference Include="System.Runtime.Experimental" Version="6.0.2" />-->
|
<!-- <PackageReference Include="System.Runtime.Experimental" Version="6.0.2" />-->
|
||||||
|
|
||||||
<!-- Used by .crypto command -->
|
<!-- Used by .crypto command -->
|
||||||
<PackageReference Include="YahooFinanceApi" Version="2.1.2" />
|
|
||||||
|
|
||||||
<!-- Used by stream notifications -->
|
<!-- Used by stream notifications -->
|
||||||
<PackageReference Include="TwitchLib.Api" Version="3.4.1" />
|
<PackageReference Include="TwitchLib.Api" Version="3.4.1" />
|
||||||
|
@@ -7,7 +7,7 @@ namespace NadekoBot.Services;
|
|||||||
|
|
||||||
public sealed class StatsService : IStatsService, IReadyExecutor, INService
|
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
|
public string Author
|
||||||
=> "Kwoth#2452";
|
=> "Kwoth#2452";
|
||||||
|
Reference in New Issue
Block a user