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 0000000..66cd9dd Binary files /dev/null and b/qtc-net-client-2/Anims/dollar-money.gif differ diff --git a/qtc-net-client-2/Forms/Chat.Designer.cs b/qtc-net-client-2/Forms/Chat.Designer.cs index eefb77d..503e031 100644 --- a/qtc-net-client-2/Forms/Chat.Designer.cs +++ b/qtc-net-client-2/Forms/Chat.Designer.cs @@ -32,6 +32,7 @@ rtxtChatbox = new RichTextBox(); btnSend = new Button(); rtxtChat = new RichTextBox(); + lblRoomName = new Label(); SuspendLayout(); // // rtxtChatbox @@ -58,19 +59,32 @@ // rtxtChat // rtxtChat.HideSelection = false; - rtxtChat.Location = new Point(12, 12); + rtxtChat.Location = new Point(12, 43); rtxtChat.Name = "rtxtChat"; rtxtChat.ReadOnly = true; - rtxtChat.Size = new Size(593, 250); + rtxtChat.Size = new Size(593, 219); rtxtChat.TabIndex = 3; rtxtChat.Text = ""; // + // lblRoomName + // + lblRoomName.AutoSize = true; + lblRoomName.Font = new Font("Segoe UI", 25F, FontStyle.Bold | FontStyle.Italic); + lblRoomName.ForeColor = Color.White; + lblRoomName.Location = new Point(6, -4); + lblRoomName.Margin = new Padding(4, 0, 4, 0); + lblRoomName.Name = "lblRoomName"; + lblRoomName.Size = new Size(113, 46); + lblRoomName.TabIndex = 8; + lblRoomName.Text = "Room"; + // // Chat // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackColor = Color.DodgerBlue; ClientSize = new Size(617, 334); + Controls.Add(lblRoomName); Controls.Add(rtxtChat); Controls.Add(btnSend); Controls.Add(rtxtChatbox); @@ -83,11 +97,13 @@ FormClosing += frmChat_FormClosing; Load += frmChat_Load; ResumeLayout(false); + PerformLayout(); } #endregion private RichTextBox rtxtChatbox; private Button btnSend; private RichTextBox rtxtChat; + private Label lblRoomName; } } \ No newline at end of file diff --git a/qtc-net-client-2/Forms/Chat.cs b/qtc-net-client-2/Forms/Chat.cs index 85fad7c..22aa425 100644 --- a/qtc-net-client-2/Forms/Chat.cs +++ b/qtc-net-client-2/Forms/Chat.cs @@ -30,16 +30,16 @@ namespace qtc_net_client_2.Forms private void frmChat_Load(object sender, EventArgs e) { // subscribe to server message event - _gatewayService.OnServerMessageReceived += _gatewayService_OnServerMessageReceived; + _gatewayService.OnRoomMessageReceived += _gatewayService_OnServerMessageReceived; - if (_gatewayService.CurrentRoom != null) Text = $"QtC.NET Client - Chat Room - {_gatewayService.CurrentRoom.Name}"; - else if (_gatewayService.InLobby) Text = $"QtC.NET Client - Chat Room - Lobby"; + if (_gatewayService.CurrentRoom != null) { Text = $"QtC.NET Client - Chat Room - {_gatewayService.CurrentRoom.Name}"; lblRoomName.Text = _gatewayService.CurrentRoom.Name; } + else if (_gatewayService.InLobby) { Text = $"QtC.NET Client - Chat Room - Lobby"; lblRoomName.Text = "Lobby"; } } private async void frmChat_FormClosing(object sender, FormClosingEventArgs e) { // unsubscribe from server message event - _gatewayService.OnServerMessageReceived -= _gatewayService_OnServerMessageReceived; + _gatewayService.OnRoomMessageReceived -= _gatewayService_OnServerMessageReceived; if (_gatewayService.CurrentRoom != null || _gatewayService.InLobby) { diff --git a/qtc-net-client-2/Forms/DirectMessage.Designer.cs b/qtc-net-client-2/Forms/DirectMessage.Designer.cs index cf85711..4bfdd60 100644 --- a/qtc-net-client-2/Forms/DirectMessage.Designer.cs +++ b/qtc-net-client-2/Forms/DirectMessage.Designer.cs @@ -38,11 +38,11 @@ // rtxtChat // rtxtChat.HideSelection = false; - rtxtChat.Location = new Point(12, 56); + rtxtChat.Location = new Point(12, 48); rtxtChat.Margin = new Padding(4, 3, 4, 3); rtxtChat.Name = "rtxtChat"; rtxtChat.ReadOnly = true; - rtxtChat.Size = new Size(593, 317); + rtxtChat.Size = new Size(593, 325); rtxtChat.TabIndex = 6; rtxtChat.Text = ""; // @@ -74,7 +74,7 @@ // lblUsername.AutoSize = true; lblUsername.Font = new Font("Segoe UI", 25F, FontStyle.Bold | FontStyle.Italic); - lblUsername.Location = new Point(6, 7); + lblUsername.Location = new Point(6, 0); lblUsername.Margin = new Padding(4, 0, 4, 0); lblUsername.Name = "lblUsername"; lblUsername.Size = new Size(181, 46); @@ -86,7 +86,7 @@ AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackColor = Color.DodgerBlue; - ClientSize = new Size(618, 450); + ClientSize = new Size(618, 443); Controls.Add(lblUsername); Controls.Add(rtxtChat); Controls.Add(btnSend); diff --git a/qtc-net-client-2/Forms/DirectMessage.cs b/qtc-net-client-2/Forms/DirectMessage.cs index 8ef7e65..8ddd7f5 100644 --- a/qtc-net-client-2/Forms/DirectMessage.cs +++ b/qtc-net-client-2/Forms/DirectMessage.cs @@ -51,14 +51,14 @@ namespace qtc_net_client_2.Forms private async void btnSend_Click(object sender, EventArgs e) { - if (InvokeRequired) + if (rtxtChatbox.InvokeRequired) { - await Invoke(async delegate () + await rtxtChatbox.Invoke(async delegate () { if (!string.IsNullOrEmpty(rtxtChatbox.Text)) { await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id }); - Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}\n"); + Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}"); rtxtChatbox.Clear(); AudioService.PlaySoundEffect("sndSendClick"); } @@ -69,8 +69,8 @@ namespace qtc_net_client_2.Forms if (!string.IsNullOrEmpty(rtxtChatbox.Text)) { await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id }); - BeginInvoke(delegate () { Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}\n"); }); - BeginInvoke(delegate () { rtxtChatbox.Clear(); }); + Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}"); + rtxtChatbox.Clear(); AudioService.PlaySoundEffect("sndSendClick"); } } diff --git a/qtc-net-client-2/Forms/Main.Designer.cs b/qtc-net-client-2/Forms/Main.Designer.cs index faf4f2e..e6a824f 100644 --- a/qtc-net-client-2/Forms/Main.Designer.cs +++ b/qtc-net-client-2/Forms/Main.Designer.cs @@ -29,52 +29,67 @@ private void InitializeComponent() { components = new System.ComponentModel.Container(); + ListViewItem listViewItem1 = new ListViewItem("Stock Market", 0); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); tbcMain = new TabControl(); tbpContacts = new TabPage(); lvContacts = new ListView(); ilProfilePics = new ImageList(components); tbpRooms = new TabPage(); + btnAddRoom = new Button(); lbRooms = new ListBox(); tbpOnlineUsers = new TabPage(); lbOnlineUsers = new ListBox(); + tbpUserDirectory = new TabPage(); + lbUserDirectory = new ListBox(); + tbpGames = new TabPage(); + lvGames = new ListView(); + ilGames = new ImageList(components); ilTabIcons = new ImageList(components); - pbUserPfp = new PictureBox(); ctxmChangeStatus = new ContextMenuStrip(components); onlineToolStripMenuItem = new ToolStripMenuItem(); awayToolStripMenuItem = new ToolStripMenuItem(); doNotDisturbToolStripMenuItem = new ToolStripMenuItem(); invisibleToolStripMenuItem = new ToolStripMenuItem(); - lblWelcome = new Label(); - llblSignIn = new LinkLabel(); - llblSignOut = new LinkLabel(); - llblEditProfile = new LinkLabel(); lblRequestNotif = new Label(); niMain = new NotifyIcon(components); - btnAddRoom = new Button(); + llblClaimSpin = new LinkLabel(); + pCurrencyArea = new Panel(); pbCurrencyIcon = new PictureBox(); lblCurrencyAmount = new Label(); - llblClaimSpin = new LinkLabel(); + pCurrentUser = new Panel(); + llblEditProfile = new LinkLabel(); + llblSignOut = new LinkLabel(); + llblSignIn = new LinkLabel(); + lblWelcome = new Label(); + pbUserPfp = new PictureBox(); tbcMain.SuspendLayout(); tbpContacts.SuspendLayout(); tbpRooms.SuspendLayout(); tbpOnlineUsers.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)pbUserPfp).BeginInit(); + tbpUserDirectory.SuspendLayout(); + tbpGames.SuspendLayout(); ctxmChangeStatus.SuspendLayout(); + pCurrencyArea.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).BeginInit(); + pCurrentUser.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pbUserPfp).BeginInit(); SuspendLayout(); // // tbcMain // + tbcMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; tbcMain.Controls.Add(tbpContacts); tbcMain.Controls.Add(tbpRooms); tbcMain.Controls.Add(tbpOnlineUsers); + tbcMain.Controls.Add(tbpUserDirectory); + tbcMain.Controls.Add(tbpGames); tbcMain.Enabled = false; tbcMain.ImageList = ilTabIcons; tbcMain.Location = new Point(12, 66); tbcMain.Name = "tbcMain"; tbcMain.SelectedIndex = 0; - tbcMain.Size = new Size(258, 535); + tbcMain.Size = new Size(439, 535); tbcMain.TabIndex = 0; // // tbpContacts @@ -84,18 +99,19 @@ tbpContacts.Location = new Point(4, 24); tbpContacts.Name = "tbpContacts"; tbpContacts.Padding = new Padding(3); - tbpContacts.Size = new Size(250, 507); + tbpContacts.Size = new Size(431, 507); tbpContacts.TabIndex = 0; tbpContacts.Text = "Contacts"; tbpContacts.UseVisualStyleBackColor = true; // // lvContacts // + lvContacts.Anchor = AnchorStyles.Left | AnchorStyles.Right; lvContacts.LargeImageList = ilProfilePics; lvContacts.Location = new Point(0, 0); lvContacts.MultiSelect = false; lvContacts.Name = "lvContacts"; - lvContacts.Size = new Size(250, 507); + lvContacts.Size = new Size(431, 514); lvContacts.SmallImageList = ilProfilePics; lvContacts.TabIndex = 1; lvContacts.UseCompatibleStateImageBehavior = false; @@ -110,68 +126,126 @@ // // tbpRooms // + tbpRooms.Controls.Add(btnAddRoom); tbpRooms.Controls.Add(lbRooms); tbpRooms.ImageKey = "RoomsChatIcon.png"; tbpRooms.Location = new Point(4, 24); tbpRooms.Name = "tbpRooms"; tbpRooms.Padding = new Padding(3); - tbpRooms.Size = new Size(250, 507); + tbpRooms.Size = new Size(431, 507); tbpRooms.TabIndex = 1; tbpRooms.Text = "Rooms"; tbpRooms.UseVisualStyleBackColor = true; // + // btnAddRoom + // + btnAddRoom.FlatAppearance.BorderSize = 0; + btnAddRoom.FlatStyle = FlatStyle.Flat; + btnAddRoom.Location = new Point(342, 485); + btnAddRoom.Name = "btnAddRoom"; + btnAddRoom.Size = new Size(20, 22); + btnAddRoom.TabIndex = 7; + btnAddRoom.UseVisualStyleBackColor = true; + btnAddRoom.Click += btnAddRoom_Click; + // // lbRooms // + lbRooms.Anchor = AnchorStyles.Left | AnchorStyles.Right; lbRooms.FormattingEnabled = true; lbRooms.ItemHeight = 15; lbRooms.Location = new Point(0, 0); lbRooms.Name = "lbRooms"; - lbRooms.Size = new Size(250, 514); + lbRooms.Size = new Size(431, 514); lbRooms.TabIndex = 0; lbRooms.DoubleClick += lbRooms_DoubleClick; // // tbpOnlineUsers // tbpOnlineUsers.Controls.Add(lbOnlineUsers); - tbpOnlineUsers.ImageIndex = 0; + tbpOnlineUsers.ImageIndex = 1; tbpOnlineUsers.Location = new Point(4, 24); tbpOnlineUsers.Name = "tbpOnlineUsers"; tbpOnlineUsers.Padding = new Padding(3); - tbpOnlineUsers.Size = new Size(250, 507); + tbpOnlineUsers.Size = new Size(431, 507); tbpOnlineUsers.TabIndex = 2; tbpOnlineUsers.Text = "Online Users"; tbpOnlineUsers.UseVisualStyleBackColor = true; // // lbOnlineUsers // + lbOnlineUsers.Anchor = AnchorStyles.Left | AnchorStyles.Right; lbOnlineUsers.FormattingEnabled = true; lbOnlineUsers.ItemHeight = 15; lbOnlineUsers.Location = new Point(0, 0); lbOnlineUsers.Name = "lbOnlineUsers"; - lbOnlineUsers.Size = new Size(250, 514); + lbOnlineUsers.Size = new Size(431, 514); lbOnlineUsers.TabIndex = 0; lbOnlineUsers.DoubleClick += lbOnlineUsers_DoubleClick; // + // tbpUserDirectory + // + tbpUserDirectory.Controls.Add(lbUserDirectory); + tbpUserDirectory.ImageIndex = 1; + tbpUserDirectory.Location = new Point(4, 24); + tbpUserDirectory.Name = "tbpUserDirectory"; + tbpUserDirectory.Size = new Size(431, 507); + tbpUserDirectory.TabIndex = 3; + tbpUserDirectory.Text = "User Directory"; + tbpUserDirectory.UseVisualStyleBackColor = true; + // + // lbUserDirectory + // + lbUserDirectory.Anchor = AnchorStyles.Left | AnchorStyles.Right; + lbUserDirectory.FormattingEnabled = true; + lbUserDirectory.ItemHeight = 15; + lbUserDirectory.Location = new Point(0, 0); + lbUserDirectory.Name = "lbUserDirectory"; + lbUserDirectory.Size = new Size(431, 514); + lbUserDirectory.TabIndex = 1; + lbUserDirectory.DoubleClick += lbUserDirectory_DoubleClick; + // + // tbpGames + // + tbpGames.Controls.Add(lvGames); + tbpGames.ImageIndex = 3; + tbpGames.Location = new Point(4, 24); + tbpGames.Name = "tbpGames"; + tbpGames.Size = new Size(431, 507); + tbpGames.TabIndex = 4; + tbpGames.Text = "Games"; + tbpGames.UseVisualStyleBackColor = true; + // + // lvGames + // + lvGames.Anchor = AnchorStyles.Left | AnchorStyles.Right; + listViewItem1.Tag = "StockMarketGame"; + lvGames.Items.AddRange(new ListViewItem[] { listViewItem1 }); + lvGames.LargeImageList = ilGames; + lvGames.Location = new Point(0, 0); + lvGames.MultiSelect = false; + lvGames.Name = "lvGames"; + lvGames.Size = new Size(431, 514); + lvGames.SmallImageList = ilGames; + lvGames.TabIndex = 2; + lvGames.UseCompatibleStateImageBehavior = false; + lvGames.DoubleClick += lvGames_DoubleClick; + // + // ilGames + // + ilGames.ColorDepth = ColorDepth.Depth32Bit; + ilGames.ImageStream = (ImageListStreamer)resources.GetObject("ilGames.ImageStream"); + ilGames.TransparentColor = Color.Transparent; + ilGames.Images.SetKeyName(0, "dollar-money.gif"); + // // ilTabIcons // ilTabIcons.ColorDepth = ColorDepth.Depth32Bit; ilTabIcons.ImageStream = (ImageListStreamer)resources.GetObject("ilTabIcons.ImageStream"); ilTabIcons.TransparentColor = Color.Transparent; ilTabIcons.Images.SetKeyName(0, "ContactsIcon.png"); - ilTabIcons.Images.SetKeyName(1, "RoomsChatIcon.png"); - // - // pbUserPfp - // - pbUserPfp.BorderStyle = BorderStyle.FixedSingle; - pbUserPfp.ContextMenuStrip = ctxmChangeStatus; - pbUserPfp.Image = Properties.Resources.DefaultPfp; - pbUserPfp.Location = new Point(12, 10); - pbUserPfp.Name = "pbUserPfp"; - pbUserPfp.Size = new Size(51, 50); - pbUserPfp.SizeMode = PictureBoxSizeMode.StretchImage; - pbUserPfp.TabIndex = 1; - pbUserPfp.TabStop = false; - pbUserPfp.Click += pbUserPfp_Click; + ilTabIcons.Images.SetKeyName(1, "UserIcon.png"); + ilTabIcons.Images.SetKeyName(2, "RoomsChatIcon.png"); + ilTabIcons.Images.SetKeyName(3, "CurrencyIcon.png"); // // ctxmChangeStatus // @@ -208,63 +282,12 @@ invisibleToolStripMenuItem.Size = new Size(153, 22); invisibleToolStripMenuItem.Text = "Invisible"; // - // lblWelcome - // - lblWelcome.AutoSize = true; - lblWelcome.Font = new Font("Segoe UI Light", 9F); - lblWelcome.ForeColor = SystemColors.ControlLightLight; - lblWelcome.Location = new Point(65, 17); - lblWelcome.Name = "lblWelcome"; - lblWelcome.Size = new Size(60, 15); - lblWelcome.TabIndex = 2; - lblWelcome.Text = "Welcome, "; - // - // llblSignIn - // - llblSignIn.AutoSize = true; - llblSignIn.Font = new Font("Segoe UI Light", 9F); - llblSignIn.LinkColor = Color.White; - llblSignIn.Location = new Point(118, 17); - llblSignIn.Name = "llblSignIn"; - llblSignIn.Size = new Size(40, 15); - llblSignIn.TabIndex = 3; - llblSignIn.TabStop = true; - llblSignIn.Text = "Sign In"; - llblSignIn.LinkClicked += llblSignIn_LinkClicked; - // - // llblSignOut - // - llblSignOut.AutoSize = true; - llblSignOut.Font = new Font("Segoe UI Light", 9F); - llblSignOut.LinkColor = Color.White; - llblSignOut.Location = new Point(65, 35); - llblSignOut.Name = "llblSignOut"; - llblSignOut.Size = new Size(50, 15); - llblSignOut.TabIndex = 4; - llblSignOut.TabStop = true; - llblSignOut.Text = "Sign Out"; - llblSignOut.Visible = false; - llblSignOut.LinkClicked += llblSignOut_LinkClicked; - // - // llblEditProfile - // - llblEditProfile.AutoSize = true; - llblEditProfile.Font = new Font("Segoe UI Light", 9F); - llblEditProfile.LinkColor = Color.White; - llblEditProfile.Location = new Point(113, 35); - llblEditProfile.Name = "llblEditProfile"; - llblEditProfile.Size = new Size(60, 15); - llblEditProfile.TabIndex = 5; - llblEditProfile.TabStop = true; - llblEditProfile.Text = "Edit Profile"; - llblEditProfile.Visible = false; - llblEditProfile.LinkClicked += llblEditProfile_LinkClicked; - // // lblRequestNotif // + lblRequestNotif.Anchor = AnchorStyles.Top | AnchorStyles.Right; lblRequestNotif.AutoSize = true; lblRequestNotif.Font = new Font("Segoe UI", 7F, FontStyle.Bold); - lblRequestNotif.Location = new Point(128, 54); + lblRequestNotif.Location = new Point(309, 54); lblRequestNotif.Name = "lblRequestNotif"; lblRequestNotif.Size = new Size(138, 12); lblRequestNotif.TabIndex = 6; @@ -277,48 +300,11 @@ niMain.Text = "QtC.NET Client"; niMain.DoubleClick += niMain_DoubleClick; // - // btnAddRoom - // - btnAddRoom.FlatAppearance.BorderSize = 0; - btnAddRoom.FlatStyle = FlatStyle.Flat; - btnAddRoom.Location = new Point(260, 1); - btnAddRoom.Name = "btnAddRoom"; - btnAddRoom.Size = new Size(20, 22); - btnAddRoom.TabIndex = 7; - btnAddRoom.UseVisualStyleBackColor = true; - btnAddRoom.Click += btnAddRoom_Click; - // - // pbCurrencyIcon - // - pbCurrencyIcon.Image = Properties.Resources.CurrencyIcon; - pbCurrencyIcon.Location = new Point(223, 5); - pbCurrencyIcon.Name = "pbCurrencyIcon"; - pbCurrencyIcon.Size = new Size(15, 14); - pbCurrencyIcon.SizeMode = PictureBoxSizeMode.StretchImage; - pbCurrencyIcon.TabIndex = 9; - pbCurrencyIcon.TabStop = false; - pbCurrencyIcon.Visible = false; - // - // lblCurrencyAmount - // - lblCurrencyAmount.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - lblCurrencyAmount.AutoSize = true; - lblCurrencyAmount.BackColor = Color.Transparent; - lblCurrencyAmount.Font = new Font("Segoe UI", 9F, FontStyle.Bold); - lblCurrencyAmount.ForeColor = Color.White; - lblCurrencyAmount.Location = new Point(239, 5); - lblCurrencyAmount.Name = "lblCurrencyAmount"; - lblCurrencyAmount.Size = new Size(14, 15); - lblCurrencyAmount.TabIndex = 10; - lblCurrencyAmount.Text = "0"; - lblCurrencyAmount.TextAlign = ContentAlignment.MiddleCenter; - lblCurrencyAmount.Visible = false; - // // llblClaimSpin // llblClaimSpin.AutoSize = true; llblClaimSpin.Font = new Font("Segoe UI", 9F, FontStyle.Bold); - llblClaimSpin.Location = new Point(185, 35); + llblClaimSpin.Location = new Point(12, 24); llblClaimSpin.Name = "llblClaimSpin"; llblClaimSpin.Size = new Size(94, 15); llblClaimSpin.TabIndex = 11; @@ -327,22 +313,125 @@ llblClaimSpin.Visible = false; llblClaimSpin.LinkClicked += llblClaimSpin_LinkClicked; // + // pCurrencyArea + // + pCurrencyArea.Anchor = AnchorStyles.Top | AnchorStyles.Right; + pCurrencyArea.BorderStyle = BorderStyle.FixedSingle; + pCurrencyArea.Controls.Add(llblClaimSpin); + pCurrencyArea.Controls.Add(pbCurrencyIcon); + pCurrencyArea.Controls.Add(lblCurrencyAmount); + pCurrencyArea.Location = new Point(336, 5); + pCurrencyArea.Name = "pCurrencyArea"; + pCurrencyArea.Size = new Size(116, 46); + pCurrencyArea.TabIndex = 12; + // + // pbCurrencyIcon + // + pbCurrencyIcon.Image = Properties.Resources.CurrencyIcon; + pbCurrencyIcon.Location = new Point(33, 6); + pbCurrencyIcon.Name = "pbCurrencyIcon"; + pbCurrencyIcon.Size = new Size(15, 14); + pbCurrencyIcon.SizeMode = PictureBoxSizeMode.StretchImage; + pbCurrencyIcon.TabIndex = 18; + pbCurrencyIcon.TabStop = false; + pbCurrencyIcon.Visible = false; + // + // lblCurrencyAmount + // + lblCurrencyAmount.BackColor = Color.Transparent; + lblCurrencyAmount.Font = new Font("Segoe UI", 9F, FontStyle.Bold); + lblCurrencyAmount.ForeColor = Color.White; + lblCurrencyAmount.Location = new Point(48, 3); + lblCurrencyAmount.Name = "lblCurrencyAmount"; + lblCurrencyAmount.Size = new Size(69, 20); + lblCurrencyAmount.TabIndex = 19; + lblCurrencyAmount.Text = "99999"; + lblCurrencyAmount.TextAlign = ContentAlignment.MiddleLeft; + lblCurrencyAmount.Visible = false; + // + // pCurrentUser + // + pCurrentUser.BorderStyle = BorderStyle.FixedSingle; + pCurrentUser.Controls.Add(llblEditProfile); + pCurrentUser.Controls.Add(llblSignOut); + pCurrentUser.Controls.Add(llblSignIn); + pCurrentUser.Controls.Add(lblWelcome); + pCurrentUser.Controls.Add(pbUserPfp); + pCurrentUser.Location = new Point(5, 4); + pCurrentUser.Name = "pCurrentUser"; + pCurrentUser.Size = new Size(298, 59); + pCurrentUser.TabIndex = 13; + // + // llblEditProfile + // + llblEditProfile.AutoSize = true; + llblEditProfile.Font = new Font("Segoe UI Light", 9F); + llblEditProfile.LinkColor = Color.White; + llblEditProfile.Location = new Point(104, 29); + llblEditProfile.Name = "llblEditProfile"; + llblEditProfile.Size = new Size(60, 15); + llblEditProfile.TabIndex = 10; + llblEditProfile.TabStop = true; + llblEditProfile.Text = "Edit Profile"; + llblEditProfile.Visible = false; + // + // llblSignOut + // + llblSignOut.AutoSize = true; + llblSignOut.Font = new Font("Segoe UI Light", 9F); + llblSignOut.LinkColor = Color.White; + llblSignOut.Location = new Point(56, 29); + llblSignOut.Name = "llblSignOut"; + llblSignOut.Size = new Size(50, 15); + llblSignOut.TabIndex = 9; + llblSignOut.TabStop = true; + llblSignOut.Text = "Sign Out"; + llblSignOut.Visible = false; + // + // llblSignIn + // + llblSignIn.AutoSize = true; + llblSignIn.Font = new Font("Segoe UI Light", 9F); + llblSignIn.LinkColor = Color.White; + llblSignIn.Location = new Point(109, 11); + llblSignIn.Name = "llblSignIn"; + llblSignIn.Size = new Size(40, 15); + llblSignIn.TabIndex = 8; + llblSignIn.TabStop = true; + llblSignIn.Text = "Sign In"; + // + // lblWelcome + // + lblWelcome.AutoSize = true; + lblWelcome.Font = new Font("Segoe UI Light", 9F); + lblWelcome.ForeColor = SystemColors.ControlLightLight; + lblWelcome.Location = new Point(56, 11); + lblWelcome.Name = "lblWelcome"; + lblWelcome.Size = new Size(60, 15); + lblWelcome.TabIndex = 7; + lblWelcome.Text = "Welcome, "; + // + // pbUserPfp + // + pbUserPfp.BorderStyle = BorderStyle.FixedSingle; + pbUserPfp.ContextMenuStrip = ctxmChangeStatus; + pbUserPfp.Image = Properties.Resources.DefaultPfp; + pbUserPfp.Location = new Point(3, 4); + pbUserPfp.Name = "pbUserPfp"; + pbUserPfp.Size = new Size(51, 50); + pbUserPfp.SizeMode = PictureBoxSizeMode.StretchImage; + pbUserPfp.TabIndex = 6; + pbUserPfp.TabStop = false; + // // Main // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackColor = Color.DodgerBlue; - ClientSize = new Size(282, 613); - Controls.Add(llblClaimSpin); - Controls.Add(pbCurrencyIcon); - Controls.Add(lblCurrencyAmount); - Controls.Add(btnAddRoom); + ClientSize = new Size(463, 613); + Controls.Add(pCurrentUser); + Controls.Add(pCurrencyArea); Controls.Add(lblRequestNotif); - Controls.Add(llblEditProfile); - Controls.Add(llblSignOut); - Controls.Add(llblSignIn); - Controls.Add(lblWelcome); - Controls.Add(pbUserPfp); Controls.Add(tbcMain); FormBorderStyle = FormBorderStyle.FixedDialog; Icon = (Icon)resources.GetObject("$this.Icon"); @@ -357,9 +446,15 @@ tbpContacts.ResumeLayout(false); tbpRooms.ResumeLayout(false); tbpOnlineUsers.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)pbUserPfp).EndInit(); + tbpUserDirectory.ResumeLayout(false); + tbpGames.ResumeLayout(false); ctxmChangeStatus.ResumeLayout(false); + pCurrencyArea.ResumeLayout(false); + pCurrencyArea.PerformLayout(); ((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).EndInit(); + pCurrentUser.ResumeLayout(false); + pCurrentUser.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pbUserPfp).EndInit(); ResumeLayout(false); PerformLayout(); } @@ -370,13 +465,8 @@ private TabPage tbpContacts; private TabPage tbpRooms; private ListBox lbRooms; - private PictureBox pbUserPfp; - private Label lblWelcome; - private LinkLabel llblSignIn; - private LinkLabel llblSignOut; private TabPage tbpOnlineUsers; private ListBox lbOnlineUsers; - private LinkLabel llblEditProfile; private Label lblRequestNotif; private ListView lvContacts; private ImageList ilProfilePics; @@ -388,8 +478,20 @@ private ToolStripMenuItem doNotDisturbToolStripMenuItem; private ToolStripMenuItem invisibleToolStripMenuItem; private Button btnAddRoom; + private LinkLabel llblClaimSpin; + private TabPage tbpUserDirectory; + private ListBox lbUserDirectory; + private Panel pCurrencyArea; + private Panel pCurrentUser; + private LinkLabel llblEditProfile; + private LinkLabel llblSignOut; + private LinkLabel llblSignIn; + private Label lblWelcome; + private PictureBox pbUserPfp; + private TabPage tbpGames; + private ListView lvGames; + private ImageList ilGames; private PictureBox pbCurrencyIcon; private Label lblCurrencyAmount; - private LinkLabel llblClaimSpin; } } diff --git a/qtc-net-client-2/Forms/Main.cs b/qtc-net-client-2/Forms/Main.cs index 1dd93bf..e41ede4 100644 --- a/qtc-net-client-2/Forms/Main.cs +++ b/qtc-net-client-2/Forms/Main.cs @@ -18,6 +18,7 @@ namespace qtc_net_client_2 private List 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 0000000..4cbab2a Binary files /dev/null and b/qtc-net-client-2/Icons/UserIcon.png differ 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