diff --git a/QtCNETAPI/Services/GatewayService/GatewayService.cs b/QtCNETAPI/Services/GatewayService/GatewayService.cs
index 415a63c..3a10100 100644
--- a/QtCNETAPI/Services/GatewayService/GatewayService.cs
+++ b/QtCNETAPI/Services/GatewayService/GatewayService.cs
@@ -12,7 +12,6 @@ namespace QtCNETAPI.Services.GatewayService
internal string gwBaseUri = GWUrl;
public Room? CurrentRoom { get; private set; }
- public bool InLobby { get; private set; }
public HubConnection? HubConnection { get; private set; }
@@ -120,29 +119,18 @@ namespace QtCNETAPI.Services.GatewayService
}
}
- public async Task JoinLobbyAsync()
+ public async Task JoinRoomAsync(Room? room = null)
{
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
- await HubConnection.SendAsync("JoinLobby", _apiService.CurrentUser);
- InLobby = true;
- CurrentRoom = null;
- }
-
- public async Task JoinRoomAsync(Room room)
- {
- if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
-
- if (InLobby == true)
+ // assume user is trying to join lobby if room is null (does not have db entry)
+ room ??= new Room
{
- await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser);
- InLobby = false;
- }
- else if (CurrentRoom != null)
- {
- await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
- }
+ Id = "LOBBY",
+ Name = "Lobby"
+ };
+ if (CurrentRoom != null) await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
await HubConnection.SendAsync("JoinRoom", _apiService.CurrentUser, room);
CurrentRoom = room;
}
@@ -151,23 +139,15 @@ namespace QtCNETAPI.Services.GatewayService
{
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
- if (InLobby)
- {
- await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser);
- InLobby = false;
- }
- else
- {
- await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
- CurrentRoom = null;
- }
+ if (CurrentRoom != null) await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom);
+ CurrentRoom = null;
}
public async Task PostMessageAsync(Message message)
{
if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made.");
- await HubConnection.SendAsync("SendMessage", _apiService.CurrentUser, message, InLobby, CurrentRoom);
+ await HubConnection.SendAsync("SendMessage", _apiService.CurrentUser, message, CurrentRoom);
}
public async Task SendDirectMessageAsync(UserInformationDto user, Message message)
diff --git a/QtCNETAPI/Services/GatewayService/IGatewayService.cs b/QtCNETAPI/Services/GatewayService/IGatewayService.cs
index 71e137d..f3ea43f 100644
--- a/QtCNETAPI/Services/GatewayService/IGatewayService.cs
+++ b/QtCNETAPI/Services/GatewayService/IGatewayService.cs
@@ -18,10 +18,7 @@ namespace QtCNETAPI.Services.GatewayService
/// The Current Room The Current User Is In
///
public Room? CurrentRoom { get; }
- ///
- /// Is The User Currently In The Lobby?
- ///
- public bool InLobby { get; }
+
///
/// The Current Connection To The Gateway
///
@@ -47,20 +44,13 @@ namespace QtCNETAPI.Services.GatewayService
///
public Task DisposeAsync();
- ///
- /// Joins The Lobby Of The Server
- ///
- ///
- /// Thrown if the function is called before the connection is established.
- public Task JoinLobbyAsync();
-
///
/// Joins The Current User To A Room On The Server
///
/// Room To Join
///
/// Thrown if the function is called before the connection is established.
- public Task JoinRoomAsync(Room room);
+ public Task JoinRoomAsync(Room? room = null);
///
/// Leaves The Current Room The Current User Is In
diff --git a/qtc-net-client-2/Forms/ChatRoom.Designer.cs b/qtc-net-client-2/Forms/ChatRoom.Designer.cs
index 5333e16..6881803 100644
--- a/qtc-net-client-2/Forms/ChatRoom.Designer.cs
+++ b/qtc-net-client-2/Forms/ChatRoom.Designer.cs
@@ -32,10 +32,11 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ChatRoom));
rtxtChatbox = new RichTextBox();
btnSend = new Button();
- rtxtChat = new RichTextBox();
lblRoomName = new Label();
lvUserList = new ListView();
ilStatusIcons = new ImageList(components);
+ lvMessages = new ListView();
+ ilProfileImages = new ImageList(components);
SuspendLayout();
//
// rtxtChatbox
@@ -59,17 +60,6 @@
btnSend.UseVisualStyleBackColor = true;
btnSend.Click += btnSend_Click;
//
- // rtxtChat
- //
- rtxtChat.Font = new Font("Segoe UI", 10F);
- rtxtChat.HideSelection = false;
- rtxtChat.Location = new Point(142, 43);
- rtxtChat.Name = "rtxtChat";
- rtxtChat.ReadOnly = true;
- rtxtChat.Size = new Size(463, 219);
- rtxtChat.TabIndex = 3;
- rtxtChat.Text = "";
- //
// lblRoomName
//
lblRoomName.AutoSize = true;
@@ -105,15 +95,34 @@
ilStatusIcons.Images.SetKeyName(2, "Away");
ilStatusIcons.Images.SetKeyName(3, "DND");
//
+ // lvMessages
+ //
+ lvMessages.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
+ lvMessages.LargeImageList = ilProfileImages;
+ lvMessages.Location = new Point(142, 43);
+ lvMessages.Name = "lvMessages";
+ lvMessages.Size = new Size(463, 219);
+ lvMessages.SmallImageList = ilProfileImages;
+ lvMessages.TabIndex = 10;
+ lvMessages.UseCompatibleStateImageBehavior = false;
+ lvMessages.View = View.List;
+ //
+ // ilProfileImages
+ //
+ ilProfileImages.ColorDepth = ColorDepth.Depth32Bit;
+ ilProfileImages.ImageStream = (ImageListStreamer)resources.GetObject("ilProfileImages.ImageStream");
+ ilProfileImages.TransparentColor = Color.Transparent;
+ ilProfileImages.Images.SetKeyName(0, "DefaultPFP");
+ //
// ChatRoom
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.DodgerBlue;
ClientSize = new Size(617, 334);
+ Controls.Add(lvMessages);
Controls.Add(lvUserList);
Controls.Add(lblRoomName);
- Controls.Add(rtxtChat);
Controls.Add(btnSend);
Controls.Add(rtxtChatbox);
FormBorderStyle = FormBorderStyle.FixedSingle;
@@ -131,9 +140,10 @@
#endregion
private RichTextBox rtxtChatbox;
private Button btnSend;
- private RichTextBox rtxtChat;
private Label lblRoomName;
private ListView lvUserList;
private ImageList ilStatusIcons;
+ private ListView lvMessages;
+ private ImageList ilProfileImages;
}
}
\ No newline at end of file
diff --git a/qtc-net-client-2/Forms/ChatRoom.cs b/qtc-net-client-2/Forms/ChatRoom.cs
index 55151ef..2c07078 100644
--- a/qtc-net-client-2/Forms/ChatRoom.cs
+++ b/qtc-net-client-2/Forms/ChatRoom.cs
@@ -1,7 +1,10 @@
using qtc_net_client_2.Services;
+using QtCNETAPI.Dtos.User;
using QtCNETAPI.Events;
+using QtCNETAPI.Models;
using QtCNETAPI.Services.ApiService;
using QtCNETAPI.Services.GatewayService;
+using System.Threading.Tasks;
namespace qtc_net_client_2.Forms
{
@@ -11,24 +14,26 @@ namespace qtc_net_client_2.Forms
IApiService _apiService;
AudioService AudioService = new();
+ private List RoomUserList = new();
public ChatRoom(IGatewayService gatewayService, IApiService apiService)
{
_gatewayService = gatewayService;
_apiService = apiService;
- InitializeComponent();
- }
- private void frmChat_Load(object sender, EventArgs e)
- {
// subscribe to server message event
_gatewayService.OnRoomMessageReceived += _gatewayService_OnServerMessageReceived;
_gatewayService.OnRoomUserListReceived += _gatewayService_OnRoomUserListReceived;
_gatewayService.OnRoomDeleted += _gatewayService_OnRoomDeleted;
_gatewayService.OnGuestUserJoin += _gatewayService_OnGuestUserJoin;
- 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"; }
+ InitializeComponent();
+ }
+ private void frmChat_Load(object sender, EventArgs e)
+ {
+ if (_gatewayService.CurrentRoom != null) { Text = $"QtC.NET Client - Chat Room - {_gatewayService.CurrentRoom.Name}"; lblRoomName.Text = _gatewayService.CurrentRoom.Name; }
+
+ RoomUserList.Clear();
lvUserList.Clear();
// always add current user to list i guess
@@ -41,7 +46,7 @@ namespace qtc_net_client_2.Forms
_gatewayService.OnRoomMessageReceived -= _gatewayService_OnServerMessageReceived;
_gatewayService.OnRoomUserListReceived -= _gatewayService_OnRoomUserListReceived;
- if (_gatewayService.CurrentRoom != null || _gatewayService.InLobby)
+ if (_gatewayService.CurrentRoom != null)
{
// leave any room user is in
await _gatewayService.LeaveRoomAsync();
@@ -57,7 +62,7 @@ namespace qtc_net_client_2.Forms
// send it and clear text box
await _gatewayService.PostMessageAsync(message);
- rtxtChatbox.Clear();
+ rtxtChatbox.Text = string.Empty;
AudioService.PlaySoundEffect("sndSendClick");
}
}
@@ -101,11 +106,12 @@ namespace qtc_net_client_2.Forms
}
}
- private void _gatewayService_OnServerMessageReceived(object? sender, EventArgs e)
+ private async void _gatewayService_OnServerMessageReceived(object? sender, EventArgs e)
{
var msgEventArgs = (ServerMessageEventArgs)e;
+ var user = RoomUserList.FirstOrDefault(e => e.Username == msgEventArgs.Message.Split(':')[0]);
- AddMessage(msgEventArgs.Message);
+ AddMessage(msgEventArgs.Message, user?.Id);
if (!msgEventArgs.Message.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage");
}
@@ -115,12 +121,23 @@ namespace qtc_net_client_2.Forms
if (IsHandleCreated && !IsDisposed)
{
- Invoke(delegate ()
+ Invoke(async delegate ()
{
+ RoomUserList.Clear();
lvUserList.Clear();
foreach (var user in args.UserList)
{
lvUserList.Items.Add(user.Username, user.Status);
+ RoomUserList.Add(user);
+
+ // TODO - probably do this only when a message is received (requires response model change)
+ var pfpRes = await _apiService.GetUserProfilePic(user.Id);
+ if(pfpRes != null && pfpRes.Success && pfpRes.Data != null)
+ {
+ using var ms = new MemoryStream(pfpRes.Data);
+ using var bmp = new Bitmap(ms);
+ ilProfileImages.Images.Add(user.Id, bmp);
+ }
}
});
}
@@ -139,6 +156,7 @@ namespace qtc_net_client_2.Forms
{
AddMessage($"[SERVER] This Room Was Deleted By An Admin.");
lvUserList.Clear();
+ RoomUserList.Clear();
lvUserList.Enabled = false;
rtxtChatbox.Enabled = false;
@@ -148,13 +166,13 @@ namespace qtc_net_client_2.Forms
}
- private void AddMessage(string message)
+ private void AddMessage(string message, string? userId = null)
{
if(IsHandleCreated && !IsDisposed)
{
Invoke(delegate ()
{
- rtxtChat.AppendText(message + Environment.NewLine);
+ lvMessages.Items.Add(message, userId ?? "DefaultPfp");
});
}
}
diff --git a/qtc-net-client-2/Forms/ChatRoom.resx b/qtc-net-client-2/Forms/ChatRoom.resx
index 9a3de90..5fac71a 100644
--- a/qtc-net-client-2/Forms/ChatRoom.resx
+++ b/qtc-net-client-2/Forms/ChatRoom.resx
@@ -124,93 +124,222 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
- SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA+hMAAAJNU0Z0AUkBTAIBAQQB
- AAHAAQABwAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
+ SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA4hMAAAJNU0Z0AUkBTAIBAQQB
+ AAHoAQAB6AEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AC4AAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B
0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYB
BwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekD
- YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1UB9QMkAfsDPAH+AzwB/gMkAfsDUwH0A2IB
- 4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBSwFaAUsB9QEhAVgBIQH7ARgBWAEYAf4BGAFYARgB/gEhAVgB
- IQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAUsCWgH1ASECWAH7ARgCWAH+ARgCWAH+ASEC
- WAH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAksBWgH1AiEBWAH7AhgBWAH+AhgBWAH+AiEB
- WAH7A1MB9ANiAeEDUQGhAx4BKgwAAxsBJQNYAb0DWgHyA0AB/gMwAf8DOQH/AzwB/wM2Af8DKgH/AyQB
- /wNAAf0DXgHwA1YBsgMaASMIAAMbASUDWAG9A1oB8gEYAWABGAH+AQABVwEAAf8BAAFnAQAB/wEAAWwB
- AAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/ATABQAEwAf0BWgFeAVoB8ANWAbIBGQEaARkBIwgAAxsB
- JQNYAb0DWgHyARgCYAH+AQACVwH/AQACZwH/AQACbAH/AQACYQH/AQACTAH/AQACQAH/ATACQAH9AVoC
- XgHwA1YBsgEZAhoBIwgAAxsBJQNYAb0DWgHyAhgBYAH+AgABVwH/AgABZwH/AgABbAH/AgABYQH/AgAB
- TAH/AgABQAH/AjABQAH9AloBXgHwA1YBsgIZARoBIwQAAwMBBANSAaUDYAHzA0kB/wNVAf8DZQH/A3EB
- /wN1Af8DcQH/A2QB/wNMAf8DMQH/AzwB/gNiAe4DUAGaAwMBBAMDAQQBUgFTAVIBpQFWAW8BVgHzAQAB
- ggEAAf8BAAGZAQAB/wEAAbYBAAH/AQABzAEAAf8BAAHTAQAB/wEAAcsBAAH/AQABswEAAf8BAAGIAQAB
- /wEAAVcBAAH/ARgBWAEYAf4BXwFiAV8B7gNQAZoDAwEEAwMBBAFSAlMBpQFWAm8B8wEAAoIB/wEAApkB
- /wEAArYB/wEAAswB/wEAAtMB/wEAAssB/wEAArMB/wEAAogB/wEAAlcB/wEYAlgB/gFfAmIB7gNQAZoD
- AwEEAwMBBAJSAVMBpQJWAW8B8wIAAYIB/wIAAZkB/wIAAbYB/wIAAcwB/wIAAdMB/wIAAcsB/wIAAbMB
- /wIAAYgB/wIAAVcB/wIYAVgB/gJfAWIB7gNQAZoDAwEEAy0BRANgAegDewH+A24B/wN7Af8DhQH/A4oB
- /wOMAf8DigH/A4UB/wN2Af8DVwH/AzIB/wNAAf0DXgHdAyoBPwMtAUQBYAFpAWAB6AEYAYQBGAH+AQAB
- xgEAAf8BAAHcAQAB/wEAAe4BAAH/AQAB+AEAAf8BAAH7AQAB/wEAAfkBAAH/AQAB7wEAAf8BAAHUAQAB
- /wEAAZwBAAH/AQABWgEAAf8BMAFAATAB/QNeAd0DKgE/Ay0BRAFgAmkB6AEYAoQB/gEAAsYB/wEAAtwB
- /wEAAu4B/wEAAvgB/wEAAvsB/wEAAvkB/wEAAu8B/wEAAtQB/wEAApwB/wEAAloB/wEwAkAB/QNeAd0D
- KgE/Ay0BRAJgAWkB6AIYAYQB/gIAAcYB/wIAAdwB/wIAAe4B/wIAAfgB/wIAAfsB/wIAAfkB/wIAAe8B
- /wIAAdQB/wIAAZwB/wIAAVoB/wIwAUAB/QNeAd0DKgE/A04BlQN3AfgDfwH/A4UB/wOKAf8DjQH/A44B
- /wOOAf8DjgH/A40B/wOJAf8DdwH/A00B/wMlAf8DWgHyA0oBiwNOAZUBQgGBAUIB+AEAAeUBAAH/AQAB
- 7wEAAf8BAAH4AQAB/wEAAf0BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAH2AQAB
- /wEAAdUBAAH/AQABiwEAAf8BAAFBAQAB/wNaAfIDSgGLA04BlQFCAoEB+AEAAuUB/wEAAu8B/wEAAvgB
- /wEAAv0B/wEAA/8BAAP/AQAD/wEAAv4B/wEAAvYB/wEAAtUB/wEAAosB/wEAAkEB/wNaAfIDSgGLA04B
- lQJCAYEB+AIAAeUB/wIAAe8B/wIAAfgB/wIAAf0B/wIAAv8CAAL/AgAC/wIAAf4B/wIAAfYB/wIAAdUB
- /wIAAYsB/wIAAUEB/wNaAfIDSgGLA18B0wN+AfwDkwH/A44B/wONAf8DjgH/A44B/wOOAf8DjgH/A44B
- /wONAf8DhQH/A2cB/wM0Af8DQQH5A1oBxAFbAV8BWwHTASsBsAErAfwBDgH7AQ4B/wEDAf0BAwH/AQAB
- /gEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/QEAAf8BAAHvAQAB
- /wEAAbkBAAH/AQABXQEAAf8DQQH5A1oBxAFbAl8B0wErArAB/AEOAvsB/wEDAv0B/wEAAv4B/wEAA/8B
- AAP/AQAD/wEAA/8BAAP/AQAC/QH/AQAC7wH/AQACuQH/AQACXQH/A0EB+QNaAcQCWwFfAdMCKwGwAfwC
- DgH7Af8CAwH9Af8CAAH+Af8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAf0B/wIAAe8B/wIAAbkB/wIAAV0B
- /wNBAfkDWgHEA24B9QOAAf4DnwH/A5MB/wOPAf8DjgH/A44B/wOOAf8DjgH/A44B/wOOAf8DiwH/A3cB
- /wNIAf8DQAH9A2IB4QFTAXYBUwH1ATwBzwE8Af4BJwH/AScB/wELAf8BCwH/AQEB/wEBAf8BAAH/AQAB
- /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH5AQAB/wEAAdYBAAH/AQAB
- gQEAAf8BMAFAATAB/QNiAeEBUwJ2AfUBPALPAf4BJwP/AQsD/wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD
- /wEAA/8BAAL5Af8BAALWAf8BAAKBAf8BMAJAAf0DYgHhAlMBdgH1AjwBzwH+AicC/wILAv8CAQL/AgAC
- /wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB+QH/AgAB1gH/AgABgQH/AjABQAH9A2IB4QNtAfYDgAH+A6sB
- /wOZAf8DkAH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wN/Af8DVQH/A0AB/QNeAeIBSAF6AUgB
- 9gFfAc8BXwH+AUIB/wFCAf8BGQH/ARkB/wEEAf8BBAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
- /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/QEAAf8BAAHkAQAB/wEAAZgBAAH/ATABQAEwAf0DXgHiAUgC
- egH2AV8CzwH+AUID/wEZA/8BBAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC/QH/AQAC5AH/AQAC
- mAH/ATACQAH9A14B4gJIAXoB9gJfAc8B/gJCAv8CGQL/AgQC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC
- /wIAAf0B/wIAAeQB/wIAAZgB/wIwAUAB/QNeAeIDYQHWA34B/AO4Af8DowH/A5MB/wOOAf8DjgH/A44B
- /wOOAf8DjgH/A44B/wONAf8DggH/A1wB/wNNAfoDWgHHAVwBYQFcAdYBZAG0AWQB/AFfAf8BXwH/AS8B
- /wEvAf8BDAH/AQwB/wEBAf8BAQH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
- /wEAAf4BAAH/AQAB6gEAAf8BAAGlAQAB/wEsAU0BLAH6A1oBxwFcAmEB1gFkArQB/AFfA/8BLwP/AQwD
- /wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv4B/wEAAuoB/wEAAqUB/wEsAk0B+gNaAccCXAFhAdYC
- ZAG0AfwCXwL/Ai8C/wIMAv8CAQL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH+Af8CAAHqAf8CAAGlAf8C
- LAFNAfoDWgHHA1ABmgOIAfkDxQH/A7IB/wOcAf8DkQH/A44B/wOOAf8DjgH/A44B/wOPAf8DjgH/A4MB
- /wNgAf8DWgHyA0wBkANQAZoBagGRAWoB+QF8Af8BfAH/AVEB/wFRAf8BHwH/AR8B/wEHAf8BBwH/AQEB
- /wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAgH/AQIB/wECAf4BAgH/AQAB6wEAAf8BAAGtAQAB
- /wFaAWsBWgHyA0wBkANQAZoBagKRAfkBfAP/AVED/wEfA/8BBwP/AQED/wEAA/8BAAP/AQAD/wECA/8B
- AgL+Af8BAALrAf8BAAKtAf8BWgJrAfIDTAGQA1ABmgJqAZEB+QJ8Av8CUQL/Ah8C/wIHAv8CAQL/AgAC
- /wIAAv8CAAL/AgIC/wICAf4B/wIAAesB/wIAAa0B/wJaAWsB8gNMAZADLwFJA2wB6wOgAf4DxgH/A64B
- /wOcAf8DkwH/A5AB/wOPAf8DkAH/A5MB/wOTAf8DhQH/A04B/QNgAeADLQFFAy8BSQNsAesBgAHPAYAB
- /gF/Af8BfwH/AUkB/wFJAf8BHwH/AR8B/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB/wEFAf8BBQH/AQoB
- /wEKAf8BCgH+AQoB/wEBAe0BAQH/ATABtgEwAf0BYAFmAWAB4AMtAUUDLwFJA2wB6wGAAs8B/gF/A/8B
- SQP/AR8D/wEMA/8BBQP/AQMD/wEFA/8BCgP/AQoC/gH/AQEC7QH/ATACtgH9AWACZgHgAy0BRQMvAUkD
- bAHrAoABzwH+An8C/wJJAv8CHwL/AgwC/wIFAv8CAwL/AgUC/wIKAv8CCgH+Af8CAQHtAf8CMAG2Af0C
- YAFmAeADLQFFAwMBBANWAa4DcAH1A9kB/wPLAf8DtwH/A6cB/wOdAf8DmgH/A5wB/wOfAf8DmwH/A4kB
- /wNoAfADUgGjAwMBBAMDAQQDVgGuAW4BdgFuAfUBqAH/AagB/wGJAf8BiQH/AVwB/wFcAf8BNwH/ATcB
- /wEiAf8BIgH/ARsB/wEbAf8BHwH/AR8B/wEmAf8BJgH/AR0B/wEdAf8BBQHzAQUB/wFaAWgBWgHwA1IB
- owMDAQQDAwEEA1YBrgFuAnYB9QGoA/8BiQP/AVwD/wE3A/8BIgP/ARsD/wEfA/8BJgP/AR0D/wEFAvMB
- /wFaAmgB8ANSAaMDAwEEAwMBBANWAa4CbgF2AfUCqAL/AokC/wJcAv8CNwL/AiIC/wIbAv8CHwL/AiYC
- /wIdAv8CBQHzAf8CWgFoAfADUgGjAwMBBAQAAxwBJwNdAccDdwH2A68B/gPXAf8DzAH/A8IB/wO7Af8D
- twH/A7EB/wOAAf4DaAH0A1kBvAMbASYIAAMcAScDXQHHAXIBegFyAfYBhwHPAYcB/gGlAf8BpQH/AYsB
- /wGLAf8BdAH/AXQB/wFmAf8BZgH/AVwB/wFcAf8BTgH/AU4B/wFIAc8BSAH+AVMBdwFTAfQBVwFZAVcB
- vAMbASYIAAMcAScDXQHHAXICegH2AYcCzwH+AaUD/wGLA/8BdAP/AWYD/wFcA/8BTgP/AUgCzwH+AVMC
- dwH0AVcCWQG8AxsBJggAAxwBJwNdAccCcgF6AfYChwHPAf4CpQL/AosC/wJ0Av8CZgL/AlwC/wJOAv8C
- SAHPAf4CUwF3AfQCVwFZAbwDGwEmDAADIQEwA1kBtgNnAe4DkwH6A74B/QPUAf8DzAH/A74B/QOEAfkD
- bAHrA1UBrAMfASwQAAMhATADWQG2AWUBaQFlAe4BfQGfAX0B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB
- /wFeAb4BXgH9AWgBkQFoAfkBYQFsAWEB6wNVAawDHwEsEAADIQEwA1kBtgFlAmkB7gF9Ap8B+gGuAr4B
- /QGfA/8BjAP/AV4CvgH9AWgCkQH5AWECbAHrA1UBrAMfASwQAAMhATADWQG2AmUBaQHuAn0BnwH6Aq4B
- vgH9Ap8C/wKMAv8CXgG+Af0CaAGRAfkCYQFsAesDVQGsAx8BLBQAAwYBBwM2AVgDVQGsA2YB5QOgAfwD
- kwH7A2UB4gNTAacDMwFRAwYBBxgAAwYBBwM2AVgDVQGsA2YB5QF+AbQBfgH8AW0BngFtAfsDZQHiA1MB
- pwMzAVEDBgEHGAADBgEHAzYBWANVAawDZgHlAX4CtAH8AW0CngH7A2UB4gNTAacDMwFRAwYBBxgAAwYB
- BwM2AVgDVQGsA2YB5QJ+AbQB/AJtAZ4B+wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwAB
- QAMAASADAAEBAQABAQYAAQEWAAP/gQAB4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEB
- gAEBAYABAQGAAQFQAAGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeAB
- Bws=
+ YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1oB9QMkAfsDQQH+A0EB/gMkAfsDUwH0A2IB
+ 4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBUwFaAVMB9QEhAV0BIQH7AR0BXQEdAf4BHQFdAR0B/gEhAV0B
+ IQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAVMCWgH1ASECXQH7AR0CXQH+AR0CXQH+ASEC
+ XQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAlMBWgH1AiEBXQH7Ah0BXQH+Ah0BXQH+AiEB
+ XQH7A1MB9ANiAeEDUQGhAx4BKgwAAxsBJQNYAb0DWgHyA0UB/gMwAf8DOQH/AzwB/wM2Af8DKgH/AyQB
+ /wNAAf0DXgHwA1YBsgMaASMIAAMbASUDWAG9A1oB8gEdAWUBHQH+AQABVwEAAf8BAAFnAQAB/wEAAWwB
+ AAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/AToBQAE6Af0DXgHwA1YBsgEZARoBGQEjCAADGwElA1gB
+ vQNaAfIBHQJlAf4BAAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8BAAJAAf8BOgJAAf0DXgHwA1YB
+ sgEZAhoBIwgAAxsBJQNYAb0DWgHyAh0BZQH+AgABVwH/AgABZwH/AgABbAH/AgABYQH/AgABTAH/AgAB
+ QAH/AjoBQAH9A14B8ANWAbICGQEaASMEAAMDAQQDUgGlA2AB8wNJAf8DVQH/A2UB/wNxAf8DdQH/A3EB
+ /wNkAf8DTAH/AzEB/wNBAf4DYgHuA1ABmgMDAQQDAwEEAVIBUwFSAaUBXQFvAV0B8wEAAYIBAAH/AQAB
+ mQEAAf8BAAG2AQAB/wEAAcwBAAH/AQAB0wEAAf8BAAHLAQAB/wEAAbMBAAH/AQABiAEAAf8BAAFXAQAB
+ /wEdAV0BHQH+A2IB7gNQAZoDAwEEAwMBBAFSAlMBpQFdAm8B8wEAAoIB/wEAApkB/wEAArYB/wEAAswB
+ /wEAAtMB/wEAAssB/wEAArMB/wEAAogB/wEAAlcB/wEdAl0B/gNiAe4DUAGaAwMBBAMDAQQCUgFTAaUC
+ XQFvAfMCAAGCAf8CAAGZAf8CAAG2Af8CAAHMAf8CAAHTAf8CAAHLAf8CAAGzAf8CAAGIAf8CAAFXAf8C
+ HQFdAf4DYgHuA1ABmgMDAQQDLQFEA2AB6AOAAf4DbgH/A3sB/wOFAf8DigH/A4wB/wOKAf8DhQH/A3YB
+ /wNXAf8DMgH/A0AB/QNeAd0DKgE/Ay0BRAFgAWkBYAHoAR0BgAEdAf4BAAHGAQAB/wEAAdwBAAH/AQAB
+ 7gEAAf8BAAH4AQAB/wEAAfsBAAH/AQAB+QEAAf8BAAHvAQAB/wEAAdQBAAH/AQABnAEAAf8BAAFaAQAB
+ /wE6AUABOgH9A14B3QMqAT8DLQFEAWACaQHoAR0CgAH+AQACxgH/AQAC3AH/AQAC7gH/AQAC+AH/AQAC
+ +wH/AQAC+QH/AQAC7wH/AQAC1AH/AQACnAH/AQACWgH/AToCQAH9A14B3QMqAT8DLQFEAmABaQHoAh0B
+ gAH+AgABxgH/AgAB3AH/AgAB7gH/AgAB+AH/AgAB+wH/AgAB+QH/AgAB7wH/AgAB1AH/AgABnAH/AgAB
+ WgH/AjoBQAH9A14B3QMqAT8DTgGVA3cB+AN/Af8DhQH/A4oB/wONAf8DjgH/A44B/wOOAf8DjQH/A4kB
+ /wN3Af8DTQH/AyUB/wNaAfIDSgGLA04BlQFHAXwBRwH4AQAB5QEAAf8BAAHvAQAB/wEAAfgBAAH/AQAB
+ /QEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH+AQAB/wEAAfYBAAH/AQAB1QEAAf8BAAGLAQAB
+ /wEAAUEBAAH/A1oB8gNKAYsDTgGVAUcCfAH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8B
+ AAP/AQAC/gH/AQAC9gH/AQAC1QH/AQACiwH/AQACQQH/A1oB8gNKAYsDTgGVAkcBfAH4AgAB5QH/AgAB
+ 7wH/AgAB+AH/AgAB/QH/AgAC/wIAAv8CAAL/AgAB/gH/AgAB9gH/AgAB1QH/AgABiwH/AgABQQH/A1oB
+ 8gNKAYsDXwHTA34B/AOTAf8DjgH/A40B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOFAf8DZwH/AzQB
+ /wNBAfkDWgHEAVsBXwFbAdMBKwGkASsB/AEOAfsBDgH/AQMB/QEDAf8BAAH+AQAB/wEAAf8BAAH/AQAB
+ /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH9AQAB/wEAAe8BAAH/AQABuQEAAf8BAAFdAQAB
+ /wNBAfkDWgHEAVsCXwHTASsCpAH8AQ4C+wH/AQMC/QH/AQAC/gH/AQAD/wEAA/8BAAP/AQAD/wEAA/8B
+ AAL9Af8BAALvAf8BAAK5Af8BAAJdAf8DQQH5A1oBxAJbAV8B0wIrAaQB/AIOAfsB/wIDAf0B/wIAAf4B
+ /wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB7wH/AgABuQH/AgABXQH/A0EB+QNaAcQDbgH1A4AB
+ /gOfAf8DkwH/A48B/wOOAf8DjgH/A44B/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAVkB
+ bgFZAfUBQQHFAUEB/gEnAf8BJwH/AQsB/wELAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
+ /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wE6AUABOgH9A2IB
+ 4QFZAm4B9QFBAsUB/gEnA/8BCwP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAvkB/wEAAtYB
+ /wEAAoEB/wE6AkAB/QNiAeECWQFuAfUCQQHFAf4CJwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC
+ /wIAAv8CAAH5Af8CAAHWAf8CAAGBAf8COgFAAf0DYgHhA2MB9gOAAf4DqwH/A5kB/wOQAf8DjgH/A44B
+ /wOOAf8DjgH/A44B/wOOAf8DjQH/A38B/wNVAf8DQAH9A14B4gFIAXUBSAH2AWQBxQFkAf4BQgH/AUIB
+ /wEZAf8BGQH/AQQB/wEEAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
+ /wEAAf8BAAH9AQAB/wEAAeQBAAH/AQABmAEAAf8BOgFAAToB/QNeAeIBSAJ1AfYBZALFAf4BQgP/ARkD
+ /wEEA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALkAf8BAAKYAf8BOgJAAf0DXgHiAkgB
+ dQH2AmQBxQH+AkIC/wIZAv8CBAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB5AH/AgAB
+ mAH/AjoBQAH9A14B4gNhAdYDfgH8A7gB/wOjAf8DkwH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B
+ /wOCAf8DXAH/A00B+gNaAccBXAFhAVwB1gFkAaoBZAH8AV8B/wFfAf8BLwH/AS8B/wEMAf8BDAH/AQEB
+ /wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAHqAQAB
+ /wEAAaUBAAH/ATEBTQExAfoDWgHHAVwCYQHWAWQCqgH8AV8D/wEvA/8BDAP/AQED/wEAA/8BAAP/AQAD
+ /wEAA/8BAAP/AQAC/gH/AQAC6gH/AQACpQH/ATECTQH6A1oBxwJcAWEB1gJkAaoB/AJfAv8CLwL/AgwC
+ /wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAf4B/wIAAeoB/wIAAaUB/wIxAU0B+gNaAccDUAGaA4MB
+ +QPFAf8DsgH/A5wB/wORAf8DjgH/A44B/wOOAf8DjgH/A48B/wOOAf8DgwH/A2AB/wNaAfIDTAGQA1AB
+ mgFqAYwBagH5AXwB/wF8Af8BUQH/AVEB/wEfAf8BHwH/AQcB/wEHAf8BAQH/AQEB/wEAAf8BAAH/AQAB
+ /wEAAf8BAAH/AQAB/wECAf8BAgH/AQIB/gECAf8BAAHrAQAB/wEAAa0BAAH/AVoBawFaAfIDTAGQA1AB
+ mgFqAowB+QF8A/8BUQP/AR8D/wEHA/8BAQP/AQAD/wEAA/8BAAP/AQID/wECAv4B/wEAAusB/wEAAq0B
+ /wFaAmsB8gNMAZADUAGaAmoBjAH5AnwC/wJRAv8CHwL/AgcC/wIBAv8CAAL/AgAC/wIAAv8CAgL/AgIB
+ /gH/AgAB6wH/AgABrQH/AloBawHyA0wBkAMvAUkDbAHrA5YB/gPGAf8DrgH/A5wB/wOTAf8DkAH/A48B
+ /wOQAf8DkwH/A5MB/wOFAf8DSQH9A2AB4AMtAUUDLwFJA2wB6wGAAcUBgAH+AX8B/wF/Af8BSQH/AUkB
+ /wEfAf8BHwH/AQwB/wEMAf8BBQH/AQUB/wEDAf8BAwH/AQUB/wEFAf8BCgH/AQoB/wEKAf4BCgH/AQEB
+ 7QEBAf8BOgG2AToB/QFgAWYBYAHgAy0BRQMvAUkDbAHrAYACxQH+AX8D/wFJA/8BHwP/AQwD/wEFA/8B
+ AwP/AQUD/wEKA/8BCgL+Af8BAQLtAf8BOgK2Af0BYAJmAeADLQFFAy8BSQNsAesCgAHFAf4CfwL/AkkC
+ /wIfAv8CDAL/AgUC/wIDAv8CBQL/AgoC/wIKAf4B/wIBAe0B/wI6AbYB/QJgAWYB4AMtAUUDAwEEA1YB
+ rgNuAfUD2QH/A8sB/wO3Af8DpwH/A50B/wOaAf8DnAH/A58B/wObAf8DiQH/A2gB8ANSAaMDAwEEAwMB
+ BANWAa4DbgH1AagB/wGoAf8BiQH/AYkB/wFcAf8BXAH/ATcB/wE3Af8BIgH/ASIB/wEbAf8BGwH/AR8B
+ /wEfAf8BJgH/ASYB/wEdAf8BHQH/AQUB8wEFAf8BXgFoAV4B8ANSAaMDAwEEAwMBBANWAa4DbgH1AagD
+ /wGJA/8BXAP/ATcD/wEiA/8BGwP/AR8D/wEmA/8BHQP/AQUC8wH/AV4CaAHwA1IBowMDAQQDAwEEA1YB
+ rgNuAfUCqAL/AokC/wJcAv8CNwL/AiIC/wIbAv8CHwL/AiYC/wIdAv8CBQHzAf8CXgFoAfADUgGjAwMB
+ BAQAAxwBJwNdAccDcgH2A6UB/gPXAf8DzAH/A8IB/wO7Af8DtwH/A7EB/wOAAf4DaAH0A1kBvAMbASYI
+ AAMcAScDXQHHAWkBdQFpAfYBgAHFAYAB/gGlAf8BpQH/AYsB/wGLAf8BdAH/AXQB/wFmAf8BZgH/AVwB
+ /wFcAf8BTgH/AU4B/wFNAcUBTQH+AVMBcQFTAfQBVwFZAVcBvAMbASYIAAMcAScDXQHHAWkCdQH2AYAC
+ xQH+AaUD/wGLA/8BdAP/AWYD/wFcA/8BTgP/AU0CxQH+AVMCcQH0AVcCWQG8AxsBJggAAxwBJwNdAccC
+ aQF1AfYCgAHFAf4CpQL/AosC/wJ0Av8CZgL/AlwC/wJOAv8CTQHFAf4CUwFxAfQCVwFZAbwDGwEmDAAD
+ IQEwA1kBtgNiAe4DhAH6A74B/QPUAf8DzAH/A74B/QN/AfkDbAHrA1UBrAMfASwQAAMhATADWQG2AWIB
+ ZAFiAe4BfQGTAX0B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB/wFZAb4BWQH9AWgBjAFoAfkBYQFsAWEB
+ 6wNVAawDHwEsEAADIQEwA1kBtgFiAmQB7gF9ApMB+gGuAr4B/QGfA/8BjAP/AVkCvgH9AWgCjAH5AWEC
+ bAHrA1UBrAMfASwQAAMhATADWQG2AmIBZAHuAn0BkwH6Aq4BvgH9Ap8C/wKMAv8CWQG+Af0CaAGMAfkC
+ YQFsAesDVQGsAx8BLBQAAwYBBwM2AVgDVQGsA2YB5QORAfwDjgH7A2UB4gNTAacDMwFRAwYBBxgAAwYB
+ BwM2AVgDVQGsA2YB5QF+AaoBfgH8AWMBmQFjAfsDZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYBWANVAawD
+ ZgHlAX4CqgH8AWMCmQH7A2UB4gNTAacDMwFRAwYBBxgAAwYBBwM2AVgDVQGsA2YB5QJ+AaoB/AJjAZkB
+ +wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAB
+ 4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQFQAAGAAQEBgAEBAYAB
+ AQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeABBws=
+
+
+
+ 132, 12
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
+ LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
+ SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAGBwAAAJNU0Z0AUkBTAMBAQAB
+ EAEAARABAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAB
+ UgFHAUIBgAFSAUcBQgGAAVIBRwFCAYABUgFGAUIBgAFSAUYBQgGAAVIBRwFCAYABUgFHAUIBgAFRAUYB
+ QgGAAVABRgFCAYABSwFFAUIBgAFGAUUBQgGAAUkBRwFCAYABTAFKAUIBgAFPAUsBQwGAAVEBTQFDAYAB
+ UgFNAUMBgAFSAU0BQgGAAVEBTQFCAYABUQFNAUMBgAFPAUsBQwGAAUwBSQFCAYABSQFHAUIBgAFGAUUB
+ QgGAAUgBRQFCAYABSgFEAUIBgAFOAUUBQgGAAVIBRgFCAYABUgFGAUIBgAFSAUcBQgGAAVIBRwFCAYAB
+ UgFHAUIBgAErAioBQP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQEC/wFHAQEC/wFIAQAB
+ /wHtAUYBAQH/AdsBQwECAf8BkQE2AQEB/wFGASkBAAH/AXUBUAEBAf8BowF3AQIB/wHMAZABCQH/AfQB
+ qAEQAf8B+QGtAQgB/wH+AbEBAAH/AfcBrgEGAf8B7wGrAQwB/wHKAY4BBwH/AaUBcAECAf8BcAFOAQEB
+ /wE7ASwBAAH/AVkBJwEAAf8BdwEiAQAB/wG7ATQBAgH/Af4BRgEEAv8BRwEDAv8BRwEBAv8BRwEBAv8B
+ RwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIC/wFGAQMB/wH7AUcBAQH/AfcB
+ SAEAAf8B2gFQAQEB/wG9AVgBAQH/Aa4BYwEBAf8BoAFvAQAB/wG4AYIBAQH/AdEBlgEBAf8B5AGjAQUB
+ /wH4Aa8BCQH/AfsBsQEFAv8BswEBAf8B+wGxAQQB/wH3AbABCAH/AeQBogEEAf8B0QGUAQEB/wG3AYMB
+ AgH/AZ0BcgECAf8BgwFRAQEB/wFoATEBAAH/AZQBMwEBAf8BwQE2AQMB/wHgAT8BAgL/AUgBAQL/AUcB
+ AQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B9wFGAQIB
+ /wHvAUcBAAH/AccBWgEAAf8BnwFtAQAB/wHMAZEBAAH/AfkBtAEAAf8B/AG1AQAC/wG1AQAB/wH9AbYB
+ AQH/AfsBtgEBAf8B/QG1AQEC/wG0AQEC/wG0AQIC/wG0AQMB/wH+AbYBAgH/Af0BtwEAAf8B/gG3AQIC
+ /wG3AQQB/wGsAXwBAgH/AVkBQAEAAf8BbgEzAQEB/wGDASUBAQH/AcEBNwEBAf8B/gFIAQAC/wFIAQEC
+ /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAgL/AUcBAgH/AfIBTAEBAf8B
+ 5gFSAQAB/wHaAXEBAAH/Ac8BkAEAAf8B5gGiAQAB/wH8AbUBAQH/Af4BtQEBAv8BtQEBAf8B/gG1AQEB
+ /wH9AbYBAQH/Af4BtQEBAv8BtQEBAv8BtQECAv8BtQECAv8BtQEBAf8B/gG2AQEB/wH9AbQBAQH/AfsB
+ sgECAf8B1AGYAQMB/wGsAX8BAwH/AYcBVQECAf8BYwErAQEB/wGvATkBAQH/AfwBSAEBAf8B/gFHAQEC
+ /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQL/AUkBAAH/Ae4BUwEAAf8B
+ 3AFcAQAB/wHuAYgBAAL/AbMBAAL/AbQBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUB
+ AQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQH/AfsBsQEBAf8B9wGsAQAB/wH7AbUBAwL/Ab4B
+ BgH/AaEBdwEEAf8BQgEwAQEB/wGeATwBAgH/AfoBRwECAf8B/QFHAQIC/wFHAQEB/wFSAUcBQgGA/wCB
+ AAH/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQL/AUkBAAH/AfYBZAEQAf8B7gF/ASEB/wH2AZoBEAL/AbUB
+ AAL/AbUBAQL/AbUBAQL/AbUBAgL/AbUBAgL/AbUBAgL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUB
+ AQL/AbUBAQL/AbUBAQH/Af0BswEBAf8B+wGxAQEB/wH9AbUBAwL/AboBBQH/AaQBdwEDAf8BSQE0AQEB
+ /wGjAT0BAgH/Af0BRgEDAf8B/gFHAQIC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUgBAQH/Af4BSAEAAv8BdQEhAv8BogFBAv8BrAEhAv8BtgEAAv8BtgEBAv8BtQEBAv8BtQECAv8B
+ tAEDAv8BtQECAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8B
+ tQEBAv8BtgEDAv8BtgEEAf8BqAF3AQIB/wFQATcBAAH/AagBPgECAv8BRQEEAv8BRgEDAv8BRwEBAf8B
+ UgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFIAQEC/wFfARMC/wF3ASYC/wGcASgC
+ /wHCASoC/wG8ARUC/wG2AQEC/wG1AQEC/wG1AQIC/wG1AQIC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC
+ /wG1AQEC/wG1AQIC/wG1AQIC/wG1AQEC/wG2AQEB/wH+AbYBAQH/Af0BtgECAf8BvQF5AQEB/wF+AT0B
+ AAH/Ab4BQgEBAv8BRwECAv8BRwECAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEC/wFHAQEC/wFJAQYC/wFLAQoC/wGMAS8C/wHNAVMC/wHCASoC/wG2AQAC/wG2AQEC/wG1AQEC
+ /wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQIC/wG0AQMC/wG1AQIC/wG2AQAB
+ /wH9AbYBAAH/AfoBtQEAAf8B0wF8AQAB/wGsAUMBAAH/AdUBRgEAAf8B/gFIAQAC/wFIAQEC/wFHAQEB
+ /wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAgH/Af4BSAEDAf8B/QFJAQUB
+ /wHvAWsBHAH/AeEBjQE0Af8B8AGtATsC/wHOAUMC/wHBASMC/wG0AQQC/wG1AQIC/wG2AQEC/wG1AQEC
+ /wG1AQEC/wG1AQEC/wG2AQEB/wH+AbQBAQH/Af4BswECAf8B/gG3AQkC/wG7ARAB/wH+AbQBDQH/Af0B
+ rQEKAf8B6QF4AQUB/wHWAUMBAAH/AeoBRgEAAv8BSAEAAv8BSAEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIC/wFFAQIB/wH9AUYBAQH/AfoBRwEAAf8B3wFKAQoB/wHDAUwB
+ FAH/AeEBmQFNAv8B5QGGAv8BzAFGAv8BswEGAv8BtQEDAv8BtgEAAv8BtgEBAv8BtQEBAv8BtgEBAv8B
+ tgEAAf8B/gG0AQAB/wH8AbIBAAH/Af4BuQEQAv8BvwEgAv8BsgEaAv8BpAEUAv8BdAEKAv8BQwEAAv8B
+ RgEAAv8BSAEAAv8BSAEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFGAQIB/wH+AUcBAQH/Af0BRwEBAf8B7wFHAQYB/wHhAUgBCwH/AfABcAEnAv8BmAFDAf8B/gGgATwB
+ /wH9AagBNAH/Af4BugFCAv8BzAFQAv8BzAFOAv8BywFNAv8ByAFHAv8BxgFCAf8B/gHBAT8B/wH+Ab0B
+ PAH/Af4BoQEnAv8BhgESAv8BfQEOAv8BdQELAv8BXQEGAv8BRQEBAv8BRgEBAv8BSAEBAv8BRwEBAv8B
+ RwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFFAQIC/wFDAQIC/wFHAQEC/wFLAQAB/wH9AXQBMQH/AfsBnQFiAf8B/QHAAYEC/wHiAaAC/wHiAZwC
+ /wHhAZgC/wHbAY4C/wHVAYQC/wHOAX4C/wHHAXcC/wGKAT0C/wFMAQMC/wFJAQMC/wFGAQIC/wFHAQIC
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/Af4BRgECAf8B/gFFAQMB/wH+AUgBAgL/AUsBAAH/AfkB
+ XQEZAf8B8gFvATMB/wHNAXsBQQH/AacBhwFQAf8BpAGIAU4B/wGgAYoBTAH/AaMBhgFKAf8BpwGDAUkB
+ /wG3AX4BQgH/AcgBeQE8Af8B4wFhAR8C/wFKAQIC/wFIAQIC/wFHAQIC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQH/Af4BRwEDAf8B/AFGAQQB/wH+AUgBAgL/AUoBAAH/AfQBRQECAf8B6QFAAQMB
+ /wGcATYBAgH/AU8BLAEAAf8BSAEvAQAB/wFBATIBAAH/AUgBMQEHAf8BTgEwAQ0B/wFvAS0BBwH/AZAB
+ KgEAAf8ByAE5AQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQH/Af4BRwECAf8B/gFHAQIB/wH+AUYBAQL/AUUBAQH/AeEBTQEBAf8BwwFUAQIB/wG1AWEBAQH/AacB
+ bwEAAf8BowFwAQAB/wGfAXEBAAH/AaMBcgEDAf8BpwFyAQcB/wGHAU8BAwH/AWgBLAEAAf8BoAE1AQAB
+ /wHYAT8BAQH/AesBQwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8B
+ UgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQAC/wFEAQEC/wFAAQEB/wHOAVQBAQH/AZ0BaAEAAf8BzgGNAQAC/wGxAQAB/wH+AbEBAAH/AfwB
+ sAEAAf8B/gGyAQAC/wG0AQAB/wGgAXEBAAH/AUABLQEAAf8BeAEyAQAB/wGwATcBAAH/AdgBPwEBAv8B
+ RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQIC/wFGAQIB/wH2AUUBAQH/Ae0B
+ RQEBAf8B3gFqAQEB/wHOAZABAgH/AecBogEBAv8BtAEAAf8B/gGzAQEB/wH+AbIBAgH/Af4BtAEDAv8B
+ tQEDAf8BzgGRAQMB/wGdAWwBAgH/AZMBSwEBAf8BiQErAQAB/wHEATkBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B
+ RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B7QFHAQIB/wHbAUkBAAH/Ae0BgAECAv8B
+ twEEAv8BtwECAv8BtwEAAv8BtgECAv8BtAEEAv8BtQEFAv8BtgEGAf8B/QGxAQUB/wH6AasBBAH/Aa4B
+ ZQECAf8BYgEeAQAB/wGxATMBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
+ RwECAv8BRwECAf8B6gFJAQEB/wHWAUsBAAH/AesBgAEDAv8BtQEGAv8BtgEDAv8BtgEBAv8BtQECAv8B
+ tQEDAv8BtQEDAv8BtgEEAf8B/gG0AQMB/wH9AbIBAgH/Aa4BawEBAf8BXwEkAQAB/wGvATUBAQL/AUcB
+ AgL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8B
+ RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB/wHoAUsBAAH/AdEB
+ TQEAAf8B6AGAAQQC/wGzAQcC/wG0AQQC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG3AQEC
+ /wG4AQAB/wGtAXEBAAH/AVsBKQEAAf8BrQE4AQEC/wFGAQIC/wFHAQIC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUgBAQH/AfMBSgEAAf8B5wFNAQAB/wHzAYYBDgL/Ab8BHAL/AboBDgH/Af4B
+ tgEBAv8BtgEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAf8BwQFxAQAB/wGDAS4BAAH/AcEB
+ OgEBAv8BRwECAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wH+AUoB
+ AQH/Af0BTQEAAf8B/gGMARkC/wHKATEB/wH+AcEBGQH/Af0BtwEAAf8B/gG2AQEC/wG1AQEC/wG1AQEC
+ /wG1AQEC/wG0AQEC/wGyAQEB/wHVAXIBAQH/AasBMgEAAf8B1QE9AQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af4BSgEAAv8BjQE2Av8B0QFsAf8B
+ +wHHAUcB/wH3Ab4BIgH/AfsBuQESAv8BtQECAf8B/QG1AQgB/wH8AbYBDQH/AfsBrwENAf8B+wGoAQ0B
+ /wHoAXIBCAH/AdUBPAEDAf8B6gFCAQIC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAAL/AY8BUwL/AdgBpgH/AfgBzgF1Af8B8QHEAUQB/wH4AbwB
+ JAL/AbQBAwH/AfwBtgEOAf8B+AG3ARkB/wH4AasBGQH/AfcBngEYAf8B+wFyAQ8C/wFFAQYC/wFHAQMC
+ /wFIAQAC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af0BSAEAAf8B
+ +wFIAQAB/wH9AW4BLAL/AZQBWQH/AfwBjgE/Af8B+AGIASUB/wHvAYQBFAH/AeYBgQEDAf8B7QGBAQgB
+ /wH1AYEBDgH/AfgBeQEPAf8B+wFyARAB/wH9AV0BCQL/AUcBAwL/AUcBAgL/AUgBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B
+ RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB/wH6AUkBAAH/AfYBSQEAAf8B+wFNAQYC
+ /wFQAQsC/wFOAQkC/wFMAQYB/wHmAU0BBAH/AcwBTQECAf8B3wFMAQMB/wHyAUoBAwH/AfkBSAEFAv8B
+ RgEHAv8BSAEEAf8B/gFJAQAC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUgBAQH/Af0BSAEBAf8B+wFIAQEB/wH9AUoBAwL/AUwBBgL/AUsBBQL/AUoBBAH/AfIB
+ SgEDAf8B5gFKAQIB/wHvAUkBAgH/AfkBSQECAf8B/AFIAQMC/wFHAQQC/wFHAQIC/wFIAQEC/wFIAQEC
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB
+ AQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
+ RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
+ RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B
+ RwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC
+ /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAFCAU0B
+ PgcAAT4DAAEoAwABgAMAASADAAEBAQABAQYAAQIWAAP//wD/AAMACw==
diff --git a/qtc-net-client-2/Forms/DirectMessage.Designer.cs b/qtc-net-client-2/Forms/DirectMessage.Designer.cs
index 4bfdd60..16a58c7 100644
--- a/qtc-net-client-2/Forms/DirectMessage.Designer.cs
+++ b/qtc-net-client-2/Forms/DirectMessage.Designer.cs
@@ -29,23 +29,14 @@
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DirectMessage));
- rtxtChat = new RichTextBox();
btnSend = new Button();
rtxtChatbox = new RichTextBox();
lblUsername = new Label();
+ pbPfp = new PictureBox();
+ lvChat = new ListView();
+ ((System.ComponentModel.ISupportInitialize)pbPfp).BeginInit();
SuspendLayout();
//
- // rtxtChat
- //
- rtxtChat.HideSelection = false;
- 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, 325);
- rtxtChat.TabIndex = 6;
- rtxtChat.Text = "";
- //
// btnSend
//
btnSend.FlatAppearance.BorderSize = 0;
@@ -74,21 +65,40 @@
//
lblUsername.AutoSize = true;
lblUsername.Font = new Font("Segoe UI", 25F, FontStyle.Bold | FontStyle.Italic);
- lblUsername.Location = new Point(6, 0);
+ lblUsername.Location = new Point(52, 0);
lblUsername.Margin = new Padding(4, 0, 4, 0);
lblUsername.Name = "lblUsername";
lblUsername.Size = new Size(181, 46);
lblUsername.TabIndex = 7;
lblUsername.Text = "Username";
//
+ // pbPfp
+ //
+ pbPfp.Image = Properties.Resources.DefaultPfp;
+ pbPfp.Location = new Point(14, 6);
+ pbPfp.Name = "pbPfp";
+ pbPfp.Size = new Size(40, 37);
+ pbPfp.SizeMode = PictureBoxSizeMode.StretchImage;
+ pbPfp.TabIndex = 9;
+ pbPfp.TabStop = false;
+ //
+ // lvChat
+ //
+ lvChat.Location = new Point(12, 48);
+ lvChat.Name = "lvChat";
+ lvChat.Size = new Size(593, 325);
+ lvChat.TabIndex = 10;
+ lvChat.UseCompatibleStateImageBehavior = false;
+ //
// DirectMessage
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.DodgerBlue;
ClientSize = new Size(618, 443);
+ Controls.Add(lvChat);
+ Controls.Add(pbPfp);
Controls.Add(lblUsername);
- Controls.Add(rtxtChat);
Controls.Add(btnSend);
Controls.Add(rtxtChatbox);
Font = new Font("Segoe UI", 9F);
@@ -101,15 +111,16 @@
StartPosition = FormStartPosition.CenterScreen;
Text = "QtC.NET Client - Direct Message With ${USER}";
Load += frmDirectMessage_Load;
+ ((System.ComponentModel.ISupportInitialize)pbPfp).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
-
- private RichTextBox rtxtChat;
private Button btnSend;
private RichTextBox rtxtChatbox;
private Label lblUsername;
+ private PictureBox pbPfp;
+ private ListView lvChat;
}
}
\ No newline at end of file
diff --git a/qtc-net-client-2/Forms/DirectMessage.cs b/qtc-net-client-2/Forms/DirectMessage.cs
index 3642263..aa02ef8 100644
--- a/qtc-net-client-2/Forms/DirectMessage.cs
+++ b/qtc-net-client-2/Forms/DirectMessage.cs
@@ -36,20 +36,23 @@ namespace qtc_net_client_2.Forms
InitializeComponent();
}
- private void frmDirectMessage_Load(object sender, EventArgs e)
+ private async void frmDirectMessage_Load(object sender, EventArgs e)
{
lblUsername.Text = User.Username;
Text = $"QtC.NET Client - Direct Message With {User.Username}";
Messages.CollectionChanged += Messages_CollectionChanged;
- if (User.Role == "Admin")
+ var pfpRes = await _apiService.GetUserProfilePic(User.Id);
+ if(pfpRes != null && pfpRes.Success && pfpRes.Data != null)
{
- Messages.Add($"[SERVER] This User Is A Server Admin. You should comply with anything this user asks. however admins should not ask for personal information.\n");
+ using var ms = new MemoryStream(pfpRes.Data);
+ using var bmp = new Bitmap(ms);
+ pbPfp.Image = bmp;
}
if (InitMessage != null)
{
- Messages.Add($"[{User.Username}] {InitMessage.Content}\n");
+ Messages.Add($"{User.Username}: {InitMessage.Content}");
AudioService.PlaySoundEffect("sndDirectMsg");
}
}
@@ -63,7 +66,7 @@ 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 });
- Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}\n");
+ Messages.Add($"{_apiService.CurrentUser.Username}: {rtxtChatbox.Text}");
rtxtChatbox.Clear();
AudioService.PlaySoundEffect("sndSendClick");
}
@@ -97,14 +100,14 @@ namespace qtc_net_client_2.Forms
Invoke(delegate ()
{
var msg = e.NewItems.Cast().FirstOrDefault();
- rtxtChat.AppendText(msg);
+ lvChat.Items.Add(msg);
if (!msg!.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage");
});
}
else
{
var msg = e.NewItems.Cast().FirstOrDefault();
- rtxtChat.AppendText(msg);
+ lvChat.Items.Add(msg);
if (!msg!.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage");
}
}
diff --git a/qtc-net-client-2/Forms/Main.cs b/qtc-net-client-2/Forms/Main.cs
index e91b5c6..f2611ce 100644
--- a/qtc-net-client-2/Forms/Main.cs
+++ b/qtc-net-client-2/Forms/Main.cs
@@ -80,7 +80,7 @@ namespace qtc_net_client_2
if (selectedRoom == "Lobby")
{
// join lobby
- if (!_gatewayService.InLobby) await _gatewayService.JoinLobbyAsync();
+ await _gatewayService.JoinRoomAsync();
ChatRoom frmChat = new ChatRoom(_gatewayService, _apiService);
frmChat.Show();