From eac4631e1292a75b4cbe1a0858df68888c21cf42 Mon Sep 17 00:00:00 2001 From: AlanMoonbase Date: Thu, 26 Jun 2025 16:14:44 -0700 Subject: [PATCH] Implemented First Currency Game - Stock Market Reworked `GatewayService` To Use New Hub Command Set Implemented User Directory Changed Icon On Users Online Tab --- .../Dtos/User/UserStockActionResultDto.cs | 8 + QtCNETAPI/Models/User.cs | 1 + QtCNETAPI/Services/ApiService/ApiService.cs | 98 +++++ QtCNETAPI/Services/ApiService/IApiService.cs | 4 + .../Services/GatewayService/GatewayService.cs | 45 ++- .../GatewayService/IGatewayService.cs | 19 +- qtc-net-client-2/Anims/dollar-money.gif | Bin 0 -> 69386 bytes qtc-net-client-2/Forms/Chat.Designer.cs | 20 +- qtc-net-client-2/Forms/Chat.cs | 8 +- .../Forms/DirectMessage.Designer.cs | 8 +- qtc-net-client-2/Forms/DirectMessage.cs | 10 +- qtc-net-client-2/Forms/Main.Designer.cs | 378 +++++++++++------- qtc-net-client-2/Forms/Main.cs | 134 +++++-- qtc-net-client-2/Forms/Main.resx | 211 ++++++++-- .../Forms/StockMarketGame.Designer.cs | 206 ++++++++++ qtc-net-client-2/Forms/StockMarketGame.cs | 177 ++++++++ qtc-net-client-2/Forms/StockMarketGame.resx | 120 ++++++ qtc-net-client-2/Icons/UserIcon.png | Bin 0 -> 348 bytes .../Properties/Resources.Designer.cs | 12 +- qtc-net-client-2/Properties/Resources.resx | 13 +- 20 files changed, 1217 insertions(+), 255 deletions(-) create mode 100644 QtCNETAPI/Dtos/User/UserStockActionResultDto.cs create mode 100644 qtc-net-client-2/Anims/dollar-money.gif create mode 100644 qtc-net-client-2/Forms/StockMarketGame.Designer.cs create mode 100644 qtc-net-client-2/Forms/StockMarketGame.cs create mode 100644 qtc-net-client-2/Forms/StockMarketGame.resx create mode 100644 qtc-net-client-2/Icons/UserIcon.png diff --git a/QtCNETAPI/Dtos/User/UserStockActionResultDto.cs b/QtCNETAPI/Dtos/User/UserStockActionResultDto.cs new file mode 100644 index 0000000..0645227 --- /dev/null +++ b/QtCNETAPI/Dtos/User/UserStockActionResultDto.cs @@ -0,0 +1,8 @@ +namespace QtCNETAPI.Dtos.User +{ + public class UserStockActionResultDto + { + public int StockAmount { get; set; } + public int CurrencyAmount { get; set; } + } +} diff --git a/QtCNETAPI/Models/User.cs b/QtCNETAPI/Models/User.cs index 94bbf27..506b90b 100644 --- a/QtCNETAPI/Models/User.cs +++ b/QtCNETAPI/Models/User.cs @@ -13,6 +13,7 @@ public DateTime CreatedAt { get; set; } public int Status { get; set; } = 0; public int CurrencyAmount { get; set; } = 0; + public int StockAmount { get; set; } = 0; public DateTime LastCurrencySpin { get; set; } public virtual IEnumerable? RefreshTokens { get; } diff --git a/QtCNETAPI/Services/ApiService/ApiService.cs b/QtCNETAPI/Services/ApiService/ApiService.cs index 1026c5d..4dbc510 100644 --- a/QtCNETAPI/Services/ApiService/ApiService.cs +++ b/QtCNETAPI/Services/ApiService/ApiService.cs @@ -3,6 +3,7 @@ using QtCNETAPI.Dtos.User; using QtCNETAPI.Models; using RestSharp; using System.IdentityModel.Tokens.Jwt; +using System.Resources; using System.Text.Json; namespace QtCNETAPI.Services.ApiService @@ -56,6 +57,32 @@ namespace QtCNETAPI.Services.ApiService return serviceResponse; } + public async Task>> GetAllUsersAsync() + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse>(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var request = new RestRequest("users/all") + .AddHeader("Authorization", $"Bearer {SessionToken}"); + var response = await _client.GetAsync>>(request); + + if (response != null || response!.Data != null) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + else + { + serviceResponse.Success = false; + serviceResponse.Message = "API didn't respond with users."; + } + + return serviceResponse; + } + public async Task>> GetOnlineUsersAsync() { await RefreshSessionIfInvalid(); @@ -566,5 +593,76 @@ namespace QtCNETAPI.Services.ApiService return serviceResponse; } + + public async Task> GetCurrentStockPrice() + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("games/stock-market/current-price") + .AddHeader("Authorization", $"Bearer {SessionToken}"); + var response = await _client.GetAsync>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } + + public async Task> BuyStock(int amount) + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("games/stock-market/buy-stock") + .AddHeader("Authorization", $"Bearer {SessionToken}") + .AddQueryParameter("amount", amount); + var response = await _client.PostAsync>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } + + public async Task> SellStock(int amount) + { + await RefreshSessionIfInvalid(); + + var serviceResponse = new ServiceResponse(); + + if (SessionToken == null) throw new NullReferenceException("Function Was Called Before A Session Was Made."); + + var restRequest = new RestRequest("games/stock-market/sell-stock") + .AddHeader("Authorization", $"Bearer {SessionToken}") + .AddQueryParameter("amount", amount); + var response = await _client.PostAsync>(restRequest); + + if (response == null) { serviceResponse.Success = false; serviceResponse.Message = "API did not respond."; return serviceResponse; } + + if (response.Success) + { + serviceResponse.Success = true; + serviceResponse.Data = response.Data; + } + + return serviceResponse; + } } } diff --git a/QtCNETAPI/Services/ApiService/IApiService.cs b/QtCNETAPI/Services/ApiService/IApiService.cs index 3d526e3..8052c52 100644 --- a/QtCNETAPI/Services/ApiService/IApiService.cs +++ b/QtCNETAPI/Services/ApiService/IApiService.cs @@ -17,6 +17,7 @@ namespace QtCNETAPI.Services.ApiService public Task> PingServerAsync(); public Task>> GetOnlineUsersAsync(); + public Task>> GetAllUsersAsync(); public Task> LoginAsync(UserLoginDto userLoginDto); public Task> RefreshLogin(string refreshToken); public Task> RefreshSessionIfInvalid(); @@ -33,5 +34,8 @@ namespace QtCNETAPI.Services.ApiService public Task> AcceptContactRequest(string userId); public Task> RemoveContactFromCurrentUser(string userId); public Task> AddCurrencyToCurrentUser(int amount, bool isSpinClaim); + public Task> GetCurrentStockPrice(); + public Task> BuyStock(int amount); + public Task> SellStock(int amount); } } diff --git a/QtCNETAPI/Services/GatewayService/GatewayService.cs b/QtCNETAPI/Services/GatewayService/GatewayService.cs index 6ef9d9f..4c7fdc3 100644 --- a/QtCNETAPI/Services/GatewayService/GatewayService.cs +++ b/QtCNETAPI/Services/GatewayService/GatewayService.cs @@ -15,7 +15,10 @@ namespace QtCNETAPI.Services.GatewayService public HubConnection? HubConnection { get; private set; } - public event EventHandler OnServerMessageReceived; + public event EventHandler OnRoomMessageReceived; + public event EventHandler OnRefreshUserListReceived; + public event EventHandler OnRefreshRoomListReceived; + public event EventHandler OnRefreshContactsListReceived; public event EventHandler OnClientFunctionReceived; public event EventHandler OnDirectMessageReceived; public event EventHandler OnServerConfigReceived; @@ -45,21 +48,25 @@ namespace QtCNETAPI.Services.GatewayService }); HubConnection = gwConBuilder.Build(); - // start connection - await HubConnection.StartAsync(); - // register events - HubConnection.On("rm", (serverMessage) => OnServerMessageReceived?.Invoke(this, new ServerMessageEventArgs{Message = serverMessage})); - HubConnection.On("cf", (function) => OnClientFunctionReceived?.Invoke(this, new ClientFunctionEventArgs{Function = function})); - HubConnection.On("rdm", (message, user) => OnDirectMessageReceived?.Invoke(this, new DirectMessageEventArgs { Message = message, User = user })); - HubConnection.On("rc", (serverConfig) => OnServerConfigReceived?.Invoke(this, new ServerConfigEventArgs{ServerConfig = serverConfig})); + HubConnection.On("RoomMessage", (serverMessage) => OnRoomMessageReceived?.Invoke(this, new ServerMessageEventArgs { Message = serverMessage })); + HubConnection.On("cf", (function) => OnClientFunctionReceived?.Invoke(this, new ClientFunctionEventArgs { Function = function })); + HubConnection.On("ReceiveDirectMessage", (message, user) => OnDirectMessageReceived?.Invoke(this, new DirectMessageEventArgs { Message = message, User = user })); + HubConnection.On("RefreshUserList", () => OnRefreshUserListReceived?.Invoke(this, EventArgs.Empty)); + HubConnection.On("RefreshRoomList", () => OnRefreshRoomListReceived?.Invoke(this, EventArgs.Empty)); + HubConnection.On("RefreshContactsList", () => OnRefreshContactsListReceived?.Invoke(this, EventArgs.Empty)); + HubConnection.On("ReceiveServerConfig", (serverConfig) => OnServerConfigReceived?.Invoke(this, new ServerConfigEventArgs { ServerConfig = serverConfig })); HubConnection.Closed += HubConnection_Closed; HubConnection.Reconnecting += HubConnection_Reconnecting; HubConnection.Reconnected += HubConnection_Reconnected; + // start connection + await HubConnection.StartAsync(); + if (HubConnection != null && HubConnection.State == HubConnectionState.Connected) - await HubConnection.SendAsync("l", _apiService.CurrentUser); + // send login hub method + await HubConnection.SendAsync("LoginHub", _apiService.CurrentUser); } public async Task StopAsync() @@ -87,7 +94,7 @@ namespace QtCNETAPI.Services.GatewayService if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - await HubConnection.SendAsync("jl", _apiService.CurrentUser); + await HubConnection.SendAsync("JoinLobby", _apiService.CurrentUser); InLobby = true; CurrentRoom = null; } @@ -100,15 +107,15 @@ namespace QtCNETAPI.Services.GatewayService if (InLobby == true) { - await HubConnection.SendAsync("ll", _apiService.CurrentUser); + await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser); InLobby = false; } else if (CurrentRoom != null) { - await HubConnection.SendAsync("lr", _apiService.CurrentUser, CurrentRoom); + await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom); } - await HubConnection.SendAsync("jr", _apiService.CurrentUser, room); + await HubConnection.SendAsync("JoinRoom", _apiService.CurrentUser, room); CurrentRoom = room; } @@ -120,12 +127,12 @@ namespace QtCNETAPI.Services.GatewayService if (InLobby) { - await HubConnection.SendAsync("ll", _apiService.CurrentUser); + await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser); InLobby = false; } else { - await HubConnection.SendAsync("lr", _apiService.CurrentUser, CurrentRoom); + await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom); CurrentRoom = null; } } @@ -136,7 +143,7 @@ namespace QtCNETAPI.Services.GatewayService if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - await HubConnection.SendAsync("rcl", user, _apiService.CurrentUser); + await HubConnection.SendAsync("RefreshContactsListOnUser", user, _apiService.CurrentUser); } public async Task PostMessageAsync(Message message) @@ -145,7 +152,7 @@ namespace QtCNETAPI.Services.GatewayService if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - await HubConnection.SendAsync("s", _apiService.CurrentUser, message, InLobby, CurrentRoom); + await HubConnection.SendAsync("SendMessage", _apiService.CurrentUser, message, InLobby, CurrentRoom); } public async Task SendDirectMessageAsync(UserInformationDto user, Message message) @@ -154,7 +161,7 @@ namespace QtCNETAPI.Services.GatewayService if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - await HubConnection.SendAsync("sdm", _apiService.CurrentUser, user, message); + await HubConnection.SendAsync("SendDirectMessage", _apiService.CurrentUser, user, message); } public async Task UpdateStatus(int status) @@ -163,7 +170,7 @@ namespace QtCNETAPI.Services.GatewayService if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - await HubConnection.SendAsync("us", _apiService.CurrentUser, status); + await HubConnection.SendAsync("UpdateStatus", _apiService.CurrentUser, status); } diff --git a/QtCNETAPI/Services/GatewayService/IGatewayService.cs b/QtCNETAPI/Services/GatewayService/IGatewayService.cs index f620f36..f0067a0 100644 --- a/QtCNETAPI/Services/GatewayService/IGatewayService.cs +++ b/QtCNETAPI/Services/GatewayService/IGatewayService.cs @@ -103,9 +103,9 @@ namespace QtCNETAPI.Services.GatewayService // EVENTS /// - /// When A Server Message Is Received, This Event Fires + /// When A Room Message Is Received, This Event Fires /// - public event EventHandler OnServerMessageReceived; + public event EventHandler OnRoomMessageReceived; /// /// When A Client Function/Event Is Received, This Event Fires @@ -117,6 +117,21 @@ namespace QtCNETAPI.Services.GatewayService /// public event EventHandler OnDirectMessageReceived; + /// + /// Fires When The Client Receives The Request To Refresh Its User List + /// + public event EventHandler OnRefreshUserListReceived; + + /// + /// Fires When The Client Receives The Request To Refresh Its Room List + /// + public event EventHandler OnRefreshRoomListReceived; + + /// + /// Fires When The Client Receives The Request To Refresh Its Contacts List + /// + public event EventHandler OnRefreshContactsListReceived; + /// /// When The Server Config Is Received, This Event Fires /// diff --git a/qtc-net-client-2/Anims/dollar-money.gif b/qtc-net-client-2/Anims/dollar-money.gif new file mode 100644 index 0000000000000000000000000000000000000000..66cd9dd9fd5105f161069fabf9a8f5a68ad7ce5c GIT binary patch literal 69386 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 z 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 RoomList = []; private List OnlineUsers = []; + private List UserDirectory = []; private List Contacts = []; private bool FirstMinimize = true; @@ -193,22 +194,16 @@ namespace qtc_net_client_2 } } - private async void btnRefresh_Click(object sender, EventArgs e) - { - // refresh all - await RefreshContactsList(); - await RefreshRoomsList(); - await RefreshOnlineUsersList(); - } - private void frmMain_Resize(object sender, EventArgs e) { - if (WindowState == FormWindowState.Minimized && _config.MinimizeToTray) - { - Hide(); - niMain.Visible = true; - if (FirstMinimize) { niMain.ShowBalloonTip(10, - "I'm over here!", + if (WindowState == FormWindowState.Minimized && _config.MinimizeToTray) + { + Hide(); + niMain.Visible = true; + if (FirstMinimize) + { + niMain.ShowBalloonTip(10, + "I'm over here!", "QtC.NET Mimimizes To Tray By Default. To Change This Behaviour, Refer To config.json", ToolTipIcon.Info); FirstMinimize = false; @@ -298,6 +293,44 @@ namespace qtc_net_client_2 } } + private async void lbUserDirectory_DoubleClick(object sender, EventArgs e) + { + if (lbUserDirectory.SelectedItems.Count > 0) + { + string? selectedUser = (string?)lbUserDirectory.SelectedItems[lbUserDirectory.SelectedItems.Count - 1]; + + if (selectedUser != null) + { + // get user info and open profile dialog + var user = UserDirectory.FirstOrDefault(e => e.Username == selectedUser); + var res = await _apiService.GetUserInformationAsync(user!.Id); + var pfpRes = await _apiService.GetUserProfilePic(user!.Id); + + if (res.Data != null && res.Success) + { + Profile frmProfile = new Profile(res.Data, pfpRes, _apiService, _gatewayService); + frmProfile.ShowDialog(); + } + } + } + } + + private void lvGames_DoubleClick(object sender, EventArgs e) + { + if (lvGames.SelectedItems.Count > 0) + { + string? gameSelected = (string?)lvGames.SelectedItems[lvGames.SelectedItems.Count - 1].Tag; + + switch (gameSelected) + { + case "StockMarketGame": + StockMarketGame stockMarketGame = new StockMarketGame(_apiService); + stockMarketGame.Show(); + break; + } + } + } + private async Task OnSuccessfulLogin() { // double check @@ -310,8 +343,10 @@ namespace qtc_net_client_2 _gatewayService.OnServerReconnecting += _gatewayService_OnServerReconnecting; _gatewayService.OnServerReconnected += _gatewayService_OnServerReconnected; _gatewayService.OnServerDisconnect += _gatewayService_OnServerDisconnect; - _gatewayService.OnClientFunctionReceived += _gatewayService_OnClientFunctionReceived; _gatewayService.OnDirectMessageReceived += _gatewayService_OnDirectMessageReceived; + _gatewayService.OnRefreshUserListReceived += _gatewayService_OnRefreshUserListReceived; + _gatewayService.OnRefreshRoomListReceived += _gatewayService_OnRefreshRoomListReceived; + _gatewayService.OnRefreshContactsListReceived += _gatewayService_OnRefreshContactsListReceived; _gatewayService.OnServerConfigReceived += _gatewayService_OnServerConfigReceived; if (_gatewayService.HubConnection != null && _gatewayService.HubConnection.State == Microsoft.AspNetCore.SignalR.Client.HubConnectionState.Connected) @@ -339,6 +374,7 @@ namespace qtc_net_client_2 await RefreshContactsList(); await RefreshRoomsList(); await RefreshOnlineUsersList(); + await RefreshUserDirectory(); // TODO - figure out server side why online status is invisible on login _apiService.CurrentUser.Status = 1; @@ -380,7 +416,7 @@ namespace qtc_net_client_2 if (current > _apiService.CurrentUser.LastCurrencySpin.ToUniversalTime() || _apiService.CurrentUser.LastCurrencySpin == new DateTime()) llblClaimSpin.Visible = true; else llblClaimSpin.Visible = false; - if(_config.StartMinimized) WindowState = FormWindowState.Minimized; + if (_config.StartMinimized) WindowState = FormWindowState.Minimized; } } } @@ -418,6 +454,34 @@ namespace qtc_net_client_2 } } + private async Task RefreshUserDirectory() + { + // get all users on server + var userList = await _apiService.GetAllUsersAsync(); + + if (userList != null && userList.Success && userList.Data != null) + { + // clear the list + if (lbUserDirectory.InvokeRequired) lbUserDirectory.BeginInvoke(lbUserDirectory.Items.Clear); + else lbUserDirectory.Items.Clear(); + UserDirectory.Clear(); + + // populate list + foreach (var user in userList.Data) + { + if (lbUserDirectory.InvokeRequired) + { + lbUserDirectory.BeginInvoke(delegate () { lbUserDirectory.Items.Add(user.Username); }); + } + else + { + lbUserDirectory.Items.Add(user.Username); + } + UserDirectory.Add(user); + } + } + } + private async Task RefreshRoomsList() { if (InvokeRequired) @@ -622,6 +686,20 @@ namespace qtc_net_client_2 } } + public void RefreshCurrencyCounter() + { + if (lblCurrencyAmount.InvokeRequired) + { + lblCurrencyAmount.BeginInvoke(delegate () + { + lblCurrencyAmount.Text = _apiService.CurrentUser.CurrencyAmount.ToString(); + }); + } else + { + lblCurrencyAmount.Text = _apiService.CurrentUser.CurrencyAmount.ToString(); + } + } + private async void _gatewayService_OnServerDisconnect(object? sender, EventArgs e) { if (DialogResult == DialogResult.OK) return; @@ -669,24 +747,6 @@ namespace qtc_net_client_2 private void _gatewayService_OnServerReconnecting(object? sender, EventArgs e) => BeginInvoke(delegate () { Enabled = false; }); private void _gatewayService_OnServerReconnected(object? sender, EventArgs e) => BeginInvoke(delegate () { Enabled = true; }); - private async void _gatewayService_OnClientFunctionReceived(object? sender, EventArgs e) - { - var args = (ClientFunctionEventArgs)e; - - switch (args.Function) - { - case "rul": - await RefreshOnlineUsersList(); - break; - case "rr": - await RefreshRoomsList(); - break; - case "rcl": - await RefreshContactsList(); - break; - } - } - private async void _gatewayService_OnServerConfigReceived(object? sender, EventArgs e) { var args = (ServerConfigEventArgs)e; @@ -704,8 +764,6 @@ namespace qtc_net_client_2 } Environment.Exit(0); } - - BeginInvoke(delegate () { Text = $"QtC.NET Client = Connected To {args.ServerConfig.Name}"; }); } } @@ -726,5 +784,9 @@ namespace qtc_net_client_2 Task.Run(frmDirectMessage.ShowDialog); } } + + private async void _gatewayService_OnRefreshContactsListReceived(object? sender, EventArgs e) => await RefreshContactsList(); + private async void _gatewayService_OnRefreshRoomListReceived(object? sender, EventArgs e) => await RefreshRoomsList(); + private async void _gatewayService_OnRefreshUserListReceived(object? sender, EventArgs e) => await RefreshOnlineUsersList(); } } diff --git a/qtc-net-client-2/Forms/Main.resx b/qtc-net-client-2/Forms/Main.resx index 1cfdd5e..db1db72 100644 --- a/qtc-net-client-2/Forms/Main.resx +++ b/qtc-net-client-2/Forms/Main.resx @@ -120,6 +120,96 @@ 17, 17 + + 451, 21 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs + LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAuBIAAAJNU0Z0AUkBTAMBAQAB + aAEAAWgBAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAegAD + XAHnAQgBCgEAAf8DKgFA/wDVAAMhATADRgGAFAABFQEfAQQB/wENARUBAAH/AQgBCgEAAf8BCAEKAQAB + //8AyQADWgG/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgB + CgEAAf8DWgG/A1oBvwFDAXQBBwH/AUcBdwEMAf8BJQFHAQAB/wEOARkBAAH//wDFAAEIAQoBAAH/ARAB + HgEAAf8BIQFBAQAB/wEnAUsBAAH/ASYBSgEAAf8BIQFBAQAB/wEQAR4BAAH/AQgBCgEAAf8BCAEKAQAB + /wEIAQoBAAH/ASkBTgEAAf8BWgGWARAB/wFaAZwBEAH/AXMBtgEmAf8BGAEuAQAB//8AwQABCAEKAQAB + /wE9AXEBAgH/AUwBhgEHAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AUwB + fwEPAf8BOwFnAQgB/wEhATQBCAH/AVMBjgELAf8BWgGcARAB/wFyAbMBJwH/AVMBgQEbAf//AMEAARUB + KQEAAf8BSgGEAQQB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB + /wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFWAZABDAH/AVoBmgEQAf8BWgGcARAB/wFyAakBMAH/AQgB + CgEAAf8BCAEKAQAB//8AuQABFgEnAQIB/wFJAYABBwH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB + jAEIAf8BUgGMAQgB/wFSAYwBCwH/AVIBjAEQAf8BUgGMARAB/wFYAZIBEAH/AVoBlAEQAf8BWgGbARAB + /wFaAZwBEAH/AVwBngESAf8BOwFtAQMB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB//8AsQADXQHfAUcB + gAEDAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB + /wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZQBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoB + nAEQAf8BWgGYARAB/wEWASoBAAH/AQgBCgEAAf8BCAEKAQAB//8ArQABLAFQAQAB/wFKAYwBAAH/AVIB + jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBDgH/AVUBkgEQAf8BWgGcARAB + /wFaAZwBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoB + lAEYAf8BWAGSARYB/wEQAR4BAAH/AQgBCgEAAf//ALEAA0sBjwEzAV4BAAH/AVIBjAEIAf8BUgGMAQgB + /wFSAYwBCAH/AVIBjAEQAf8BfwHAATMB/wFfAZ4BFwH/ASABPwEAAf8BCAEKAQAB/wFSAYwBEAH/AVoB + nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGVARcB/wFaAZQBGAH/AVoBlAEYAf8BWgGUARgB + /wEIAQoBAAH/AQgBCgEAAf//ALkAAUIBewEAAf8BUgGMAQgB/wF7AcYBKQH/AzMBUAQAAwwBEAE5AWsB + AAH/AVoBnAEQAf8BWgGcARAB/wFdAZcBEwH/AVYBlAEMAf8BWgGcARAB/wFaAZQBGAH/AVoBlAEYAf8B + YwGcARgB/wFjAaUBFwH/ASkBUAEAAf8BCAEKAQAB//8AvQABCAEKAQAB/wwAARMBIwEAAf8BWgGUARAB + /wFaAZwBEAH/AZQB1gFKAf8BDQERAQIB/wExAVoBAAH/AVoBlAESAf8BWgGUARgB/wFaAZQBGAH/AWMB + nAEYAf8BYwGlARcB/wFrAaUBIQH/ARABHgEAAf//AKkAA10B3wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB + /wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wMzAVADOgFgAUsBhQEHAf8BWgGUARAB/wFaAZwBEAH/ATkB + awEAAf8DCQEMARABHgEAAf8BVAGOARIB/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AXMB + tAEpAf8BEAEeAQAB//8ApQABCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgB + CgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BMwFfAQIB/wFaAZQBEAH/AVoBnAEQAf8BrQHnAWMB + /wEQAR4BAAH/AQgBCgEAAf8BFAEmAQAB/wFUAY4BEgH/AWIBmwEYAf8BYwGcARgB/wFjAaUBFwH/AWMB + pQEXAf8BYwGcASEB/wEYAS4BAAH//wChAAEIAQoBAAH/ASsBUgEAAf8BQQFyAQUB/wFKAYQBBgH/AUoB + hAEGAf8BSgGEAQYB/wFCAXMBBgH/ASkBUAEAAf8BEAEeAQAB/wEfAToBAAH/AVUBjwELAf8BWgGVARAB + /wFaAZwBEAH/AdYB/wGMAf8BEAEeAQAB/wEYAS4BAAH/AUIBeAEDAf8BWgGUARgB/wFiAZsBGAH/AWMB + nAEYAf8BYwGlARcB/wFjAaUBFwH/AXMBtAEpAf8BEAEeAQAB//8AnQABKAFNAQAB/wFOAYgBBwH/AVIB + jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB + /wFSAYwBEAH/AVoBlAEQAf8BWgGcARAB/wFjAaUBFwH/AUIBewEAAf8BSgGEAQYB/wFSAYwBCAH/AVoB + mAEUAf8BWgGUARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFjAaUBFwH/AZQByQFNAf//AJ0AASkB + TgECAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB + /wFSAYwBEAH/AVIBjAEQAf8BUgGMARAB/wFaAZQBEAH/AVoBlQEQAf8BWgGcARAB/wFaAZwBEAH/AVoB + nAEQAf8BWgGcARAB/wFaAZQBGAH/AVoBlAEYAf8BYwGcARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB + /wFjAaUBFwH/AWUBoAEhAf//AJkAA0YBgAFOAYgBBwH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB + jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB + /wFaAZcBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGUARgB/wFaAZQBGAH/AWMB + nAEYAf8BYwGhARgB/wFjAaUBFwH/AWMBpQEXAf8BeAG6ASwB/wEIAQoBAAH//wCZAAE1AV4BBwH/AVIB + jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB + /wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZQBEAH/AVoBmwEQAf8BWgGcARAB/wFaAZwBEAH/AVoB + nAEQAf8BWgGWARYB/wFaAZQBGAH/AV0BlwEYAf8BYwGcARgB/wFjAaUBFwH/AWMBpQEXAf8BcAGzASAB + /wErAVABBAH//wCdAAFKAYQBBgH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB + /wFnAakBFwH/AVIBjAEIAf8BSgGEAQYB/wFKAYQBBgH/AVIBjAEQAf8BWgGUARAB/wFaAZcBEAH/AVoB + nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGUARgB/wFaAZQBGAH/AV8BmAEYAf8BYwGeARgB + /wFjAaUBFwH/AWsBqQEdAf8BKQFQAQAB//8AoQABSgGEAQYB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB + /wFSAYwBCAH/AWkBpAEeAf8BLAFQAQMB/wEIAQoBAAH/ATcBYQEHAf8BUgGMAQ4B/wFSAYwBEAH/AX8B + wQEyAf8BWwFeAVsB0wNaAb8BLwFZAQAB/wFEAXoBBQH/AVABigEIAf8BWgGcAQ4B/wFaAZwBEAH/AVoB + nAEQAf8BTwGGARAB/wFEAXQBDAH/A1oBv/8ApQABSgGMAQAB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB + /wFSAYwBCAH/AWcBnQEnAf8BCAEKAQAB/wEKAQ8BAAH/AUIBdwEDAf8BUgGMARAB/wFaAZwBEAH/ASUB + QQEFAf8EAAM6AWABCAEKAQAB/wEIAQoBAAH/BAADRgGAA0YBgANGAYD/ALEAATsBbQECAf8BUgGMAQgB + /wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFTAY4BEAH/AQ8BGwEAAf8BIwFDAQAB/wFSAYwBEAH/AVIB + jAEQAf8BewG9ATAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB + /wEIAQoBAAH//wC5AAEIAQoBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB + /wFOAYIBDwH/AUoBhAEGAf8BUgGMARAB/wFjAaUBFwH/AQgBCgEAAf8BCAEKAQAB/wETASMBAAH/AUIB + cwEGAf8BIAE/AQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf//ALUAAUIB + cwEGAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB + /wFKAYQBBgH/ARABHgEAAf8BMQFaAQAB/wFNAYQBDQH/AVoBnAEQAf8BWgGcARAB/wFSAYwBCAH/ARAB + HgEAAf8BCAEKAQAB/wEIAQoBAAH/A0YBgP8AuQABSQGJAQAB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB + /wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZwBEAH/AVoB + nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BQgFzAQYB/wEKAQ4BAAH//wDBAAE6AWsBAAH/AVIB + jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB/wFaAZQBEAH/AVoBlAEQAf8BWgGcARAB + /wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZQBGAH/AVoBlAEYAf8BYwGlARcB/wEZASwBAwH//wDF + AAEsAVUBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZQBEAH/AVoB + nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGUARgB/wFaAZQBGAH/ASEBQQEAAf//AMUAARIB + IgEAAf8BTAGGAQYB/wFSAYwBCAH/AVoBnAEQAf8BUAGKAQgB/wFSAYwBEAH/AVoBlAEQAf8BWgGcARAB + /wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEQH/AWkBqwEfAf8BCAEKAQAB//8AyQABEAEeAQAB + /wFIAX0BBwH/AVkBkwETAf8BVQGIARgB/wgAASEBQQEAAf8BQgF7AQAB/wFSAYwBCAH/AVUBkQEIAf8B + OQFmAQQB/wFRAVMBTgHv/wDZAAEeAToBAAH//wD/AP8A1wABQgFNAT4HAAE+AwABKAMAAYADAAEgAwAB + AQEAAQEGAAECFgAD/wEAA/8BxwwAAv8BzwGHDAAB/wH+AQABBwwAAf8B/AEAAQcMAAH/AfgBAAEPDAAB + /wHwAQABBwwAAf8B4AEAAQMMAAH/AcABAAEBDAAB/wHAAQABAQwAAf8B4A4AAf8B/AEgDQAB/wH+AeAN + AAH/AcAOAAH/AYAOAAH/DwAB/gIAAQEMAAH8AgABAQwAAfgCAAEBDAAB+AIAAQMMAAH4AgABBwwAAfgC + AAEPDAAB+AEAAUQBfwwAAfgBAAEBAf8MAAH4AgABfwwAAfwCAAF/DAAB/gIAAf8MAAH/AgAB/wwAAf8B + gAEBAf8MAAH/AQABAwH/DAAB/wEMAQ8B/wwAAf8B3wL/DAAE/wwACw== + + 122, 19 @@ -127,45 +217,88 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu - SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA5AgAAAJNU0Z0AUkBTAIBAQIB - AAGwAQABsAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAARADAAEBAQABIAYAARAS - AANnAe8CZwFZAe8BZwFdAVkB7wFnAVsBWQHvAWcBWwFZAe8BZwJZAe8BZwFkAVkB7wNnAe8DZwHvA2cB - 7wNnAe8DZwHvA2cB7wNnAe8DZwHvA2cB7zgAAzMBUQN5AfWAAAP4Af8BuQGVATwB/wGDAX0BbgH/AYQB - fQFsAf8BqgGEAScB/wGsAXsBAAH/AcwBvAGUAf8DfgH/A34B/wN+Af8DfgH/A34B/wN+Af8DfgH/A34B - /wOOAf84AAMSARgDPwFtgAAE/wGXAYsBbQH/AoEBgAH/AYIBgQGAAf8BmAGIAWAB/wHKAZABAAH/Ad0B - zAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf80AANfAdMDPQFnhAAE/wGGAYQB - fQH/A4EB/wOBAf8BhwGDAXoB/wHPAZQBAAH/Ad4BzAGfAf8D4AH/A+AB/wPgAf8D4AH/A+AB/wPgAf8D - 4AH/A+AB/wO8Af80AANaAcIDNAFThAAE/wGLAYYBegH/A4EB/wOBAf8BjgGGAXEB/wHPAZQBAAH/Ad4B - zAGfIf8DygH/EAADDQERAz8BbANTAacBXAJZAb4BWAJWAbMBSAJHAYMDIQEwBAADcwHzAzoBYIgABP8B - rAGWAWAB/wGDAYIBfwH/AYUBggF9Af8BswGTAUQB/wHPAZQBAAH/Ad4BzAGfAf8DsAH/A7AB/wOwAf8D - sAH/A7AB/wOwAf8DsAH/A7AB/wOoAf8IAAMaASQDUgGgAWcBYwFIAfYBogFzAQAB/wGuAXwBAAH/AbAB - fQEAAf8BqAF4AQAB/wGVAWoBAAH/AYABagEWAf4BXAJZAcYDVwG1AxYBHogABP8B2QGqATcB/wG+AZgB - OAH/AcABmAE2Af8B3AGiARQB/wHPAZQBAAH/Ad4BzAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D - gQH/A4EB/wOTAf8EAAMgAS0CYwFaAekBvwGIAQAB/wHNAZUBCgH/AbABiAEnAf8BcwFkAT8B/wFNAUsB - RwH/AU4BSwFCAf8BZgFXATEB/wGaAXQBFwH/AaQBdgEDAf8BcAFPAQAB/wNDAXYEAYQABP8B4QGuATEB - /wG9AZcBOwH/AcABmAE1Af8B4wGlAQoB/wHPAZQBAAH/Ad4BzAGfAf8DwAH/A8AB/wPAAf8DwAH/A8AB - /wPAAf8DwAH/A8AB/wOvAf8EAAJjAVoB6QHZAZoBAAH/AdoBowEcAf8CjgGMAf8DigH/A5cB/wObAf8D - kQH/A3QB/wNIAf8BQwFCAT8B/wG1AYMBBwH/AXoBVwEAAf8DNgFYhAAE/wG7AZ0BUwH/AYgBhAF5Af8B - jAGFAXQB/wHEAZkBMAH/Ac8BlAEAAf8B3gHMAZ8h/wPKAf8DQwF2AekBpwECAf8B6QGrARIB/wHQAcoB - uwH/A6wB/wNdAf8DTAH/A0sB/wNEAf8DDwH/A7MB/wNmAf8BVAFMAToB/wGuAX0BBAH/A10BzIQABP8B - lAGKAXMB/wOBAf8DgQH/AZoBigFjAf8BzwGUAQAB/wHeAcwBnwH/A9AB/wPQAf8D0AH/A9AB/wPQAf8D - 0AH/A9AB/wPQAf8DtQH/AmoBYQHmAe0BrQEQAf8B9AHQAXYB/wP6Af8D+gH/A30B/wN/Af8DgAH/A4AB - /wN+Af8DhAH/A7sB/wNqAf8BqAGAARwB/wFpAWMBSAH2hAAE/wGGAYMBfgH/A4EB/wOBAf8BhgGDAXsB - /wHPAZQBAAH/Ad4BzAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8BagFnAWIB - 7gHvAbQBIQH/AfcB3AGXCf8DkQH/A4gB/wOHAf8DhwH/A4EB/wNXAf8D5gH/A6MB/wG2AZEBNgH/AYUB - agFAAfmEAAT/AYsBhgF5Af8DgQH/A4EB/wGOAYYBcQH/Ac8BlAEAAf8B3gHMAZ8B/wOhAf8DoQH/A6EB - /wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wNLAY0B8AG+AT8B/wH0Ac0BbCH/A/sB/wPQAf8B1wGnATEB - /wJhAV0B0YQABP8BpwGUAWcB/wGDAYIBfwH/AYUBgwF+Af8BsAGUAU4B/wHTAZcBAgH/AeABzgGfAf8D - 5wH/A+cB/wPnAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPAAf8DBwEJAWoBaAFiAe4B8QG8ATsB/wH6AeoB - wgH/A9wB/wN3Af8DaAH/A2gB/wNoAf8DMgn/AfIB3QGpAf8B6gGpAQgB/wM+AWqEAAT/AdcBsQFSAf8B - mgGPAXQB/wGgAZIBbQH/AeABrwE3Af8B5wGpARAB/wHrAdUBoAH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D - gQH/A4EB/wOBAf8DkwH/BAADMwFRAWoCaAHwAfMBxgFYAf8B+gHnAbgW/wH+AfsB/wH5AeIBqgH/Ae8B - uAEtAf8DTgGWBAKEAAT/AfQBzQFsAf8B9AHLAWYB/wH0AcsBZQH/AfQBywFlAf8B8QHBAUkB/wH5AeMB - rAH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DmgH/CAADIgExA18ByQGgAYoBZwH6AfMB - ygFlAf8B+QHhAaYB/wH7Ae0BzAH/AfsB7AHIAf8B+AHdAZsB/wHGAZgBZwH+AmUBXgHiAz0BaAQBiABA - /xAAAw8BEwNHAYIDZAHbAbQBngFvAfwDZwHqA1QBqAMoATuUAAFCAU0BPgcAAT4DAAEoAwABQAMAARAD - AAEBAQABAQUAAYAXAAP/AwAB/wH8BgAB/wH8BgAB/wH5BgAB/wH5BgAB8AETBgABwAEDBgABgAEBBgAB - gAEBBwABAQcAAQEHAAEBBwABAQcAAQEGAAGAAQEGAAHAAQMGAAHwAR8EAAs= + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA3hIAAAJNU0Z0AUkBTAIBAQQB + AAFoAQEBaAEBARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/ + AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/ACIAA2cB7wJnAVkB7wFnAV0BWQHvAWcBWwFZAe8B + ZwFbAVkB7wFnAlkB7wFnAWQBWQHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvAwcB + CQMqAT8DRQF8A1kBuwNjAd8DaAH0A4AB/gOBAf8DgQH/A4EB/wOAAf4DaAH0A2MB3wNaAboDRAF6AycB + OjgAAzMBUQNuAfUIAAM3AVoDWAG4A2MB3wJjAV0B3wFiAl0B3wNdAd8DXQHfAWECXQHfA2MB3wNjAd8D + VQGsAzABSwgAA/gB/wG5AZUBPAH/AYMBfQFuAf8BhAF9AWwB/wGqAYQBJwH/AawBewEAAf8BzAG8AZQB + /wN+Af8DfgH/A34B/wN+Af8DfgH/A34B/wN+Af8DfgH/A44B/wNDAXUDXQHMA3wB+AOBAf8DgQH/A4EB + /wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A3wB+ANUAag4AAMSARgDPwFtBAADOwFiA10B + xQF9AXUBaAH0AZ8BZQExAf8BlwFTARcB/wGWAUsBCQH/AZMBRgEBAf8BjAFDAQMB/wF9AUABCwH/AWsB + QAEaAf8BbgFQATYB/wFsAWkBaAHwA1oBtwM0AVQEAAT/AZcBiwFtAf8CgQGAAf8BggGBAYAB/wGYAYgB + YAH/AcoBkAEAAf8B3QHMAZ8B/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A5MB/wNqAe0D + fQH6A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wNVAa80 + AANfAdMDPQFnBAADNQFVA10BxwGHAXABWgH1AbgBZQEbAf8BuQFYAQIB/wHJAV8BAAH/AdgBZQEAAf8B + 3AFnAQAB/wHWAWQBAAH/AcMBXAEAAf8BogFMAQAB/wF8ATsBAwH/AW4BRgEjAf8BagJoAfADWgG3AzAB + SgT/AYYBhAF9Af8DgQH/A4EB/wGHAYMBegH/Ac8BlAEAAf8B3gHMAZ8B/wPgAf8D4AH/A+AB/wPgAf8D + 4AH/A+AB/wPgAf8D4AH/A7wB/wNjAd8DbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D + gQH/A4EB/wOBAf8DgQH/A4EB/wNVAa80AANaAcIDNAFTBAADXAHEAaQBhQFeAfgB1AFxARgB/wHXAWUB + AAH/AeUBbAEAAf8B8gFyAQAB/wH6AXUBAAH/AfwBdgEAAf8B+gF2AQAB/wHzAXIBAAH/AeIBawEAAf8B + vQFZAQAB/wGHAUABAAH/AXEBSAEjAf8BbAFpAWgB8ANWAasE/wGLAYYBegH/A4EB/wOBAf8BjgGGAXEB + /wHPAZQBAAH/Ad4BzAGfIf8DygH/AzYBWANbAcADbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB + /wOBAf8DgQH/A4EB/wOBAf8DaAH0A1IBpBAAAw0BEQM/AWwDUwGnAVwCWQG+AVgCVgGzAUgCRwGDAyEB + MAQAA28B8wM6AWAIAAH+Ad0BwQH/Ae0BgAEgAf8B7QFxAQIB/wHzAXMBAAH/AfoBdgEAAf8B/gF4AQAC + /wF7AQgC/wGIAScC/wGiAVMB/wH+AYEBFwH/AfwBeAEEAf8B7AFvAQAB/wHBAVsBAAH/AYYBQQEDAf8B + eAFWATYB/wNjAd8E/wGsAZYBYAH/AYMBggF/Af8BhQGCAX0B/wGzAZMBRAH/Ac8BlAEAAf8B3gHMAZ8B + /wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A6gB/wMCAQMDGgEjAzgBXANUAagDYgHXA3AB + 8QOAAf4DgQH/A4EB/wOBAf8DgQH9A2gB8ANhAdQDUwGlAzYBWQMYASAIAAMaASQDUgGgAmMBSAH2AaIB + cwEAAf8BrgF8AQAB/wGwAX0BAAH/AagBeAEAAf8BlQFqAQAB/wKAAS0B/gFcAlkBxgNXAbUDFgEeCAAB + /wGyAW8B/wH9AYABEQH/AfwBdwEBAf8B/QF3AQAC/wF4AQAC/wF/AQ8C/wGSATsC/wGzAYMC/wHqAeAC + /wGQAT0C/wF7AQoB/wH8AXcBAAH/AeUBbAEAAf8BsQFUAQAB/wGEAUsBGgH/A2MB3wT/AdkBqgE3Af8B + vgGYATgB/wHAAZgBNgH/AdwBogEUAf8BzwGUAQAB/wHeAcwBnwH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D + gQH/A4EB/wOBAf8DkwH/RAADIAEtAmMBWgHpAb8BiAEAAf8BzQGVAQoB/wGwAYgBJwH/AXMBZAE/Af8B + TQFLAUcB/wFOAUsBQgH/AWYBVwExAf8BmgF0ARcB/wGkAXYBAwH/AXABTwEAAf8DQwF2BAEEAAH/AZoB + QgL/AYMBFQH/Af4BegEEAv8BeAEAAv8BeAEAAv8BlQE/Av8BygGuAv8B2gHGAv8B7QHlAv8BlgFJAv8B + fAENAf8B/gF4AQAB/wH0AXMBAAH/AdABYgEAAf8BmgFOAQoB/wFjAl0B3wT/AeEBrgExAf8BvQGXATsB + /wHAAZgBNQH/AeMBpQEKAf8BzwGUAQAB/wHeAcwBnwH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB + /wPAAf8DrwH/CAADAgEDAwgBCgMhAS8DMQFOAz0BaANDAXYDRAF6A0MBdQM9AWcDMQFNAyABLgMHAQkE + AggAAmMBWgHpAdkBmgEAAf8B2gGjARwB/wKOAYwB/wOKAf8DlwH/A5sB/wORAf8DdAH/A0gB/wFDAUIB + PwH/AbUBgwEHAf8BegFXAQAB/wM2AVgEAAH/AZUBNwL/AYkBHwL/AX0BCAL/AXgBAAL/AXgBAAL/AagB + XAL/AeABzQL/AaEBZgL/AdgBxQL/AbkBlAL/AYcBIwL/AXgBAAH/AfsBdgEAAf8B4gFqAQAB/wGvAVQB + AwH/AWMCXQHfBP8BuwGdAVMB/wGIAYQBeQH/AYwBhQF0Af8BxAGZATAB/wHPAZQBAAH/Ad4BzAGfIf8D + ygH/BAADEwEaAzkBXQNZAbwDZAHbA2oB7QNjAfYDXwH7A4EB/QNfAfsDYwH2A2UB7ANjAdoDWgG6AzgB + XAMTARoDQwF2AekBpwECAf8B6QGrARIB/wHQAcoBuwH/A6wB/wNdAf8DTAH/A0sB/wNEAf8DDwH/A7MB + /wNmAf8BVAFMAToB/wGuAX0BBAH/A10BzAQAAf8BoAFJAv8BkgExAv8BgQERAv8BeQEDAv8BeAEAAv8B + qAFcAv8B4AHNAv8BoQFmAv8B2AHFAv8BwAGfAv8BiQEnAv8BeAEAAf8B/gF4AQAB/wHsAW8BAAH/Ab8B + WgECAf8BYwJdAd8E/wGUAYoBcwH/A4EB/wOBAf8BmgGKAWMB/wHPAZQBAAH/Ad4BzAGfAf8D0AH/A9AB + /wPQAf8D0AH/A9AB/wPQAf8D0AH/A9AB/wO1Af8DGgEkA1YBrgNoAfQDgQH/A4EB/wOBAf8DgQH/A4EB + /wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wNrAfIDUgGhAmoBYQHmAe0BrQEQAf8B9AHQAXYB/wP6Af8D + +gH/A30B/wN/Af8DgAH/A4AB/wN+Af8DhAH/A7sB/wNqAf8BqAGAARwB/wJjAUgB9gQAAf8BswFvAv8B + ngFIAv8BiAEeAv8BfAEHAv8BeAEAAv8BmAFDAv8BzgG0Av8B1wHAAv8B6gHgAv8BnQFXAv8BfgERAv8B + eAEAAv8BeAEAAf8B8AFxAQAB/wHLAWQBCQH/AWMBYQFdAd8E/wGGAYMBfgH/A4EB/wOBAf8BhgGDAXsB + /wHPAZQBAAH/Ad4BzAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8DVwGyA2UB + 5wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvA2IB + 7gHvAbQBIQH/AfcB3AGXCf8DkQH/A4gB/wOHAf8DhwH/A4EB/wNXAf8D5gH/A6MB/wG2AZEBNgH/AmoB + QQH5BAAB/wHMAZ8C/wGsAWMC/wGTATMC/wGBAREC/wF5AQIC/wGCARYC/wGaAUsC/wGuAXgC/wGlAVcC + /wGBARcC/wF5AQQC/wF4AQAC/wF4AQAB/wHwAXEBAAH/AdUBcQEXAf8CYwFdAd8E/wGLAYYBeQH/A4EB + /wOBAf8BjgGGAXEB/wHPAZQBAAH/Ad4BzAGfAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB + /wOhAf8DbwHzA18B+wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB + /wOBAf8DVQGvA0sBjQHwAb4BPwH/AfQBzQFsIf8D+wH/A9AB/wHXAacBMQH/AmEBXQHRBAAB/wHpAdUC + /wG8AYEC/wGkAVQC/wGOASoC/wF/AQ0C/wF5AQIC/wF7AQkC/wGCAR0C/wF4AQAC/wF4AQAC/wF4AQEC + /wF6AQQC/wF6AQMB/wHzAXQBAwH/AeIBhAEyAf8DYwHfBP8BpwGUAWcB/wGDAYIBfwH/AYUBgwF+Af8B + sAGUAU4B/wHTAZcBAgH/AeABzgGfAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPAAf8D + ZAHbA2gB9AOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D + VQGvAwcBCQNiAe4B8QG8ATsB/wH6AeoBwgH/A9wB/wN3Af8DaAH/A2gB/wNoAf8DMgn/AfIB3QGpAf8B + 6gGpAQgB/wM+AWoEAANeAdIBtQGeAYwB+QH/AbsBfQL/AaMBUgL/AZABLAL/AYIBEwL/AX0BCAL/AXoB + BAL/AXkBAgL/AXoBBAL/AX0BCQL/AYABDwL/AX8BDQH/AfgBhgEgAf8BjwF5AWgB9ANYAbgE/wHXAbEB + UgH/AZoBjwF0Af8BoAGSAW0B/wHgAa8BNwH/AecBqQEQAf8B6wHVAaAB/wOBAf8DgQH/A4EB/wOBAf8D + gQH/A4EB/wOBAf8DgQH/A5MB/wM8AWQDXwHJA30B+gOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D + gQH/A4EB/wOBAf8DgQH/A30B+gNVAaoEAAMzAVEDaAHwAfMBxgFYAf8B+gHnAbgW/wH+AfsB/wH5AeIB + qgH/Ae8BuAEtAf8DTgGWBAIEAAM8AWYDYwHVAbABnAGKAfgB/wG+AYUC/wGqAV8C/wGZAT4C/wGNAScC + /wGGARoC/wGDARUC/wGFARkC/wGKASIC/wGNASgC/wGTATMB/wGYAXwBaAH1A10BxQM2AVkE/wH0Ac0B + bAH/AfQBywFmAf8B9AHLAWUB/wH0AcsBZQH/AfEBwQFJAf8B+QHjAawB/wOJAf8DiQH/A4kB/wOJAf8D + iQH/A4kB/wOJAf8DiQH/A5oB/wMGAQgDMQFMA1ABmwNlAewDfQH6A4EB/wOBAf8DgQH/A4EB/wOBAf8D + gQH/A4EB/wN9AfoDagHtA1ABmwMvAUkIAAMiATEDXwHJAn0BZwH6AfMBygFlAf8B+QHhAaYB/wH7Ae0B + zAH/AfsB7AHIAf8B+AHdAZsB/wGYAYABfgH+AmUBXgHiAz0BaAQBDAADQgFyA2MB1QG1AaUBkQH5Af8B + yQGZAv8BvAF/Av8BrgFmAv8BpAFTAv8BnwFKAv8BnwFLAv8BowFRAv8BpwFYAf8BsAGVAXwB+ANdAccD + OwFiBABA/wgAAwUBBgMSARcDOgFgA1EBnwNfAdMDZwHvA2MB9gNiAe4DXgHSA1EBngM5AV8DEQEWAwUB + BhQAAw8BEwNHAYIDZAHbAn4BbwH8A2cB6gNUAagDKAE7HAADPAFlA14B0gH/Ae8B4AL/AdwBvAL/Ac0B + nwL/AcEBigL/AbsBfwL/Ab8BhgL/Ac0BoQL/AekB1gH/A1wBxAM1AVUIAAFCAU0BPgcAAT4DAAEoAwAB + QAMAASADAAEBAQABAQYAAQEWAAP/hQAB/wH8AcABAwQAAf8B/AGAAQEEAAH/AfkGAAH/AfkGAAHwARMG + AAHAAQMEAAL/AYABAQQAAcABAQGAAQEEAAGAAgABAQcAAQEHAAEBBwABAQcAAQEGAAGAAQEGAAHAAQMB + gAEBAgABwAEBAfABHwHAAQML diff --git a/qtc-net-client-2/Forms/StockMarketGame.Designer.cs b/qtc-net-client-2/Forms/StockMarketGame.Designer.cs new file mode 100644 index 0000000..7acccdf --- /dev/null +++ b/qtc-net-client-2/Forms/StockMarketGame.Designer.cs @@ -0,0 +1,206 @@ +namespace qtc_net_client_2.Forms +{ + partial class StockMarketGame + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + pStockManagement = new Panel(); + nudStockBuySellAmount = new NumericUpDown(); + btnSell = new Button(); + btnBuy = new Button(); + lblStockCount = new Label(); + pMarketStatus = new Panel(); + lblCurrentStockPrice = new Label(); + lblMarketStatus = new Label(); + pbDollarSignRight = new PictureBox(); + pbDollarSignLeft = new PictureBox(); + btnRefresh = new Button(); + pStockManagement.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)nudStockBuySellAmount).BeginInit(); + pMarketStatus.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pbDollarSignRight).BeginInit(); + ((System.ComponentModel.ISupportInitialize)pbDollarSignLeft).BeginInit(); + SuspendLayout(); + // + // pStockManagement + // + pStockManagement.Controls.Add(nudStockBuySellAmount); + pStockManagement.Controls.Add(btnSell); + pStockManagement.Controls.Add(btnBuy); + pStockManagement.Controls.Add(lblStockCount); + pStockManagement.Location = new Point(242, 108); + pStockManagement.Name = "pStockManagement"; + pStockManagement.Size = new Size(135, 81); + pStockManagement.TabIndex = 3; + // + // nudStockBuySellAmount + // + nudStockBuySellAmount.Enabled = false; + nudStockBuySellAmount.Location = new Point(48, 7); + nudStockBuySellAmount.Name = "nudStockBuySellAmount"; + nudStockBuySellAmount.Size = new Size(42, 23); + nudStockBuySellAmount.TabIndex = 9; + // + // btnSell + // + btnSell.Enabled = false; + btnSell.ForeColor = Color.Black; + btnSell.Location = new Point(88, 52); + btnSell.Name = "btnSell"; + btnSell.Size = new Size(39, 23); + btnSell.TabIndex = 8; + btnSell.Text = "Sell"; + btnSell.UseVisualStyleBackColor = true; + btnSell.Click += btnSell_Click; + // + // btnBuy + // + btnBuy.Enabled = false; + btnBuy.ForeColor = Color.Black; + btnBuy.Location = new Point(9, 52); + btnBuy.Name = "btnBuy"; + btnBuy.Size = new Size(39, 23); + btnBuy.TabIndex = 7; + btnBuy.Text = "Buy"; + btnBuy.UseVisualStyleBackColor = true; + btnBuy.Click += btnBuy_Click; + // + // lblStockCount + // + lblStockCount.Font = new Font("Segoe UI", 7F, FontStyle.Bold); + lblStockCount.ImageAlign = ContentAlignment.MiddleRight; + lblStockCount.Location = new Point(11, 34); + lblStockCount.Name = "lblStockCount"; + lblStockCount.Size = new Size(115, 12); + lblStockCount.TabIndex = 6; + lblStockCount.Text = "Your Stock Count - 999"; + lblStockCount.TextAlign = ContentAlignment.MiddleCenter; + // + // pMarketStatus + // + pMarketStatus.Controls.Add(lblCurrentStockPrice); + pMarketStatus.Controls.Add(lblMarketStatus); + pMarketStatus.Controls.Add(pbDollarSignRight); + pMarketStatus.Controls.Add(pbDollarSignLeft); + pMarketStatus.Location = new Point(9, 7); + pMarketStatus.Name = "pMarketStatus"; + pMarketStatus.Size = new Size(586, 100); + pMarketStatus.TabIndex = 4; + // + // lblCurrentStockPrice + // + lblCurrentStockPrice.Font = new Font("Segoe UI", 9F, FontStyle.Bold); + lblCurrentStockPrice.ForeColor = Color.Black; + lblCurrentStockPrice.Location = new Point(194, 73); + lblCurrentStockPrice.Name = "lblCurrentStockPrice"; + lblCurrentStockPrice.Size = new Size(199, 15); + lblCurrentStockPrice.TabIndex = 5; + lblCurrentStockPrice.Text = "Current Price Per Stock Is 999 Q's"; + lblCurrentStockPrice.TextAlign = ContentAlignment.MiddleCenter; + // + // lblMarketStatus + // + lblMarketStatus.Font = new Font("Segoe UI", 35F, FontStyle.Bold | FontStyle.Italic); + lblMarketStatus.Location = new Point(90, 4); + lblMarketStatus.Name = "lblMarketStatus"; + lblMarketStatus.Size = new Size(408, 62); + lblMarketStatus.TabIndex = 5; + lblMarketStatus.Text = "MARKET_STATUS"; + lblMarketStatus.TextAlign = ContentAlignment.MiddleCenter; + // + // pbDollarSignRight + // + pbDollarSignRight.Image = Properties.Resources.dollar_money; + pbDollarSignRight.Location = new Point(498, 3); + pbDollarSignRight.Name = "pbDollarSignRight"; + pbDollarSignRight.Size = new Size(83, 94); + pbDollarSignRight.SizeMode = PictureBoxSizeMode.Zoom; + pbDollarSignRight.TabIndex = 4; + pbDollarSignRight.TabStop = false; + // + // pbDollarSignLeft + // + pbDollarSignLeft.Image = Properties.Resources.dollar_money; + pbDollarSignLeft.Location = new Point(6, 3); + pbDollarSignLeft.Name = "pbDollarSignLeft"; + pbDollarSignLeft.Size = new Size(83, 94); + pbDollarSignLeft.SizeMode = PictureBoxSizeMode.Zoom; + pbDollarSignLeft.TabIndex = 3; + pbDollarSignLeft.TabStop = false; + // + // btnRefresh + // + btnRefresh.Enabled = false; + btnRefresh.ForeColor = Color.Black; + btnRefresh.Location = new Point(283, 193); + btnRefresh.Name = "btnRefresh"; + btnRefresh.Size = new Size(56, 23); + btnRefresh.TabIndex = 10; + btnRefresh.Text = "Refresh"; + btnRefresh.UseVisualStyleBackColor = true; + btnRefresh.Click += btnRefresh_Click; + // + // StockMarketGame + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.DodgerBlue; + ClientSize = new Size(606, 227); + Controls.Add(btnRefresh); + Controls.Add(pMarketStatus); + Controls.Add(pStockManagement); + ForeColor = Color.White; + FormBorderStyle = FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + Name = "StockMarketGame"; + StartPosition = FormStartPosition.CenterScreen; + Text = "QtC.NET qGame - Stock Market"; + Load += StockMarketGame_Load; + pStockManagement.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)nudStockBuySellAmount).EndInit(); + pMarketStatus.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)pbDollarSignRight).EndInit(); + ((System.ComponentModel.ISupportInitialize)pbDollarSignLeft).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel pStockManagement; + private Button btnSell; + private Button btnBuy; + private Label lblStockCount; + private Panel pMarketStatus; + private Label lblCurrentStockPrice; + private Label lblMarketStatus; + private PictureBox pbDollarSignRight; + private PictureBox pbDollarSignLeft; + private Button btnRefresh; + private NumericUpDown nudStockBuySellAmount; + } +} \ No newline at end of file diff --git a/qtc-net-client-2/Forms/StockMarketGame.cs b/qtc-net-client-2/Forms/StockMarketGame.cs new file mode 100644 index 0000000..0f2cc1d --- /dev/null +++ b/qtc-net-client-2/Forms/StockMarketGame.cs @@ -0,0 +1,177 @@ +using QtCNETAPI.Services.ApiService; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace qtc_net_client_2.Forms +{ + public partial class StockMarketGame : Form + { + private IApiService _apiService; + private int StockPrice = 0; + public StockMarketGame(IApiService apiService) + { + _apiService = apiService; + InitializeComponent(); + } + + private async void StockMarketGame_Load(object sender, EventArgs e) => await InitializeStockMarketGame(); + private async void btnRefresh_Click(object sender, EventArgs e) => await InitializeStockMarketGame(); + + private async void btnBuy_Click(object sender, EventArgs e) + { + if (nudStockBuySellAmount.Value > 0) + { + nudStockBuySellAmount.Enabled = false; + btnBuy.Enabled = false; + btnSell.Enabled = false; + btnRefresh.Enabled = false; + + // buy stock + var amountToBuy = int.Parse(nudStockBuySellAmount.Value.ToString()); + var result = await _apiService.BuyStock(amountToBuy); + + if (result != null && result.Success && result.Data != null) + { + lblStockCount.Text = $"Your Stock Count - {result.Data.StockAmount}"; + + _apiService.CurrentUser.StockAmount = result.Data.StockAmount; + _apiService.CurrentUser.CurrencyAmount = result.Data.CurrencyAmount; + + Main? mainWindow = (Main?)Application.OpenForms[0]; + if (mainWindow != null) + { + if (mainWindow.InvokeRequired) + { + mainWindow.Invoke(mainWindow.RefreshCurrencyCounter); + } + else + { + mainWindow.RefreshCurrencyCounter(); + } + } + + nudStockBuySellAmount.Enabled = true; + nudStockBuySellAmount.Value = 0; + btnBuy.Enabled = true; + btnSell.Enabled = true; + btnRefresh.Enabled = true; + } + else + { + MessageBox.Show("Buy Failed. Either You Don't Have Enough Q's Or A Server Side Error Occured.", "Oops.", MessageBoxButtons.OK, MessageBoxIcon.Error); + nudStockBuySellAmount.Enabled = true; + nudStockBuySellAmount.Value = 0; + btnBuy.Enabled = true; + btnSell.Enabled = true; + btnRefresh.Enabled = true; + } + } + } + + private async void btnSell_Click(object sender, EventArgs e) + { + if(nudStockBuySellAmount.Value > 0) + { + nudStockBuySellAmount.Enabled = false; + btnBuy.Enabled = false; + btnSell.Enabled = false; + btnRefresh.Enabled = false; + + // sell stock + var amountToSell = int.Parse(nudStockBuySellAmount.Value.ToString()); + var result = await _apiService.SellStock(amountToSell); + + if (result != null && result.Success && result.Data != null) + { + lblStockCount.Text = $"Your Stock Count - {result.Data.StockAmount}"; + + _apiService.CurrentUser.StockAmount = result.Data.StockAmount; + _apiService.CurrentUser.CurrencyAmount = result.Data.CurrencyAmount; + + Main? mainWindow = (Main?)Application.OpenForms[0]; + if (mainWindow != null) + { + if (mainWindow.InvokeRequired) + { + mainWindow.Invoke(mainWindow.RefreshCurrencyCounter); + } + else + { + mainWindow.RefreshCurrencyCounter(); + } + } + + nudStockBuySellAmount.Enabled = true; + nudStockBuySellAmount.Value = 0; + btnBuy.Enabled = true; + btnSell.Enabled = true; + btnRefresh.Enabled = true; + } else + { + MessageBox.Show("Sell Failed. Either You Don't Have Enough Stock Or A Server Side Error Occured.", "Oops.", MessageBoxButtons.OK, MessageBoxIcon.Error); + nudStockBuySellAmount.Enabled = true; + nudStockBuySellAmount.Value = 0; + btnBuy.Enabled = true; + btnSell.Enabled = true; + btnRefresh.Enabled = true; + } + } + } + + private async Task InitializeStockMarketGame() + { + var currentStockPriceResult = await _apiService.GetCurrentStockPrice(); + + if (currentStockPriceResult != null && currentStockPriceResult.Success) + { + lblCurrentStockPrice.Text = $"Current Price Per Stock Is {currentStockPriceResult.Data} Q's"; + lblStockCount.Text = $"Your Stock Count - {_apiService.CurrentUser.StockAmount}"; + + switch (currentStockPriceResult.Data) + { + case < 49: + lblMarketStatus.Text = "not good cheif :("; + lblMarketStatus.ForeColor = Color.Red; + break; + case < 99: + lblMarketStatus.Text = "its aight :/"; + lblMarketStatus.ForeColor = Color.DarkGreen; + break; + case < 149: + lblMarketStatus.Text = "its good :)"; + lblMarketStatus.ForeColor = Color.Green; + break; + case < 199: + lblMarketStatus.Text = "very good :D"; + lblMarketStatus.ForeColor = Color.Blue; + break; + case > 200: + lblMarketStatus.Text = "$ AWESOME $"; + lblMarketStatus.ForeColor = Color.LightGreen; + break; + default: + lblMarketStatus.Text = "Cannot Determine"; + lblMarketStatus.ForeColor = Color.White; + break; + } + + nudStockBuySellAmount.Enabled = true; + btnBuy.Enabled = true; + btnSell.Enabled = true; + btnRefresh.Enabled = true; + } + else + { + MessageBox.Show("The Stock Market Endpoint Could Not Be Reached. Please Check Your Internet Connection", "Uh Oh.", MessageBoxButtons.OK, MessageBoxIcon.Error); + Close(); + } + } + } +} diff --git a/qtc-net-client-2/Forms/StockMarketGame.resx b/qtc-net-client-2/Forms/StockMarketGame.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/qtc-net-client-2/Forms/StockMarketGame.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/qtc-net-client-2/Icons/UserIcon.png b/qtc-net-client-2/Icons/UserIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbab2a0bd3a5e03089b716b5eb304f57400fe41 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bK!3HEJ6o{M!Qk(@Ik;Oo9VGw3ym^DWND5#L^ z5#-CjP^HSi(9q1l@bf>Ae#yX4YQVtoDuIE)Y6b&?c>bjLqi#U8k33x*Ln>}fxoGRf z;waGe@OTl zy3)k8__BVDqj*Tl;+0aJKISa3x(K#nv z_D}Hm6wayBRD7PF@VETr*|(>Ay4bs7u0qMf_D8JOEU}15w!2o*`u&9Jwv7$5AKiXy z{zbXh_OxU`%})mYA4fDk32uI~SjV85yF^Ovb%Jo{p}6KBv-1vR<(*&q^s-DP_jlbp qiCl%8?G-&!dnH|S8;-7LWcYnqH)guQCO)8V89ZJ6T-G@yGywq4R)ets literal 0 HcmV?d00001 diff --git a/qtc-net-client-2/Properties/Resources.Designer.cs b/qtc-net-client-2/Properties/Resources.Designer.cs index 14c68d2..e52c8f2 100644 --- a/qtc-net-client-2/Properties/Resources.Designer.cs +++ b/qtc-net-client-2/Properties/Resources.Designer.cs @@ -81,7 +81,7 @@ namespace qtc_net_client_2.Properties { } /// - /// Looks up a localized string similar to 3.4.1. + /// Looks up a localized string similar to 4.0. /// internal static string AssemblyVersion { get { @@ -149,6 +149,16 @@ namespace qtc_net_client_2.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap dollar_money { + get { + object obj = ResourceManager.GetObject("dollar-money", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/qtc-net-client-2/Properties/Resources.resx b/qtc-net-client-2/Properties/Resources.resx index 966721b..2ec2db4 100644 --- a/qtc-net-client-2/Properties/Resources.resx +++ b/qtc-net-client-2/Properties/Resources.resx @@ -124,6 +124,9 @@ ..\Icons\SendIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Anims\left-horn-animated.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\DefaultPfp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -157,6 +160,9 @@ ..\Icons\MessageIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + 4.0 + ..\Resources\LoginBanner.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -166,10 +172,7 @@ ..\Icons\AcceptContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Anims\left-horn-animated.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - 3.4.1 + + ..\Anims\dollar-money.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file