Implemented First Currency Game - Stock Market

Reworked `GatewayService` To Use New Hub Command Set
Implemented User Directory
Changed Icon On Users Online Tab
This commit is contained in:
Alan Moon 2025-06-26 16:14:44 -07:00
parent 82c66aad44
commit eac4631e12
20 changed files with 1217 additions and 255 deletions

View File

@ -0,0 +1,8 @@
namespace QtCNETAPI.Dtos.User
{
public class UserStockActionResultDto
{
public int StockAmount { get; set; }
public int CurrencyAmount { get; set; }
}
}

View File

@ -13,6 +13,7 @@
public DateTime CreatedAt { get; set; } public DateTime CreatedAt { get; set; }
public int Status { get; set; } = 0; public int Status { get; set; } = 0;
public int CurrencyAmount { get; set; } = 0; public int CurrencyAmount { get; set; } = 0;
public int StockAmount { get; set; } = 0;
public DateTime LastCurrencySpin { get; set; } public DateTime LastCurrencySpin { get; set; }
public virtual IEnumerable<RefreshToken>? RefreshTokens { get; } public virtual IEnumerable<RefreshToken>? RefreshTokens { get; }

View File

@ -3,6 +3,7 @@ using QtCNETAPI.Dtos.User;
using QtCNETAPI.Models; using QtCNETAPI.Models;
using RestSharp; using RestSharp;
using System.IdentityModel.Tokens.Jwt; using System.IdentityModel.Tokens.Jwt;
using System.Resources;
using System.Text.Json; using System.Text.Json;
namespace QtCNETAPI.Services.ApiService namespace QtCNETAPI.Services.ApiService
@ -56,6 +57,32 @@ namespace QtCNETAPI.Services.ApiService
return serviceResponse; return serviceResponse;
} }
public async Task<ServiceResponse<List<UserInformationDto>>> GetAllUsersAsync()
{
await RefreshSessionIfInvalid();
var serviceResponse = new ServiceResponse<List<UserInformationDto>>();
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<ServiceResponse<List<UserInformationDto>>>(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<ServiceResponse<List<UserInformationDto>>> GetOnlineUsersAsync() public async Task<ServiceResponse<List<UserInformationDto>>> GetOnlineUsersAsync()
{ {
await RefreshSessionIfInvalid(); await RefreshSessionIfInvalid();
@ -566,5 +593,76 @@ namespace QtCNETAPI.Services.ApiService
return serviceResponse; return serviceResponse;
} }
public async Task<ServiceResponse<int>> GetCurrentStockPrice()
{
await RefreshSessionIfInvalid();
var serviceResponse = new ServiceResponse<int>();
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<ServiceResponse<int>>(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<ServiceResponse<UserStockActionResultDto>> BuyStock(int amount)
{
await RefreshSessionIfInvalid();
var serviceResponse = new ServiceResponse<UserStockActionResultDto>();
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<ServiceResponse<UserStockActionResultDto>>(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<ServiceResponse<UserStockActionResultDto>> SellStock(int amount)
{
await RefreshSessionIfInvalid();
var serviceResponse = new ServiceResponse<UserStockActionResultDto>();
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<ServiceResponse<UserStockActionResultDto>>(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;
}
} }
} }

View File

@ -17,6 +17,7 @@ namespace QtCNETAPI.Services.ApiService
public Task<ServiceResponse<string>> PingServerAsync(); public Task<ServiceResponse<string>> PingServerAsync();
public Task<ServiceResponse<List<UserInformationDto>>> GetOnlineUsersAsync(); public Task<ServiceResponse<List<UserInformationDto>>> GetOnlineUsersAsync();
public Task<ServiceResponse<List<UserInformationDto>>> GetAllUsersAsync();
public Task<ServiceResponse<User>> LoginAsync(UserLoginDto userLoginDto); public Task<ServiceResponse<User>> LoginAsync(UserLoginDto userLoginDto);
public Task<ServiceResponse<User>> RefreshLogin(string refreshToken); public Task<ServiceResponse<User>> RefreshLogin(string refreshToken);
public Task<ServiceResponse<string>> RefreshSessionIfInvalid(); public Task<ServiceResponse<string>> RefreshSessionIfInvalid();
@ -33,5 +34,8 @@ namespace QtCNETAPI.Services.ApiService
public Task<ServiceResponse<bool>> AcceptContactRequest(string userId); public Task<ServiceResponse<bool>> AcceptContactRequest(string userId);
public Task<ServiceResponse<Contact>> RemoveContactFromCurrentUser(string userId); public Task<ServiceResponse<Contact>> RemoveContactFromCurrentUser(string userId);
public Task<ServiceResponse<int>> AddCurrencyToCurrentUser(int amount, bool isSpinClaim); public Task<ServiceResponse<int>> AddCurrencyToCurrentUser(int amount, bool isSpinClaim);
public Task<ServiceResponse<int>> GetCurrentStockPrice();
public Task<ServiceResponse<UserStockActionResultDto>> BuyStock(int amount);
public Task<ServiceResponse<UserStockActionResultDto>> SellStock(int amount);
} }
} }

View File

@ -15,7 +15,10 @@ namespace QtCNETAPI.Services.GatewayService
public HubConnection? HubConnection { get; private set; } 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 OnClientFunctionReceived;
public event EventHandler OnDirectMessageReceived; public event EventHandler OnDirectMessageReceived;
public event EventHandler OnServerConfigReceived; public event EventHandler OnServerConfigReceived;
@ -45,21 +48,25 @@ namespace QtCNETAPI.Services.GatewayService
}); });
HubConnection = gwConBuilder.Build(); HubConnection = gwConBuilder.Build();
// start connection
await HubConnection.StartAsync();
// register events // register events
HubConnection.On<string>("rm", (serverMessage) => OnServerMessageReceived?.Invoke(this, new ServerMessageEventArgs{Message = serverMessage})); HubConnection.On<string>("RoomMessage", (serverMessage) => OnRoomMessageReceived?.Invoke(this, new ServerMessageEventArgs { Message = serverMessage }));
HubConnection.On<string>("cf", (function) => OnClientFunctionReceived?.Invoke(this, new ClientFunctionEventArgs{Function = function})); HubConnection.On<string>("cf", (function) => OnClientFunctionReceived?.Invoke(this, new ClientFunctionEventArgs { Function = function }));
HubConnection.On<Message, UserInformationDto>("rdm", (message, user) => OnDirectMessageReceived?.Invoke(this, new DirectMessageEventArgs { Message = message, User = user })); HubConnection.On<Message, UserInformationDto>("ReceiveDirectMessage", (message, user) => OnDirectMessageReceived?.Invoke(this, new DirectMessageEventArgs { Message = message, User = user }));
HubConnection.On<ServerConfig>("rc", (serverConfig) => OnServerConfigReceived?.Invoke(this, new ServerConfigEventArgs{ServerConfig = serverConfig})); 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<ServerConfig>("ReceiveServerConfig", (serverConfig) => OnServerConfigReceived?.Invoke(this, new ServerConfigEventArgs { ServerConfig = serverConfig }));
HubConnection.Closed += HubConnection_Closed; HubConnection.Closed += HubConnection_Closed;
HubConnection.Reconnecting += HubConnection_Reconnecting; HubConnection.Reconnecting += HubConnection_Reconnecting;
HubConnection.Reconnected += HubConnection_Reconnected; HubConnection.Reconnected += HubConnection_Reconnected;
// start connection
await HubConnection.StartAsync();
if (HubConnection != null && HubConnection.State == HubConnectionState.Connected) 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() 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."); 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; InLobby = true;
CurrentRoom = null; CurrentRoom = null;
} }
@ -100,15 +107,15 @@ namespace QtCNETAPI.Services.GatewayService
if (InLobby == true) if (InLobby == true)
{ {
await HubConnection.SendAsync("ll", _apiService.CurrentUser); await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser);
InLobby = false; InLobby = false;
} }
else if (CurrentRoom != null) 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; CurrentRoom = room;
} }
@ -120,12 +127,12 @@ namespace QtCNETAPI.Services.GatewayService
if (InLobby) if (InLobby)
{ {
await HubConnection.SendAsync("ll", _apiService.CurrentUser); await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser);
InLobby = false; InLobby = false;
} }
else else
{ {
await HubConnection.SendAsync("lr", _apiService.CurrentUser, CurrentRoom); await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
CurrentRoom = null; 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."); 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) 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."); 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) 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."); 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) 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."); 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);
} }

View File

@ -103,9 +103,9 @@ namespace QtCNETAPI.Services.GatewayService
// EVENTS // EVENTS
/// <summary> /// <summary>
/// When A Server Message Is Received, This Event Fires /// When A Room Message Is Received, This Event Fires
/// </summary> /// </summary>
public event EventHandler OnServerMessageReceived; public event EventHandler OnRoomMessageReceived;
/// <summary> /// <summary>
/// When A Client Function/Event Is Received, This Event Fires /// When A Client Function/Event Is Received, This Event Fires
@ -117,6 +117,21 @@ namespace QtCNETAPI.Services.GatewayService
/// </summary> /// </summary>
public event EventHandler OnDirectMessageReceived; public event EventHandler OnDirectMessageReceived;
/// <summary>
/// Fires When The Client Receives The Request To Refresh Its User List
/// </summary>
public event EventHandler OnRefreshUserListReceived;
/// <summary>
/// Fires When The Client Receives The Request To Refresh Its Room List
/// </summary>
public event EventHandler OnRefreshRoomListReceived;
/// <summary>
/// Fires When The Client Receives The Request To Refresh Its Contacts List
/// </summary>
public event EventHandler OnRefreshContactsListReceived;
/// <summary> /// <summary>
/// When The Server Config Is Received, This Event Fires /// When The Server Config Is Received, This Event Fires
/// </summary> /// </summary>

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -32,6 +32,7 @@
rtxtChatbox = new RichTextBox(); rtxtChatbox = new RichTextBox();
btnSend = new Button(); btnSend = new Button();
rtxtChat = new RichTextBox(); rtxtChat = new RichTextBox();
lblRoomName = new Label();
SuspendLayout(); SuspendLayout();
// //
// rtxtChatbox // rtxtChatbox
@ -58,19 +59,32 @@
// rtxtChat // rtxtChat
// //
rtxtChat.HideSelection = false; rtxtChat.HideSelection = false;
rtxtChat.Location = new Point(12, 12); rtxtChat.Location = new Point(12, 43);
rtxtChat.Name = "rtxtChat"; rtxtChat.Name = "rtxtChat";
rtxtChat.ReadOnly = true; rtxtChat.ReadOnly = true;
rtxtChat.Size = new Size(593, 250); rtxtChat.Size = new Size(593, 219);
rtxtChat.TabIndex = 3; rtxtChat.TabIndex = 3;
rtxtChat.Text = ""; 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 // Chat
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.DodgerBlue; BackColor = Color.DodgerBlue;
ClientSize = new Size(617, 334); ClientSize = new Size(617, 334);
Controls.Add(lblRoomName);
Controls.Add(rtxtChat); Controls.Add(rtxtChat);
Controls.Add(btnSend); Controls.Add(btnSend);
Controls.Add(rtxtChatbox); Controls.Add(rtxtChatbox);
@ -83,11 +97,13 @@
FormClosing += frmChat_FormClosing; FormClosing += frmChat_FormClosing;
Load += frmChat_Load; Load += frmChat_Load;
ResumeLayout(false); ResumeLayout(false);
PerformLayout();
} }
#endregion #endregion
private RichTextBox rtxtChatbox; private RichTextBox rtxtChatbox;
private Button btnSend; private Button btnSend;
private RichTextBox rtxtChat; private RichTextBox rtxtChat;
private Label lblRoomName;
} }
} }

View File

@ -30,16 +30,16 @@ namespace qtc_net_client_2.Forms
private void frmChat_Load(object sender, EventArgs e) private void frmChat_Load(object sender, EventArgs e)
{ {
// subscribe to server message event // 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}"; 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"; else if (_gatewayService.InLobby) { Text = $"QtC.NET Client - Chat Room - Lobby"; lblRoomName.Text = "Lobby"; }
} }
private async void frmChat_FormClosing(object sender, FormClosingEventArgs e) private async void frmChat_FormClosing(object sender, FormClosingEventArgs e)
{ {
// unsubscribe from server message event // unsubscribe from server message event
_gatewayService.OnServerMessageReceived -= _gatewayService_OnServerMessageReceived; _gatewayService.OnRoomMessageReceived -= _gatewayService_OnServerMessageReceived;
if (_gatewayService.CurrentRoom != null || _gatewayService.InLobby) if (_gatewayService.CurrentRoom != null || _gatewayService.InLobby)
{ {

View File

@ -38,11 +38,11 @@
// rtxtChat // rtxtChat
// //
rtxtChat.HideSelection = false; rtxtChat.HideSelection = false;
rtxtChat.Location = new Point(12, 56); rtxtChat.Location = new Point(12, 48);
rtxtChat.Margin = new Padding(4, 3, 4, 3); rtxtChat.Margin = new Padding(4, 3, 4, 3);
rtxtChat.Name = "rtxtChat"; rtxtChat.Name = "rtxtChat";
rtxtChat.ReadOnly = true; rtxtChat.ReadOnly = true;
rtxtChat.Size = new Size(593, 317); rtxtChat.Size = new Size(593, 325);
rtxtChat.TabIndex = 6; rtxtChat.TabIndex = 6;
rtxtChat.Text = ""; rtxtChat.Text = "";
// //
@ -74,7 +74,7 @@
// //
lblUsername.AutoSize = true; lblUsername.AutoSize = true;
lblUsername.Font = new Font("Segoe UI", 25F, FontStyle.Bold | FontStyle.Italic); 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.Margin = new Padding(4, 0, 4, 0);
lblUsername.Name = "lblUsername"; lblUsername.Name = "lblUsername";
lblUsername.Size = new Size(181, 46); lblUsername.Size = new Size(181, 46);
@ -86,7 +86,7 @@
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.DodgerBlue; BackColor = Color.DodgerBlue;
ClientSize = new Size(618, 450); ClientSize = new Size(618, 443);
Controls.Add(lblUsername); Controls.Add(lblUsername);
Controls.Add(rtxtChat); Controls.Add(rtxtChat);
Controls.Add(btnSend); Controls.Add(btnSend);

View File

@ -51,14 +51,14 @@ namespace qtc_net_client_2.Forms
private async void btnSend_Click(object sender, EventArgs e) 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)) if (!string.IsNullOrEmpty(rtxtChatbox.Text))
{ {
await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id }); 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(); rtxtChatbox.Clear();
AudioService.PlaySoundEffect("sndSendClick"); AudioService.PlaySoundEffect("sndSendClick");
} }
@ -69,8 +69,8 @@ namespace qtc_net_client_2.Forms
if (!string.IsNullOrEmpty(rtxtChatbox.Text)) if (!string.IsNullOrEmpty(rtxtChatbox.Text))
{ {
await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id }); 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"); }); Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}");
BeginInvoke(delegate () { rtxtChatbox.Clear(); }); rtxtChatbox.Clear();
AudioService.PlaySoundEffect("sndSendClick"); AudioService.PlaySoundEffect("sndSendClick");
} }
} }

View File

@ -29,52 +29,67 @@
private void InitializeComponent() private void InitializeComponent()
{ {
components = new System.ComponentModel.Container(); components = new System.ComponentModel.Container();
ListViewItem listViewItem1 = new ListViewItem("Stock Market", 0);
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
tbcMain = new TabControl(); tbcMain = new TabControl();
tbpContacts = new TabPage(); tbpContacts = new TabPage();
lvContacts = new ListView(); lvContacts = new ListView();
ilProfilePics = new ImageList(components); ilProfilePics = new ImageList(components);
tbpRooms = new TabPage(); tbpRooms = new TabPage();
btnAddRoom = new Button();
lbRooms = new ListBox(); lbRooms = new ListBox();
tbpOnlineUsers = new TabPage(); tbpOnlineUsers = new TabPage();
lbOnlineUsers = new ListBox(); lbOnlineUsers = new ListBox();
tbpUserDirectory = new TabPage();
lbUserDirectory = new ListBox();
tbpGames = new TabPage();
lvGames = new ListView();
ilGames = new ImageList(components);
ilTabIcons = new ImageList(components); ilTabIcons = new ImageList(components);
pbUserPfp = new PictureBox();
ctxmChangeStatus = new ContextMenuStrip(components); ctxmChangeStatus = new ContextMenuStrip(components);
onlineToolStripMenuItem = new ToolStripMenuItem(); onlineToolStripMenuItem = new ToolStripMenuItem();
awayToolStripMenuItem = new ToolStripMenuItem(); awayToolStripMenuItem = new ToolStripMenuItem();
doNotDisturbToolStripMenuItem = new ToolStripMenuItem(); doNotDisturbToolStripMenuItem = new ToolStripMenuItem();
invisibleToolStripMenuItem = new ToolStripMenuItem(); invisibleToolStripMenuItem = new ToolStripMenuItem();
lblWelcome = new Label();
llblSignIn = new LinkLabel();
llblSignOut = new LinkLabel();
llblEditProfile = new LinkLabel();
lblRequestNotif = new Label(); lblRequestNotif = new Label();
niMain = new NotifyIcon(components); niMain = new NotifyIcon(components);
btnAddRoom = new Button(); llblClaimSpin = new LinkLabel();
pCurrencyArea = new Panel();
pbCurrencyIcon = new PictureBox(); pbCurrencyIcon = new PictureBox();
lblCurrencyAmount = new Label(); 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(); tbcMain.SuspendLayout();
tbpContacts.SuspendLayout(); tbpContacts.SuspendLayout();
tbpRooms.SuspendLayout(); tbpRooms.SuspendLayout();
tbpOnlineUsers.SuspendLayout(); tbpOnlineUsers.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pbUserPfp).BeginInit(); tbpUserDirectory.SuspendLayout();
tbpGames.SuspendLayout();
ctxmChangeStatus.SuspendLayout(); ctxmChangeStatus.SuspendLayout();
pCurrencyArea.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).BeginInit(); ((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).BeginInit();
pCurrentUser.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pbUserPfp).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// tbcMain // tbcMain
// //
tbcMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
tbcMain.Controls.Add(tbpContacts); tbcMain.Controls.Add(tbpContacts);
tbcMain.Controls.Add(tbpRooms); tbcMain.Controls.Add(tbpRooms);
tbcMain.Controls.Add(tbpOnlineUsers); tbcMain.Controls.Add(tbpOnlineUsers);
tbcMain.Controls.Add(tbpUserDirectory);
tbcMain.Controls.Add(tbpGames);
tbcMain.Enabled = false; tbcMain.Enabled = false;
tbcMain.ImageList = ilTabIcons; tbcMain.ImageList = ilTabIcons;
tbcMain.Location = new Point(12, 66); tbcMain.Location = new Point(12, 66);
tbcMain.Name = "tbcMain"; tbcMain.Name = "tbcMain";
tbcMain.SelectedIndex = 0; tbcMain.SelectedIndex = 0;
tbcMain.Size = new Size(258, 535); tbcMain.Size = new Size(439, 535);
tbcMain.TabIndex = 0; tbcMain.TabIndex = 0;
// //
// tbpContacts // tbpContacts
@ -84,18 +99,19 @@
tbpContacts.Location = new Point(4, 24); tbpContacts.Location = new Point(4, 24);
tbpContacts.Name = "tbpContacts"; tbpContacts.Name = "tbpContacts";
tbpContacts.Padding = new Padding(3); tbpContacts.Padding = new Padding(3);
tbpContacts.Size = new Size(250, 507); tbpContacts.Size = new Size(431, 507);
tbpContacts.TabIndex = 0; tbpContacts.TabIndex = 0;
tbpContacts.Text = "Contacts"; tbpContacts.Text = "Contacts";
tbpContacts.UseVisualStyleBackColor = true; tbpContacts.UseVisualStyleBackColor = true;
// //
// lvContacts // lvContacts
// //
lvContacts.Anchor = AnchorStyles.Left | AnchorStyles.Right;
lvContacts.LargeImageList = ilProfilePics; lvContacts.LargeImageList = ilProfilePics;
lvContacts.Location = new Point(0, 0); lvContacts.Location = new Point(0, 0);
lvContacts.MultiSelect = false; lvContacts.MultiSelect = false;
lvContacts.Name = "lvContacts"; lvContacts.Name = "lvContacts";
lvContacts.Size = new Size(250, 507); lvContacts.Size = new Size(431, 514);
lvContacts.SmallImageList = ilProfilePics; lvContacts.SmallImageList = ilProfilePics;
lvContacts.TabIndex = 1; lvContacts.TabIndex = 1;
lvContacts.UseCompatibleStateImageBehavior = false; lvContacts.UseCompatibleStateImageBehavior = false;
@ -110,68 +126,126 @@
// //
// tbpRooms // tbpRooms
// //
tbpRooms.Controls.Add(btnAddRoom);
tbpRooms.Controls.Add(lbRooms); tbpRooms.Controls.Add(lbRooms);
tbpRooms.ImageKey = "RoomsChatIcon.png"; tbpRooms.ImageKey = "RoomsChatIcon.png";
tbpRooms.Location = new Point(4, 24); tbpRooms.Location = new Point(4, 24);
tbpRooms.Name = "tbpRooms"; tbpRooms.Name = "tbpRooms";
tbpRooms.Padding = new Padding(3); tbpRooms.Padding = new Padding(3);
tbpRooms.Size = new Size(250, 507); tbpRooms.Size = new Size(431, 507);
tbpRooms.TabIndex = 1; tbpRooms.TabIndex = 1;
tbpRooms.Text = "Rooms"; tbpRooms.Text = "Rooms";
tbpRooms.UseVisualStyleBackColor = true; 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
// //
lbRooms.Anchor = AnchorStyles.Left | AnchorStyles.Right;
lbRooms.FormattingEnabled = true; lbRooms.FormattingEnabled = true;
lbRooms.ItemHeight = 15; lbRooms.ItemHeight = 15;
lbRooms.Location = new Point(0, 0); lbRooms.Location = new Point(0, 0);
lbRooms.Name = "lbRooms"; lbRooms.Name = "lbRooms";
lbRooms.Size = new Size(250, 514); lbRooms.Size = new Size(431, 514);
lbRooms.TabIndex = 0; lbRooms.TabIndex = 0;
lbRooms.DoubleClick += lbRooms_DoubleClick; lbRooms.DoubleClick += lbRooms_DoubleClick;
// //
// tbpOnlineUsers // tbpOnlineUsers
// //
tbpOnlineUsers.Controls.Add(lbOnlineUsers); tbpOnlineUsers.Controls.Add(lbOnlineUsers);
tbpOnlineUsers.ImageIndex = 0; tbpOnlineUsers.ImageIndex = 1;
tbpOnlineUsers.Location = new Point(4, 24); tbpOnlineUsers.Location = new Point(4, 24);
tbpOnlineUsers.Name = "tbpOnlineUsers"; tbpOnlineUsers.Name = "tbpOnlineUsers";
tbpOnlineUsers.Padding = new Padding(3); tbpOnlineUsers.Padding = new Padding(3);
tbpOnlineUsers.Size = new Size(250, 507); tbpOnlineUsers.Size = new Size(431, 507);
tbpOnlineUsers.TabIndex = 2; tbpOnlineUsers.TabIndex = 2;
tbpOnlineUsers.Text = "Online Users"; tbpOnlineUsers.Text = "Online Users";
tbpOnlineUsers.UseVisualStyleBackColor = true; tbpOnlineUsers.UseVisualStyleBackColor = true;
// //
// lbOnlineUsers // lbOnlineUsers
// //
lbOnlineUsers.Anchor = AnchorStyles.Left | AnchorStyles.Right;
lbOnlineUsers.FormattingEnabled = true; lbOnlineUsers.FormattingEnabled = true;
lbOnlineUsers.ItemHeight = 15; lbOnlineUsers.ItemHeight = 15;
lbOnlineUsers.Location = new Point(0, 0); lbOnlineUsers.Location = new Point(0, 0);
lbOnlineUsers.Name = "lbOnlineUsers"; lbOnlineUsers.Name = "lbOnlineUsers";
lbOnlineUsers.Size = new Size(250, 514); lbOnlineUsers.Size = new Size(431, 514);
lbOnlineUsers.TabIndex = 0; lbOnlineUsers.TabIndex = 0;
lbOnlineUsers.DoubleClick += lbOnlineUsers_DoubleClick; 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
// //
ilTabIcons.ColorDepth = ColorDepth.Depth32Bit; ilTabIcons.ColorDepth = ColorDepth.Depth32Bit;
ilTabIcons.ImageStream = (ImageListStreamer)resources.GetObject("ilTabIcons.ImageStream"); ilTabIcons.ImageStream = (ImageListStreamer)resources.GetObject("ilTabIcons.ImageStream");
ilTabIcons.TransparentColor = Color.Transparent; ilTabIcons.TransparentColor = Color.Transparent;
ilTabIcons.Images.SetKeyName(0, "ContactsIcon.png"); ilTabIcons.Images.SetKeyName(0, "ContactsIcon.png");
ilTabIcons.Images.SetKeyName(1, "RoomsChatIcon.png"); ilTabIcons.Images.SetKeyName(1, "UserIcon.png");
// ilTabIcons.Images.SetKeyName(2, "RoomsChatIcon.png");
// pbUserPfp ilTabIcons.Images.SetKeyName(3, "CurrencyIcon.png");
//
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;
// //
// ctxmChangeStatus // ctxmChangeStatus
// //
@ -208,63 +282,12 @@
invisibleToolStripMenuItem.Size = new Size(153, 22); invisibleToolStripMenuItem.Size = new Size(153, 22);
invisibleToolStripMenuItem.Text = "Invisible"; 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
// //
lblRequestNotif.Anchor = AnchorStyles.Top | AnchorStyles.Right;
lblRequestNotif.AutoSize = true; lblRequestNotif.AutoSize = true;
lblRequestNotif.Font = new Font("Segoe UI", 7F, FontStyle.Bold); 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.Name = "lblRequestNotif";
lblRequestNotif.Size = new Size(138, 12); lblRequestNotif.Size = new Size(138, 12);
lblRequestNotif.TabIndex = 6; lblRequestNotif.TabIndex = 6;
@ -277,48 +300,11 @@
niMain.Text = "QtC.NET Client"; niMain.Text = "QtC.NET Client";
niMain.DoubleClick += niMain_DoubleClick; 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
// //
llblClaimSpin.AutoSize = true; llblClaimSpin.AutoSize = true;
llblClaimSpin.Font = new Font("Segoe UI", 9F, FontStyle.Bold); 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.Name = "llblClaimSpin";
llblClaimSpin.Size = new Size(94, 15); llblClaimSpin.Size = new Size(94, 15);
llblClaimSpin.TabIndex = 11; llblClaimSpin.TabIndex = 11;
@ -327,22 +313,125 @@
llblClaimSpin.Visible = false; llblClaimSpin.Visible = false;
llblClaimSpin.LinkClicked += llblClaimSpin_LinkClicked; 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 // Main
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.DodgerBlue; BackColor = Color.DodgerBlue;
ClientSize = new Size(282, 613); ClientSize = new Size(463, 613);
Controls.Add(llblClaimSpin); Controls.Add(pCurrentUser);
Controls.Add(pbCurrencyIcon); Controls.Add(pCurrencyArea);
Controls.Add(lblCurrencyAmount);
Controls.Add(btnAddRoom);
Controls.Add(lblRequestNotif); Controls.Add(lblRequestNotif);
Controls.Add(llblEditProfile);
Controls.Add(llblSignOut);
Controls.Add(llblSignIn);
Controls.Add(lblWelcome);
Controls.Add(pbUserPfp);
Controls.Add(tbcMain); Controls.Add(tbcMain);
FormBorderStyle = FormBorderStyle.FixedDialog; FormBorderStyle = FormBorderStyle.FixedDialog;
Icon = (Icon)resources.GetObject("$this.Icon"); Icon = (Icon)resources.GetObject("$this.Icon");
@ -357,9 +446,15 @@
tbpContacts.ResumeLayout(false); tbpContacts.ResumeLayout(false);
tbpRooms.ResumeLayout(false); tbpRooms.ResumeLayout(false);
tbpOnlineUsers.ResumeLayout(false); tbpOnlineUsers.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pbUserPfp).EndInit(); tbpUserDirectory.ResumeLayout(false);
tbpGames.ResumeLayout(false);
ctxmChangeStatus.ResumeLayout(false); ctxmChangeStatus.ResumeLayout(false);
pCurrencyArea.ResumeLayout(false);
pCurrencyArea.PerformLayout();
((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).EndInit(); ((System.ComponentModel.ISupportInitialize)pbCurrencyIcon).EndInit();
pCurrentUser.ResumeLayout(false);
pCurrentUser.PerformLayout();
((System.ComponentModel.ISupportInitialize)pbUserPfp).EndInit();
ResumeLayout(false); ResumeLayout(false);
PerformLayout(); PerformLayout();
} }
@ -370,13 +465,8 @@
private TabPage tbpContacts; private TabPage tbpContacts;
private TabPage tbpRooms; private TabPage tbpRooms;
private ListBox lbRooms; private ListBox lbRooms;
private PictureBox pbUserPfp;
private Label lblWelcome;
private LinkLabel llblSignIn;
private LinkLabel llblSignOut;
private TabPage tbpOnlineUsers; private TabPage tbpOnlineUsers;
private ListBox lbOnlineUsers; private ListBox lbOnlineUsers;
private LinkLabel llblEditProfile;
private Label lblRequestNotif; private Label lblRequestNotif;
private ListView lvContacts; private ListView lvContacts;
private ImageList ilProfilePics; private ImageList ilProfilePics;
@ -388,8 +478,20 @@
private ToolStripMenuItem doNotDisturbToolStripMenuItem; private ToolStripMenuItem doNotDisturbToolStripMenuItem;
private ToolStripMenuItem invisibleToolStripMenuItem; private ToolStripMenuItem invisibleToolStripMenuItem;
private Button btnAddRoom; 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 PictureBox pbCurrencyIcon;
private Label lblCurrencyAmount; private Label lblCurrencyAmount;
private LinkLabel llblClaimSpin;
} }
} }

View File

@ -18,6 +18,7 @@ namespace qtc_net_client_2
private List<Room> RoomList = []; private List<Room> RoomList = [];
private List<UserInformationDto> OnlineUsers = []; private List<UserInformationDto> OnlineUsers = [];
private List<UserInformationDto> UserDirectory = [];
private List<UserInformationDto> Contacts = []; private List<UserInformationDto> Contacts = [];
private bool FirstMinimize = true; private bool FirstMinimize = true;
@ -193,21 +194,15 @@ 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) private void frmMain_Resize(object sender, EventArgs e)
{ {
if (WindowState == FormWindowState.Minimized && _config.MinimizeToTray) if (WindowState == FormWindowState.Minimized && _config.MinimizeToTray)
{ {
Hide(); Hide();
niMain.Visible = true; niMain.Visible = true;
if (FirstMinimize) { niMain.ShowBalloonTip(10, if (FirstMinimize)
{
niMain.ShowBalloonTip(10,
"I'm over here!", "I'm over here!",
"QtC.NET Mimimizes To Tray By Default. To Change This Behaviour, Refer To config.json", "QtC.NET Mimimizes To Tray By Default. To Change This Behaviour, Refer To config.json",
ToolTipIcon.Info); ToolTipIcon.Info);
@ -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() private async Task OnSuccessfulLogin()
{ {
// double check // double check
@ -310,8 +343,10 @@ namespace qtc_net_client_2
_gatewayService.OnServerReconnecting += _gatewayService_OnServerReconnecting; _gatewayService.OnServerReconnecting += _gatewayService_OnServerReconnecting;
_gatewayService.OnServerReconnected += _gatewayService_OnServerReconnected; _gatewayService.OnServerReconnected += _gatewayService_OnServerReconnected;
_gatewayService.OnServerDisconnect += _gatewayService_OnServerDisconnect; _gatewayService.OnServerDisconnect += _gatewayService_OnServerDisconnect;
_gatewayService.OnClientFunctionReceived += _gatewayService_OnClientFunctionReceived;
_gatewayService.OnDirectMessageReceived += _gatewayService_OnDirectMessageReceived; _gatewayService.OnDirectMessageReceived += _gatewayService_OnDirectMessageReceived;
_gatewayService.OnRefreshUserListReceived += _gatewayService_OnRefreshUserListReceived;
_gatewayService.OnRefreshRoomListReceived += _gatewayService_OnRefreshRoomListReceived;
_gatewayService.OnRefreshContactsListReceived += _gatewayService_OnRefreshContactsListReceived;
_gatewayService.OnServerConfigReceived += _gatewayService_OnServerConfigReceived; _gatewayService.OnServerConfigReceived += _gatewayService_OnServerConfigReceived;
if (_gatewayService.HubConnection != null && _gatewayService.HubConnection.State == Microsoft.AspNetCore.SignalR.Client.HubConnectionState.Connected) 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 RefreshContactsList();
await RefreshRoomsList(); await RefreshRoomsList();
await RefreshOnlineUsersList(); await RefreshOnlineUsersList();
await RefreshUserDirectory();
// TODO - figure out server side why online status is invisible on login // TODO - figure out server side why online status is invisible on login
_apiService.CurrentUser.Status = 1; _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; if (current > _apiService.CurrentUser.LastCurrencySpin.ToUniversalTime() || _apiService.CurrentUser.LastCurrencySpin == new DateTime()) llblClaimSpin.Visible = true;
else llblClaimSpin.Visible = false; 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() private async Task RefreshRoomsList()
{ {
if (InvokeRequired) 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) private async void _gatewayService_OnServerDisconnect(object? sender, EventArgs e)
{ {
if (DialogResult == DialogResult.OK) return; 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_OnServerReconnecting(object? sender, EventArgs e) => BeginInvoke(delegate () { Enabled = false; });
private void _gatewayService_OnServerReconnected(object? sender, EventArgs e) => BeginInvoke(delegate () { Enabled = true; }); 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) private async void _gatewayService_OnServerConfigReceived(object? sender, EventArgs e)
{ {
var args = (ServerConfigEventArgs)e; var args = (ServerConfigEventArgs)e;
@ -704,8 +764,6 @@ namespace qtc_net_client_2
} }
Environment.Exit(0); 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); 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();
} }
} }

View File

@ -120,6 +120,96 @@
<metadata name="ilProfilePics.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="ilProfilePics.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<metadata name="ilGames.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>451, 21</value>
</metadata>
<data name="ilGames.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
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==
</value>
</data>
<metadata name="ilTabIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="ilTabIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 19</value> <value>122, 19</value>
</metadata> </metadata>
@ -127,45 +217,88 @@
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA5AgAAAJNU0Z0AUkBTAIBAQIB SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA3hIAAAJNU0Z0AUkBTAIBAQQB
AAGwAQABsAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAARADAAEBAQABIAYAARAS AAFoAQEBaAEBARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
AANnAe8CZwFZAe8BZwFdAVkB7wFnAVsBWQHvAWcBWwFZAe8BZwJZAe8BZwFkAVkB7wNnAe8DZwHvA2cB AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/ACIAA2cB7wJnAVkB7wFnAV0BWQHvAWcBWwFZAe8B
7wNnAe8DZwHvA2cB7wNnAe8DZwHvA2cB7zgAAzMBUQN5AfWAAAP4Af8BuQGVATwB/wGDAX0BbgH/AYQB ZwFbAVkB7wFnAlkB7wFnAWQBWQHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvAwcB
fQFsAf8BqgGEAScB/wGsAXsBAAH/AcwBvAGUAf8DfgH/A34B/wN+Af8DfgH/A34B/wN+Af8DfgH/A34B CQMqAT8DRQF8A1kBuwNjAd8DaAH0A4AB/gOBAf8DgQH/A4EB/wOAAf4DaAH0A2MB3wNaAboDRAF6AycB
/wOOAf84AAMSARgDPwFtgAAE/wGXAYsBbQH/AoEBgAH/AYIBgQGAAf8BmAGIAWAB/wHKAZABAAH/Ad0B OjgAAzMBUQNuAfUIAAM3AVoDWAG4A2MB3wJjAV0B3wFiAl0B3wNdAd8DXQHfAWECXQHfA2MB3wNjAd8D
zAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf80AANfAdMDPQFnhAAE/wGGAYQB VQGsAzABSwgAA/gB/wG5AZUBPAH/AYMBfQFuAf8BhAF9AWwB/wGqAYQBJwH/AawBewEAAf8BzAG8AZQB
fQH/A4EB/wOBAf8BhwGDAXoB/wHPAZQBAAH/Ad4BzAGfAf8D4AH/A+AB/wPgAf8D4AH/A+AB/wPgAf8D /wN+Af8DfgH/A34B/wN+Af8DfgH/A34B/wN+Af8DfgH/A44B/wNDAXUDXQHMA3wB+AOBAf8DgQH/A4EB
4AH/A+AB/wO8Af80AANaAcIDNAFThAAE/wGLAYYBegH/A4EB/wOBAf8BjgGGAXEB/wHPAZQBAAH/Ad4B /wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A3wB+ANUAag4AAMSARgDPwFtBAADOwFiA10B
zAGfIf8DygH/EAADDQERAz8BbANTAacBXAJZAb4BWAJWAbMBSAJHAYMDIQEwBAADcwHzAzoBYIgABP8B xQF9AXUBaAH0AZ8BZQExAf8BlwFTARcB/wGWAUsBCQH/AZMBRgEBAf8BjAFDAQMB/wF9AUABCwH/AWsB
rAGWAWAB/wGDAYIBfwH/AYUBggF9Af8BswGTAUQB/wHPAZQBAAH/Ad4BzAGfAf8DsAH/A7AB/wOwAf8D QAEaAf8BbgFQATYB/wFsAWkBaAHwA1oBtwM0AVQEAAT/AZcBiwFtAf8CgQGAAf8BggGBAYAB/wGYAYgB
sAH/A7AB/wOwAf8DsAH/A7AB/wOoAf8IAAMaASQDUgGgAWcBYwFIAfYBogFzAQAB/wGuAXwBAAH/AbAB YAH/AcoBkAEAAf8B3QHMAZ8B/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A5MB/wNqAe0D
fQEAAf8BqAF4AQAB/wGVAWoBAAH/AYABagEWAf4BXAJZAcYDVwG1AxYBHogABP8B2QGqATcB/wG+AZgB fQH6A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wNVAa80
OAH/AcABmAE2Af8B3AGiARQB/wHPAZQBAAH/Ad4BzAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D AANfAdMDPQFnBAADNQFVA10BxwGHAXABWgH1AbgBZQEbAf8BuQFYAQIB/wHJAV8BAAH/AdgBZQEAAf8B
gQH/A4EB/wOTAf8EAAMgAS0CYwFaAekBvwGIAQAB/wHNAZUBCgH/AbABiAEnAf8BcwFkAT8B/wFNAUsB 3AFnAQAB/wHWAWQBAAH/AcMBXAEAAf8BogFMAQAB/wF8ATsBAwH/AW4BRgEjAf8BagJoAfADWgG3AzAB
RwH/AU4BSwFCAf8BZgFXATEB/wGaAXQBFwH/AaQBdgEDAf8BcAFPAQAB/wNDAXYEAYQABP8B4QGuATEB SgT/AYYBhAF9Af8DgQH/A4EB/wGHAYMBegH/Ac8BlAEAAf8B3gHMAZ8B/wPgAf8D4AH/A+AB/wPgAf8D
/wG9AZcBOwH/AcABmAE1Af8B4wGlAQoB/wHPAZQBAAH/Ad4BzAGfAf8DwAH/A8AB/wPAAf8DwAH/A8AB 4AH/A+AB/wPgAf8D4AH/A7wB/wNjAd8DbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
/wPAAf8DwAH/A8AB/wOvAf8EAAJjAVoB6QHZAZoBAAH/AdoBowEcAf8CjgGMAf8DigH/A5cB/wObAf8D gQH/A4EB/wOBAf8DgQH/A4EB/wNVAa80AANaAcIDNAFTBAADXAHEAaQBhQFeAfgB1AFxARgB/wHXAWUB
kQH/A3QB/wNIAf8BQwFCAT8B/wG1AYMBBwH/AXoBVwEAAf8DNgFYhAAE/wG7AZ0BUwH/AYgBhAF5Af8B AAH/AeUBbAEAAf8B8gFyAQAB/wH6AXUBAAH/AfwBdgEAAf8B+gF2AQAB/wHzAXIBAAH/AeIBawEAAf8B
jAGFAXQB/wHEAZkBMAH/Ac8BlAEAAf8B3gHMAZ8h/wPKAf8DQwF2AekBpwECAf8B6QGrARIB/wHQAcoB vQFZAQAB/wGHAUABAAH/AXEBSAEjAf8BbAFpAWgB8ANWAasE/wGLAYYBegH/A4EB/wOBAf8BjgGGAXEB
uwH/A6wB/wNdAf8DTAH/A0sB/wNEAf8DDwH/A7MB/wNmAf8BVAFMAToB/wGuAX0BBAH/A10BzIQABP8B /wHPAZQBAAH/Ad4BzAGfIf8DygH/AzYBWANbAcADbgH1A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB
lAGKAXMB/wOBAf8DgQH/AZoBigFjAf8BzwGUAQAB/wHeAcwBnwH/A9AB/wPQAf8D0AH/A9AB/wPQAf8D /wOBAf8DgQH/A4EB/wOBAf8DaAH0A1IBpBAAAw0BEQM/AWwDUwGnAVwCWQG+AVgCVgGzAUgCRwGDAyEB
0AH/A9AB/wPQAf8DtQH/AmoBYQHmAe0BrQEQAf8B9AHQAXYB/wP6Af8D+gH/A30B/wN/Af8DgAH/A4AB MAQAA28B8wM6AWAIAAH+Ad0BwQH/Ae0BgAEgAf8B7QFxAQIB/wHzAXMBAAH/AfoBdgEAAf8B/gF4AQAC
/wN+Af8DhAH/A7sB/wNqAf8BqAGAARwB/wFpAWMBSAH2hAAE/wGGAYMBfgH/A4EB/wOBAf8BhgGDAXsB /wF7AQgC/wGIAScC/wGiAVMB/wH+AYEBFwH/AfwBeAEEAf8B7AFvAQAB/wHBAVsBAAH/AYYBQQEDAf8B
/wHPAZQBAAH/Ad4BzAGfAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOTAf8BagFnAWIB eAFWATYB/wNjAd8E/wGsAZYBYAH/AYMBggF/Af8BhQGCAX0B/wGzAZMBRAH/Ac8BlAEAAf8B3gHMAZ8B
7gHvAbQBIQH/AfcB3AGXCf8DkQH/A4gB/wOHAf8DhwH/A4EB/wNXAf8D5gH/A6MB/wG2AZEBNgH/AYUB /wOwAf8DsAH/A7AB/wOwAf8DsAH/A7AB/wOwAf8DsAH/A6gB/wMCAQMDGgEjAzgBXANUAagDYgHXA3AB
agFAAfmEAAT/AYsBhgF5Af8DgQH/A4EB/wGOAYYBcQH/Ac8BlAEAAf8B3gHMAZ8B/wOhAf8DoQH/A6EB 8QOAAf4DgQH/A4EB/wOBAf8DgQH9A2gB8ANhAdQDUwGlAzYBWQMYASAIAAMaASQDUgGgAmMBSAH2AaIB
/wOhAf8DoQH/A6EB/wOhAf8DoQH/A6EB/wNLAY0B8AG+AT8B/wH0Ac0BbCH/A/sB/wPQAf8B1wGnATEB cwEAAf8BrgF8AQAB/wGwAX0BAAH/AagBeAEAAf8BlQFqAQAB/wKAAS0B/gFcAlkBxgNXAbUDFgEeCAAB
/wJhAV0B0YQABP8BpwGUAWcB/wGDAYIBfwH/AYUBgwF+Af8BsAGUAU4B/wHTAZcBAgH/AeABzgGfAf8D /wGyAW8B/wH9AYABEQH/AfwBdwEBAf8B/QF3AQAC/wF4AQAC/wF/AQ8C/wGSATsC/wGzAYMC/wHqAeAC
5wH/A+cB/wPnAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPAAf8DBwEJAWoBaAFiAe4B8QG8ATsB/wH6AeoB /wGQAT0C/wF7AQoB/wH8AXcBAAH/AeUBbAEAAf8BsQFUAQAB/wGEAUsBGgH/A2MB3wT/AdkBqgE3Af8B
wgH/A9wB/wN3Af8DaAH/A2gB/wNoAf8DMgn/AfIB3QGpAf8B6gGpAQgB/wM+AWqEAAT/AdcBsQFSAf8B vgGYATgB/wHAAZgBNgH/AdwBogEUAf8BzwGUAQAB/wHeAcwBnwH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D
mgGPAXQB/wGgAZIBbQH/AeABrwE3Af8B5wGpARAB/wHrAdUBoAH/A4EB/wOBAf8DgQH/A4EB/wOBAf8D gQH/A4EB/wOBAf8DkwH/RAADIAEtAmMBWgHpAb8BiAEAAf8BzQGVAQoB/wGwAYgBJwH/AXMBZAE/Af8B
gQH/A4EB/wOBAf8DkwH/BAADMwFRAWoCaAHwAfMBxgFYAf8B+gHnAbgW/wH+AfsB/wH5AeIBqgH/Ae8B TQFLAUcB/wFOAUsBQgH/AWYBVwExAf8BmgF0ARcB/wGkAXYBAwH/AXABTwEAAf8DQwF2BAEEAAH/AZoB
uAEtAf8DTgGWBAKEAAT/AfQBzQFsAf8B9AHLAWYB/wH0AcsBZQH/AfQBywFlAf8B8QHBAUkB/wH5AeMB QgL/AYMBFQH/Af4BegEEAv8BeAEAAv8BeAEAAv8BlQE/Av8BygGuAv8B2gHGAv8B7QHlAv8BlgFJAv8B
rAH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DmgH/CAADIgExA18ByQGgAYoBZwH6AfMB fAENAf8B/gF4AQAB/wH0AXMBAAH/AdABYgEAAf8BmgFOAQoB/wFjAl0B3wT/AeEBrgExAf8BvQGXATsB
ygFlAf8B+QHhAaYB/wH7Ae0BzAH/AfsB7AHIAf8B+AHdAZsB/wHGAZgBZwH+AmUBXgHiAz0BaAQBiABA /wHAAZgBNQH/AeMBpQEKAf8BzwGUAQAB/wHeAcwBnwH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB
/xAAAw8BEwNHAYIDZAHbAbQBngFvAfwDZwHqA1QBqAMoATuUAAFCAU0BPgcAAT4DAAEoAwABQAMAARAD /wPAAf8DrwH/CAADAgEDAwgBCgMhAS8DMQFOAz0BaANDAXYDRAF6A0MBdQM9AWcDMQFNAyABLgMHAQkE
AAEBAQABAQUAAYAXAAP/AwAB/wH8BgAB/wH8BgAB/wH5BgAB/wH5BgAB8AETBgABwAEDBgABgAEBBgAB AggAAmMBWgHpAdkBmgEAAf8B2gGjARwB/wKOAYwB/wOKAf8DlwH/A5sB/wORAf8DdAH/A0gB/wFDAUIB
gAEBBwABAQcAAQEHAAEBBwABAQcAAQEGAAGAAQEGAAHAAQMGAAHwAR8EAAs= 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
</value> </value>
</data> </data>
<metadata name="ctxmChangeStatus.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="ctxmChangeStatus.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View File

@ -0,0 +1,206 @@
namespace qtc_net_client_2.Forms
{
partial class StockMarketGame
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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();
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

View File

@ -81,7 +81,7 @@ namespace qtc_net_client_2.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to 3.4.1. /// Looks up a localized string similar to 4.0.
/// </summary> /// </summary>
internal static string AssemblyVersion { internal static string AssemblyVersion {
get { get {
@ -149,6 +149,16 @@ namespace qtc_net_client_2.Properties {
} }
} }
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap dollar_money {
get {
object obj = ResourceManager.GetObject("dollar-money", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap. /// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary> /// </summary>

View File

@ -124,6 +124,9 @@
<data name="SendIcon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="SendIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\SendIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Icons\SendIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="left-horn-animated" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Anims\left-horn-animated.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DefaultPfp" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="DefaultPfp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DefaultPfp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\DefaultPfp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
@ -157,6 +160,9 @@
<data name="MessageIcon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="MessageIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\MessageIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Icons\MessageIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="AssemblyVersion" xml:space="preserve">
<value>4.0</value>
</data>
<data name="LoginBanner" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="LoginBanner" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\LoginBanner.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\LoginBanner.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
@ -166,10 +172,7 @@
<data name="AcceptContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="AcceptContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\AcceptContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Icons\AcceptContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="left-horn-animated" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="dollar-money" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Anims\left-horn-animated.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Anims\dollar-money.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="AssemblyVersion" xml:space="preserve">
<value>3.4.1</value>
</data> </data>
</root> </root>