Files
AI-Stock-Trader/WebServer/Components/Pages/Home.razor
T

198 lines
6.6 KiB
Plaintext

@page "/"
@using Controllers.Payment
@using Microsoft.Extensions.FileSystemGlobbing.Internal.PathSegments
@rendermode InteractiveServer
<PageTitle>Home</PageTitle>
<div class="main-area">
<!-- Login Frame -->
@if (Session == null){
<div class="gridFrame">
<div><h2>LOGIN</h2></div>
<div class="loginRow">
<div><span>username</span></div>
<input @bind-value="userName" type="text" />
</div>
<div class="loginRow">
<div><span>password</span></div>
<input @bind-value="passWord" type="password" />
</div>
<div class="loginRow">
<button @onclick="LoginSession">Login</button>
<button @onclick="registerSession">Register</button>
</div>
<div>
<span style="color: red;">@loginError</span>
</div>
</div>
<!-- User Frame -->
}else{
<div class="gridFrame">
<div><h2>Account</h2></div>
<span>UserName: @Session.UserName</span><br />
<div>
<span>Money: $@Session.Money</span>
</div>
</div>
<!-- Tool Frame -->
<div class="gridFrame">
<div>
<div><h2>Actions</h2></div>
<div>
<input placeholder="Stock Symbol [NVDA]" @bind="addStockSymbol" />
<button @onclick="addStock">Add To Tracked Stocks</button>
</div>
<span>@resultError</span>
</div>
</div>
}
<!-- AI Frame -->
@if (Session != null){
<div>
<!-- Tracked Stocks -->
<div class="gridFrame">
<div>
<h2>Current Signal</h2>
</div>
@foreach (Stock cur in Session.TrackedStocks){
<div class="signalBlock">
<p style="text-align: center; font-weight: bold;">@cur.Symbol</p>
<p>AI Predicted Score: @cur.Score</p>
<button @onclick="async () => {await removeStock(cur);}">Remove</button>
</div>
}
</div>
<!-- Trade History -->
<div class="gridFrame">
<div>
<h2>Trade History</h2>
</div>
@foreach (PurchasedStock cur in Session.TradeHistory){
<div class="signalBlock">
<p style="text-align: center; font-weight: bold;">@cur.Symbol</p>
<p>Purchased Quantity: @cur.Quantity</p>
<p>Purchased Price: @cur.PurchasePrice</p>
<p>Sell Price: @cur.PurchasePrice</p>
</div>
}
</div>
</div>
}
</div>
@code {
/////////////////////////////////////////////////////////////////////////////////////////////
/// Code Region
/////////////////////////////////////////////////////////////////////////////////////////////
loginSession? Session = null;
string resultError = "";
// Login Stuff
string userName = "";
string passWord = "";
string loginError = "";
async Task LoginSession(){
string dbPrefix = $"[{userName.ToLower()}]:";
// Check if user already exists
string passwordhash = dbDriver.Get( dbPrefix + "password" );
if (string.IsNullOrEmpty(passwordhash)){
loginError = "no account found with that username";
return;
}
// Check the password is valid
if (!BCrypt.Verify( passWord, passwordhash )){
loginError = "wrong password";
return;
}
// Load the users account
List<PurchasedStock>? history = JsonConvert.DeserializeObject<List<PurchasedStock>>( dbDriver.Get( dbPrefix + "history" ) );
List<Stock>? stocks = JsonConvert.DeserializeObject<List<Stock>>( dbDriver.Get( dbPrefix + "watched" ) );
bool moneyLoaded = float.TryParse(dbDriver.Get( dbPrefix + "money" ), out float moneyResult);
Session = new loginSession(){
UserName = userName.ToLower(),
TradeHistory = history != null ? history : new List<PurchasedStock>(),
TrackedStocks = stocks != null ? stocks : new List<Stock>(),
Money = moneyLoaded ? moneyResult : 1000
};
}
async Task registerSession(){
string dbPrefix = $"[{userName.ToLower()}]:";
// Check if user already exists
string passwordhash = dbDriver.Get( dbPrefix + "password" );
if (!string.IsNullOrEmpty(passwordhash)){
loginError = "account is taken";
return;
}
// Create User Object on the database
dbDriver.Set( dbPrefix + "password", BCrypt.HashPassword( passWord, BCrypt.GenerateSalt() ) );
dbDriver.Set( dbPrefix + "money", "1000" );
Session = new loginSession(){
UserName = userName.ToLower(),
TradeHistory = new List<PurchasedStock>(),
TrackedStocks = new List<Stock>(),
Money = 1000
};
// Add the users to a global table for automation
List<string>? Users = JsonConvert.DeserializeObject<List<string>>( dbDriver.Get( "Users" ) );
List<string> verifiedUsers = Users != null ? Users : new List<string>();
verifiedUsers.Add(userName.ToLower());
dbDriver.Set( "Users", JsonConvert.SerializeObject(verifiedUsers) );
}
string addStockSymbol = "";
async Task addStock(){
// Make sure a session exists
if (Session == null){
return;
}
// Add a tracked stock to the users account
Session.TrackedStocks.Add(new Stock(){
Symbol = addStockSymbol.ToUpper()
});
// Save the users account
string dbPrefix = $"[{userName.ToLower()}]:";
dbDriver.Set(dbPrefix + "watched", JsonConvert.SerializeObject(Session.TrackedStocks) );
}
async Task removeStock(Stock stock){
// Make sure a session exists
if (Session == null){
return;
}
// Remove the stock
Session.TrackedStocks.Remove(stock);
// Save the users account
string dbPrefix = $"[{userName.ToLower()}]:";
dbDriver.Set(dbPrefix + "watched", JsonConvert.SerializeObject(Session.TrackedStocks) );
}
}