using Core; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Client { public partial class ChatRoomForm : Form { public ChatRoomForm() { InitializeComponent(); InitInstance(); } private void InitInstance() { lbxUser.Items.Add(Singleton.Instance.Nickname); Singleton.Instance.UserEnterResponsed += UserEnterResponsed; Singleton.Instance.UserLeaveResponsed += UserLeaveResponsed; } private void btmSend_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(tbxMsg.Text)) return; lbxMsg.Items.Add(tbxMsg.Text); tbxMsg.Text = null; ScrollMsgToEnd(); } private void ScrollMsgToEnd() { lbxMsg.SelectedIndex = lbxMsg.Items.Count - 1; lbxMsg.SelectedIndex = -1; } private void InvokeMethod(InvokedMethod method) { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { method(); })); } else { method(); } } private void UserEnterResponsed(object? sender, EventArgs e) { if (sender == null) return; UserEnterPacket packet = (UserEnterPacket)sender; InvokeMethod(() => { lbxUser.Items.Add(packet.Nickname); }); } private void UserLeaveResponsed(object? sender, EventArgs e) { if (sender == null) return; UserLeavePacket packet = (UserLeavePacket)sender; InvokeMethod(() => { lbxUser.Items.Remove(packet.Nickname); }); } private async void ChatRoomForm_FormClosing(object sender, FormClosingEventArgs e) { Singleton.Instance.UserEnterResponsed -= UserEnterResponsed; Singleton.Instance.UserLeaveResponsed -= UserLeaveResponsed; UserLeavePacket packet = new UserLeavePacket(Singleton.Instance.Nickname); await Singleton.Instance.SendAsync(packet.Serialize(), SocketFlags.None); } } }