Moonbase 89d3c60bde Rework Lobby
Use ListViews For Messages
2025-11-14 18:37:43 -08:00

181 lines
7.0 KiB
C#

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
{
public partial class ChatRoom : Form
{
IGatewayService _gatewayService;
IApiService _apiService;
AudioService AudioService = new();
private List<User> RoomUserList = new();
public ChatRoom(IGatewayService gatewayService, IApiService apiService)
{
_gatewayService = gatewayService;
_apiService = apiService;
// subscribe to server message event
_gatewayService.OnRoomMessageReceived += _gatewayService_OnServerMessageReceived;
_gatewayService.OnRoomUserListReceived += _gatewayService_OnRoomUserListReceived;
_gatewayService.OnRoomDeleted += _gatewayService_OnRoomDeleted;
_gatewayService.OnGuestUserJoin += _gatewayService_OnGuestUserJoin;
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
lvUserList.Items.Add(_apiService.CurrentUser.Username, _apiService.CurrentUser.Status);
}
private async void frmChat_FormClosing(object sender, FormClosingEventArgs e)
{
// unsubscribe from server message event
_gatewayService.OnRoomMessageReceived -= _gatewayService_OnServerMessageReceived;
_gatewayService.OnRoomUserListReceived -= _gatewayService_OnRoomUserListReceived;
if (_gatewayService.CurrentRoom != null)
{
// leave any room user is in
await _gatewayService.LeaveRoomAsync();
}
}
private async void btnSend_Click(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(rtxtChatbox.Text))
{
// construct message
QtCNETAPI.Models.Message message = new() { Content = rtxtChatbox.Text };
// send it and clear text box
await _gatewayService.PostMessageAsync(message);
rtxtChatbox.Text = string.Empty;
AudioService.PlaySoundEffect("sndSendClick");
}
}
private void rtxtChatbox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
btnSend_Click(sender, e);
}
private async void lvUserList_DoubleClick(object sender, EventArgs e)
{
if (lvUserList.SelectedItems.Count > 0)
{
string? selectedUser = (string?)lvUserList.SelectedItems[lvUserList.SelectedItems.Count - 1].Text;
if (selectedUser != null)
{
// split from [ if it exists
if (selectedUser.Contains('[')) selectedUser = selectedUser.Split('[', options: StringSplitOptions.TrimEntries)[0];
// in this context, we need to find the main form to get the current user directory
Main? mainForm = (Main?)Application.OpenForms[0];
if (mainForm != null)
{
// get user info and open profile dialog
var user = mainForm.UserDirectory.FirstOrDefault(e => e.Username == selectedUser);
if (user != null)
{
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, mainForm.Contacts, _apiService, _gatewayService);
frmProfile.Show();
}
}
}
}
}
}
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, user?.Id);
if (!msgEventArgs.Message.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage");
}
private void _gatewayService_OnRoomUserListReceived(object? sender, EventArgs e)
{
var args = (RoomListEventArgs)e;
if (IsHandleCreated && !IsDisposed)
{
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);
}
}
});
}
}
private void _gatewayService_OnGuestUserJoin(object? sender, EventArgs e)
{
var args = (GuestUserJoinEventArgs)e;
AddMessage($"[SERVER] Guest User {args.Username} Has Joined {_gatewayService.CurrentRoom?.Name}");
}
private void _gatewayService_OnRoomDeleted(object? sender, EventArgs e)
{
if(IsHandleCreated && !IsDisposed)
{
Invoke(delegate ()
{
AddMessage($"[SERVER] This Room Was Deleted By An Admin.");
lvUserList.Clear();
RoomUserList.Clear();
lvUserList.Enabled = false;
rtxtChatbox.Enabled = false;
btnSend.Enabled = false;
});
}
}
private void AddMessage(string message, string? userId = null)
{
if(IsHandleCreated && !IsDisposed)
{
Invoke(delegate ()
{
lvMessages.Items.Add(message, userId ?? "DefaultPfp");
});
}
}
}
}