using qtc_net_client_2.ClientModel; using qtc_net_client_2.Properties; using qtc_net_client_2.Services; using QtCNETAPI.Dtos.User; using QtCNETAPI.Models; using QtCNETAPI.Schema; using QtCNETAPI.Services.ApiService; using QtCNETAPI.Services.GatewayService; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Drawing.Design; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace qtc_net_client_2.Forms { public partial class Profile : Form { private UserInformationDto _userInformationDto; private IApiService _apiService; private IGatewayService _gatewayService; private ServiceResponse? pfpRes; byte[]? cosmeticRes; private List contactsList; public Profile(UserInformationDto userInfo, ServiceResponse? pfp, List contacts, IApiService apiService, IGatewayService gatewayService, byte[]? cosmetic = null) { _userInformationDto = userInfo; _apiService = apiService; _gatewayService = gatewayService; pfpRes = pfp; cosmeticRes = cosmetic; contactsList = contacts; InitializeComponent(); } private async void frmProfile_Load(object sender, EventArgs e) { lblUsername.Text = _userInformationDto.Username; lblCurrencyAmount.Text = _userInformationDto.CurrencyAmount.ToString("N0"); rtxtBio.Text = _userInformationDto.Bio; pbUserPfp.Location = new(13, 11); pbUserPfp.Size = new(128, 128); if (pfpRes != null && pfpRes.Success && pfpRes.Data != null) { using (var ms = new MemoryStream(pfpRes.Data)) { pbUserPfp.Image = new Bitmap(ms); } } var userStatus = (UserStatus)_userInformationDto.Status; switch (userStatus) { case UserStatus.Online: pbUserStatus.Image = Resources.OnlineIcon; break; case UserStatus.Away: pbUserStatus.Image = Resources.AwayIcon; break; case UserStatus.DoNotDisturb: pbUserStatus.Image = Resources.DNDIcon; break; case UserStatus.Offline: pbUserStatus.Image = Resources.OfflineIcon; break; } if(cosmeticRes != null) { using var ms = new MemoryStream(cosmeticRes); CombineProfileImageWithCosmetic(pbUserPfp.Image, new Bitmap(ms)); } if (_userInformationDto.ProfileCosmeticId != 0) { var res = await _apiService.GetStoreItem(_userInformationDto.ProfileCosmeticId); if (res != null && res.Success && res.Data != null) { var client = new HttpClient(); var response = await client.GetAsync(res.Data.AssetUrl); if (response.IsSuccessStatusCode) { using (var stream = await response.Content.ReadAsStreamAsync()) { } response.Dispose(); } client.Dispose(); } } if (_userInformationDto.Id == _apiService.CurrentUser!.Id) { btnAddContact.Visible = false; btnMessage.Visible = false; return; // do not run contact getting code } else btnAddContact.Visible = true; if (contactsList != null) { var contact = contactsList.FirstOrDefault(e => e.UserId == _userInformationDto.Id || e.OwnerId == _userInformationDto.Id); if (contact != null) { if (contact.OwnerId == _apiService.CurrentUser.Id) { // the user requesting this profile initiated a contact relationship with this user switch (contact.OwnerStatus) { case Contact.ContactStatus.AwaitingApprovalFromOther: btnAddContact.Enabled = false; using (var ms = new MemoryStream(Resources.RequestSentIcon)) { btnAddContact.Image = Image.FromStream(ms); ms.Dispose(); } btnCancelRequest.Visible = true; break; case Contact.ContactStatus.Accepted: btnAddContact.Visible = true; btnAddContact.Enabled = true; btnAddContact.Image = Resources.RemoveContactIcon; btnAddContact.Click += btnAddContact_Click_Remove; if (_userInformationDto.Status >= 1) btnMessage.Visible = true; break; } } else if (contact.UserId == _apiService.CurrentUser.Id) { // the user requesting this profile did not initiate a contact relationship with the user switch (contact.UserStatus) { case Contact.ContactStatus.AwaitingApprovalFromSelf: btnAddContact.Visible = false; btnAccept.Visible = true; btnDecline.Visible = true; btnCancelRequest.Visible = false; break; case Contact.ContactStatus.Accepted: btnAccept.Visible = false; btnDecline.Visible = false; btnCancelRequest.Visible = false; btnAddContact.Visible = true; btnAddContact.Enabled = true; btnAddContact.Image = Resources.RemoveContactIcon; btnAddContact.Click += btnAddContact_Click_Remove; if (_userInformationDto.Status >= 1) btnMessage.Visible = true; break; } } } else { btnAddContact.Visible = true; btnAddContact.Click += btnAddContact_Click_Add; } } else { btnAddContact.Visible = true; btnAddContact.Click += btnAddContact_Click_Add; } } private void Profile_FormClosed(object sender, FormClosedEventArgs e) { _userInformationDto = null!; // ignoring warning since this is just disposing the form pfpRes = null; } private async void btnAddContact_Click_Add(object sender, EventArgs e) { var result = await _apiService.AddContactToCurrentUser(_userInformationDto.Id); if (result.Success) { btnAddContact.Enabled = false; using (var ms = new MemoryStream(Resources.RequestSentIcon)) { btnAddContact.Image = Image.FromStream(ms); ms.Dispose(); } btnCancelRequest.Visible = true; } } private async void btnAddContact_Click_Remove(object sender, EventArgs e) { var result = await _apiService.RemoveContactFromCurrentUser(_userInformationDto.Id); if (result.Success) { btnAddContact.Image = Resources.AddContactIcon; btnAddContact.Click += btnAddContact_Click_Add; btnMessage.Visible = false; } } private async void btnAccept_Click(object sender, EventArgs e) { var result = await _apiService.AcceptContactRequest(_userInformationDto.Id); if (result.Success) { btnAccept.Visible = false; btnDecline.Visible = false; btnAddContact.Visible = true; btnAddContact.Image = Resources.RemoveContactIcon; btnAddContact.Click += btnAddContact_Click_Remove; if (_userInformationDto.Status >= 1) btnMessage.Visible = true; } } private async void btnDecline_Click(object sender, EventArgs e) { var result = await _apiService.RemoveContactFromCurrentUser(_userInformationDto.Id); if (result.Success) { btnAccept.Visible = false; btnDecline.Visible = false; btnAddContact.Visible = true; btnAddContact.Image = Resources.AddContactIcon; btnAddContact.Click += btnAddContact_Click_Add; } } private async void btnCancelRequest_Click(object sender, EventArgs e) { var result = await _apiService.RemoveContactFromCurrentUser(_userInformationDto.Id); if (result.Success) { btnAddContact.Enabled = true; btnAddContact.Image = Resources.AddContactIcon; btnAddContact.Click += btnAddContact_Click_Add; btnCancelRequest.Visible = false; } } private void btnMessage_Click(object sender, EventArgs e) { DirectMessage frmDirectMessage = new DirectMessage(_gatewayService, _apiService, _userInformationDto); Close(); frmDirectMessage.Show(); } private void CombineProfileImageWithCosmetic(Image pfp, Bitmap cosmetic) { cosmetic.MakeTransparent(); Bitmap combined = new Bitmap(139, 138); using (Graphics g = Graphics.FromImage(combined)) { g.Clear(Color.Transparent); g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; g.DrawImage(pfp, 4, 6, 128, 128); g.DrawImage(cosmetic, 0, 0, 139, 138); } pbUserPfp.Location = new(9, 5); pbUserPfp.Size = new(139, 138); pbUserPfp.Image = combined; } } }