Skip to content

Commit

Permalink
added more data to price command
Browse files Browse the repository at this point in the history
added market cap
added total supply
added bnb price
added lp holdings
  • Loading branch information
Natured authored and Natured committed Nov 24, 2021
1 parent 8304e32 commit e1da7c7
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 13 deletions.
8 changes: 8 additions & 0 deletions src/Entities/TickerPrice.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace StonkBot.Entities
{
public class TickerPrice
{
public string Symbol { get; set; }
public decimal Price { get; set; }
}
}
9 changes: 9 additions & 0 deletions src/Entities/TokenData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace StonkBot.Entities
{
public class TokenData
{
public string TotalSupply { get; set; }
public string MarketCap { get; set; }
public string LpHoldings { get; set; }
}
}
2 changes: 1 addition & 1 deletion src/Entities/TokenFinance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ public class TokenFinance
public string Address { get; set; }

[JsonProperty("price_usd")]
public string Price { get; set; }
public decimal Price { get; set; }
}
}
15 changes: 12 additions & 3 deletions src/Modules/TokenModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,30 @@ public async Task GetPriceAsync()

var graphFileName = "";
var dexGuruRestApi = new DexGuruRestApi(_logService, dexGuruApiKey);
var binanceRestApi = new BinanceRestApi(_logService);
var poocoinWebDriver = new PoocoinWebDriver(browserEngineType);

try
{
var graphFileNameTask = poocoinWebDriver.GetGraphFileName(tokenAddress, TimeSpan.FromSeconds(pageDelay));
var getTokenTask = dexGuruRestApi.GetTokenAsync(tokenChain, tokenAddress);
var getTickerPriceTask = binanceRestApi.GetTickerPriceAsync("BNBBUSD");
var loadTask = poocoinWebDriver.LoadAsync(tokenAddress, TimeSpan.FromSeconds(pageDelay));

await Task.WhenAll(graphFileNameTask, getTokenTask).ConfigureAwait(false);
await Task.WhenAll(getTokenTask, getTickerPriceTask, loadTask).ConfigureAwait(false);

graphFileName = graphFileNameTask.Result;
var token = getTokenTask.Result;
var tickerPrice = getTickerPriceTask.Result;

graphFileName = poocoinWebDriver.GetGraphFileName();
var tokenData = poocoinWebDriver.GetTokenData();

var stringBuilder = new StringBuilder();
stringBuilder.AppendLine($"Token: {token.Inventory.Name} ({token.Inventory.Symbol})");
stringBuilder.AppendLine($"Price: ${token.Finance.Price}");
stringBuilder.AppendLine($"Total Supply: {tokenData.TotalSupply}");
stringBuilder.AppendLine($"Market Cap: {tokenData.MarketCap}");
stringBuilder.AppendLine($"BNB Price: ${tickerPrice.Price:0.00}");
stringBuilder.AppendLine($"LP Holdings: {tokenData.LpHoldings}");

await Context.Channel.DeleteMessageAsync(loadingMessage).ConfigureAwait(false);
await Context.Channel.SendFileAsync(graphFileName, stringBuilder.ToString()).ConfigureAwait(false);
Expand Down
44 changes: 44 additions & 0 deletions src/Services/BinanceRestApi.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using Discord;
using Newtonsoft.Json;
using RestSharp;
using StonkBot.Entities;
using System.Net;
using System.Threading.Tasks;

namespace StonkBot.Services
{
internal class BinanceRestApi
{
private RestClient _restClient;

private const string BaseUrl = "https://api.binance.com/api/v3";
private readonly ILogService _logService;

public BinanceRestApi(ILogService logService)
{
_restClient = new RestClient();
_logService = logService;
}

public async Task<TickerPrice> GetTickerPriceAsync(string tickerSymbol)
{
var url = $"{BaseUrl}/ticker/price?symbol={tickerSymbol.ToUpper()}";
var request = new RestRequest(url, Method.GET, DataFormat.Json);

var response = await _restClient.ExecuteAsync(request).ConfigureAwait(false);
CheckResponse(response);
var tickerPrice = JsonConvert.DeserializeObject<TickerPrice>(response.Content);

return tickerPrice;
}

private void CheckResponse(IRestResponse restResponse)
{
if (restResponse.StatusCode != HttpStatusCode.OK)
{
_logService.Log(LogSeverity.Debug, $"Code: {restResponse.StatusCode}");
_logService.Log(LogSeverity.Debug, $"Code: {restResponse.Content}");
}
}
}
}
1 change: 0 additions & 1 deletion src/Services/DexGuruRestApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using Newtonsoft.Json;
using RestSharp;
using StonkBot.Entities;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
Expand Down
74 changes: 66 additions & 8 deletions src/Services/PoocoinWebDriver.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using StonkBot.Entities;
using System;
using System.IO;
using System.Threading.Tasks;
Expand Down Expand Up @@ -27,20 +28,77 @@ public PoocoinWebDriver(BrowserEngineType type)
}
}

public async Task<string> GetGraphFileName(string coinAddress, TimeSpan timeout)
public async Task LoadAsync(string tokenAddress, TimeSpan timeout)
{
_webDriver.Url = $"{BaseUrl}{tokenAddress}";
await Task.Delay(timeout).ConfigureAwait(false);
}

public string GetGraphFileName()
{
var element = (WebElement)_webDriver.FindElement(By.XPath("//*[starts-with(@id, 'tradingview_')]"));
var screenshot = element.GetScreenshot();

Directory.CreateDirectory(ImagePath);
var filePath = Path.Combine(ImagePath, $"{Guid.NewGuid():N}.png");
screenshot.SaveAsFile(filePath);

var filePath = Path.Combine(ImagePath, $"{coinAddress}_{Guid.NewGuid():N}.png");
var url = $"{BaseUrl}{coinAddress}";
return filePath;
}

_webDriver.Url = url;
await Task.Delay(timeout).ConfigureAwait(false);
public TokenData GetTokenData()
{
var element = _webDriver.FindElement(By.XPath("/html/body/div[1]/div/div[1]/div[2]/div/div[1]/div[2]"));
var fullText = element.Text;

var element = _webDriver.FindElement(By.XPath("//*[starts-with(@id, 'tradingview_')]"));
((WebElement)element).GetScreenshot().SaveAsFile(filePath);
var totalSupply = GetTotalSupply(fullText);
var marketCap = GetMarketCap(fullText);
var lpHoldings = GetLpHoldings(fullText);

return filePath;
var tokenData = new TokenData
{
TotalSupply = totalSupply,
MarketCap = marketCap,
LpHoldings = lpHoldings
};

return tokenData;
}

private static string GetTotalSupply(string fullText)
{
var startText = "Total Supply:\r\n";
var startIndex = fullText.IndexOf(startText, StringComparison.OrdinalIgnoreCase);
var endIndex = fullText.IndexOf("Market Cap:", StringComparison.OrdinalIgnoreCase);

var subString = fullText.Substring(startIndex, endIndex - startIndex).Trim();
var totalSupply = subString.Replace(startText, "");

return totalSupply;
}

private static string GetMarketCap(string fullText)
{
var startText = "Market Cap:";
var startIndex = fullText.IndexOf(startText, StringComparison.OrdinalIgnoreCase);
startIndex = fullText.IndexOf("$", startIndex, StringComparison.OrdinalIgnoreCase);
var endIndex = fullText.IndexOf("Pc v2", StringComparison.OrdinalIgnoreCase);

var subString = fullText.Substring(startIndex, endIndex - startIndex).Trim();
var marketCap = subString.Replace(startText, "");

return marketCap;
}

private static string GetLpHoldings(string fullText)
{
var startText = "LP Holdings:\r\n";
var startIndex = fullText.IndexOf(startText, StringComparison.OrdinalIgnoreCase);
var endIndex = fullText.IndexOf("| Chart", StringComparison.OrdinalIgnoreCase);

var subString = fullText.Substring(startIndex, endIndex - startIndex).Trim();
var lpHoldings = subString.Replace(startText, "");
return lpHoldings;
}

public void Dispose()
Expand Down
4 changes: 4 additions & 0 deletions src/Startup.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Globalization;
using System.Reflection;
using System.Threading.Tasks;
using Discord;
Expand All @@ -21,6 +22,9 @@ public class Startup : IDisposable
public Startup()
{
_serviceProvider = ConfigureServices();

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture;
}

private ServiceProvider ConfigureServices()
Expand Down

0 comments on commit e1da7c7

Please sign in to comment.