Pull money manipulation out of the thread for thread safety
This commit is contained in:
@@ -57,11 +57,39 @@ namespace Controllers.Automation {
|
||||
// Wait for all the threads to finish
|
||||
await Task.WhenAll(threadpool);
|
||||
|
||||
// Process Stocks -> Buy Sell Hold / Based on the global data from earlier
|
||||
sellStock(username);
|
||||
// Get the highest ranked
|
||||
Stock HighestRanking = new Stock(){ Symbol="NVDA", Score = -400 }; // Just a placeholder incase an empty list comes through there is a fallback
|
||||
foreach(Stock cur in VerifiedTrackedStocks) {
|
||||
if (HighestRanking.Score < cur.Score) {
|
||||
HighestRanking = cur;
|
||||
}
|
||||
}
|
||||
|
||||
// Save the new scores to the database for reference from the UI
|
||||
// Get users money
|
||||
string MoneyStr = _dbDriver.Get( dbPrefix + "money");
|
||||
bool Money = float.TryParse( MoneyStr, out float VerifiedMoney );
|
||||
if (!Money) {
|
||||
Console.WriteLine( "Unable to load users money" );
|
||||
VerifiedMoney = 0;
|
||||
}
|
||||
|
||||
// Sell all stocks
|
||||
VerifiedMoney = sellStock(username, VerifiedMoney);
|
||||
if (VerifiedMoney == -1f) {
|
||||
Console.WriteLine("Failed to sell stocks");
|
||||
return;
|
||||
}
|
||||
|
||||
// Buy predicted stock
|
||||
VerifiedMoney = buyStock(username, VerifiedMoney, HighestRanking.Symbol);
|
||||
if (VerifiedMoney == -1f) {
|
||||
Console.WriteLine("Failed to buy stocks");
|
||||
return;
|
||||
}
|
||||
|
||||
// Save to the database
|
||||
_dbDriver.Set( dbPrefix + "watched", JsonConvert.SerializeObject( VerifiedTrackedStocks ) );
|
||||
_dbDriver.Set( dbPrefix + "money", VerifiedMoney.ToString());
|
||||
|
||||
});
|
||||
});
|
||||
@@ -76,7 +104,7 @@ namespace Controllers.Automation {
|
||||
thread.Start();
|
||||
}
|
||||
|
||||
void sellStock(string username){
|
||||
float sellStock(string username, float Money){
|
||||
string dbPrefix = $"[{username.ToLower()}]:";
|
||||
|
||||
// Get all stock history
|
||||
@@ -84,6 +112,7 @@ namespace Controllers.Automation {
|
||||
List<PurchasedStock> VerifiedPurchaseHistory = PurchaseHistory != null ? PurchaseHistory : new List<PurchasedStock>();
|
||||
|
||||
// Find the stocks that need to be sold
|
||||
float totalSale = 0;
|
||||
foreach(PurchasedStock cur in VerifiedPurchaseHistory) {
|
||||
if (cur.Sold == false) {
|
||||
|
||||
@@ -94,55 +123,53 @@ namespace Controllers.Automation {
|
||||
(bool, string) createResult = _paymentProcessor.CreatePayment(username);
|
||||
if (!createResult.Item1) {
|
||||
Console.WriteLine("Create Payment Failure: " + createResult.Item2);
|
||||
return;
|
||||
return -1f;
|
||||
}
|
||||
|
||||
// Try to sell the stock
|
||||
(bool, string) paymentResult = _paymentProcessor.TrySell(createResult.Item2, sellPrice);
|
||||
if (!paymentResult.Item1){
|
||||
Console.WriteLine("Process Payment Failure: " + paymentResult.Item2);
|
||||
return;
|
||||
return -1f;
|
||||
}
|
||||
|
||||
// Add up the total sale
|
||||
totalSale += sellPrice;
|
||||
}
|
||||
}
|
||||
|
||||
// Save the stock history
|
||||
_dbDriver.Set( dbPrefix + "Stocks", JsonConvert.SerializeObject(VerifiedPurchaseHistory) );
|
||||
|
||||
// return the new calculated total
|
||||
return Money + totalSale;
|
||||
}
|
||||
|
||||
void buyStock(string username, string stockSymbol){
|
||||
float buyStock(string username, float Money, string stockSymbol){
|
||||
string dbPrefix = $"[{username.ToLower()}]:";
|
||||
|
||||
// Get all stock history
|
||||
List<PurchasedStock>? PurchaseHistory = JsonConvert.DeserializeObject<List<PurchasedStock>>( _dbDriver.Get( dbPrefix + "history" ) );
|
||||
List<PurchasedStock> VerifiedPurchaseHistory = PurchaseHistory != null ? PurchaseHistory : new List<PurchasedStock>();
|
||||
|
||||
// Get users money
|
||||
string MoneyStr = _dbDriver.Get( dbPrefix + "money");
|
||||
bool Money = float.TryParse( MoneyStr, out float VerifiedMoney );
|
||||
if (!Money) {
|
||||
Console.WriteLine( "Unable to load users money" );
|
||||
VerifiedMoney = 0;
|
||||
}
|
||||
|
||||
// Get Stock Price
|
||||
float stockPrice = _aiModule.GetCurrentPrice( stockSymbol );
|
||||
|
||||
// Get max stocks user can purchase [ int cast truncates the decimal ]
|
||||
int MaxQty = (int)( VerifiedMoney / stockPrice );
|
||||
int MaxQty = (int)( Money / stockPrice );
|
||||
|
||||
// Try create payment session
|
||||
(bool, string) createResult = _paymentProcessor.CreatePayment(username);
|
||||
if (!createResult.Item1) {
|
||||
Console.WriteLine("Create Payment Failure: " + createResult.Item2);
|
||||
return;
|
||||
return -1f;
|
||||
}
|
||||
|
||||
// Try Pay for the stock
|
||||
(bool, string) result = _paymentProcessor.TryPayment(createResult.Item2, stockPrice * MaxQty);
|
||||
if (!result.Item1){
|
||||
Console.WriteLine("Process Payment Failure: " + result.Item2);
|
||||
return;
|
||||
return -1f;
|
||||
}
|
||||
|
||||
// Add the stock
|
||||
@@ -152,6 +179,9 @@ namespace Controllers.Automation {
|
||||
Quantity = MaxQty,
|
||||
} );
|
||||
_dbDriver.Set( dbPrefix + "Stocks", JsonConvert.SerializeObject(VerifiedPurchaseHistory) );
|
||||
|
||||
// Return the new money
|
||||
return Money - ( stockPrice * MaxQty );
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user