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 { delegate void InvokedMethod(); public partial class RoomListForm : Form { public RoomListForm() { InitializeComponent(); InitInstance(); } private void InitInstance() { Singleton.Instance.CreateRoomResponsed += CreateRoomResponsed; Singleton.Instance.RoomListResponsed += RoomListResponsed; Singleton.Instance.EnterRoomResponsed += EnterRoomResponsed; } private async void btnEnter_Click(object sender, EventArgs e) { if (lbxRoom.SelectedItem == null) { MessageBox.Show("Please select a room."); return; } EnterRoomRequestPacket packet = new EnterRoomRequestPacket(lbxRoom.SelectedItem.ToString()); await Singleton.Instance.SendAsync(packet.Serialize(), SocketFlags.None); } private async void btnCreate_Click(object sender, EventArgs e) { string roomName = tbxRoomName.Text; if (string.IsNullOrEmpty(roomName)) { MessageBox.Show("Please input a room name."); return; } CreateRoomRequestPacket packet = new CreateRoomRequestPacket(roomName); await Singleton.Instance.SendAsync(packet.Serialize(), SocketFlags.None); } private void RoomListForm_Activated(object sender, EventArgs e) { btnRefresh_Click(sender, e); } private void InvokeMethod(InvokedMethod method) { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { method(); })); } else { method(); } } private void CreateRoomResponsed(object? sender, EventArgs e) { if (sender == null) return; CreateRoomResponsePacket packet = (CreateRoomResponsePacket)sender; if (packet.Code == StatusCode.Success) { string roomName = tbxRoomName.Text; InvokeMethod(() => { lbxRoom.Items.Add(roomName); tbxRoomName.Text = ""; }); IAsyncResult ar = null; ar = BeginInvoke(() => { ChatRoomForm chatRoomForm = new ChatRoomForm(); chatRoomForm.Text = roomName; chatRoomForm.ShowDialog(); EndInvoke(ar); }); } } private void RoomListResponsed(object? sender, EventArgs e) { if (sender == null) return; RoomListResponsePacket packet = (RoomListResponsePacket)sender; InvokeMethod(() => { foreach (string item in packet.RoomNames) { lbxRoom.Items.Add(item); } }); } private void EnterRoomResponsed(object? sender, EventArgs e) { if (sender == null) return; EnterRoomResponsePacket packet = (EnterRoomResponsePacket)sender; InvokeMethod(() => { IAsyncResult ar = null; ar = BeginInvoke(() => { ChatRoomForm chatRoomForm = new ChatRoomForm(); chatRoomForm.Text = lbxRoom.SelectedItem.ToString(); chatRoomForm.ShowDialog(); EndInvoke(ar); }); }); } private async void btnRefresh_Click(object sender, EventArgs e) { lbxRoom.Items.Clear(); RoomListRequestPacket packet = new RoomListRequestPacket(); await Singleton.Instance.SendAsync(packet.Serialize(), SocketFlags.None); } private void RoomListForm_FormClosing(object sender, FormClosingEventArgs e) { Singleton.Instance.CreateRoomResponsed -= CreateRoomResponsed; Singleton.Instance.RoomListResponsed -= RoomListResponsed; Singleton.Instance.EnterRoomResponsed -= EnterRoomResponsed; Singleton.Instance.Socket.Shutdown(SocketShutdown.Send); } } }