Example #1
0
 private static void _HandleRoomOperation(RoomOperation operation, Room room)
 {
 }
Example #2
0
        internal void RecvPacket(byte[] packet)
        {
            PacketReader pr_raw       = new PacketReader(packet);
            int          packetLength = pr_raw.ReadInt();
            int          dataType     = pr_raw.ReadByte();

            byte[] data = new byte[packetLength];
            Buffer.BlockCopy(packet, PacketProcessor.HeaderSize, data, 0, packetLength);
            PacketReader pr;
            PacketWriter pw;

            switch ((RecvHeader)dataType)
            {
            case RecvHeader.LoginResult:
                pr = new PacketReader(data);
                LoginStatus status = (LoginStatus)pr.ReadByte();
                if (status == LoginStatus.Success)
                {
                    ClientWindow.Instance.AccountInfo = new account.AccountInfo();
                    ClientWindow.Instance.AccountInfo.Decode(pr);
                    ClientWindow.Instance.CloseLogin();
                    ClientWindow.Instance.MainUserInfo.Update();
                    // Request for Room list
                    pw = new PacketWriter();
                    SendData(SendHeader.RoomListRequest, pw.ToArray());
                }
                break;

            case RecvHeader.RoomList:
                pr = new PacketReader(data);
                int n = pr.ReadInt();
                for (int i = 0; i < n; i++)
                {
                    Room room = new Room();
                    room.Decode(pr);
                    ClientWindow.Instance.Rooms.Add(room.RoomId, room);
                    ClientWindow.Instance.RoomList.Update();
                }
                break;

            case RecvHeader.CreateRoomResult:
                pr = new PacketReader(data);
                if ((RoomOperation)pr.ReadByte() != RoomOperation.Success)
                {
                    MessageBox.Show("Tạo phòng thất bại!", "Thông báo");
                }
                ClientWindow.Instance.Dispatcher.Invoke(() => ClientWindow.Instance.RoomList._CreateRoomDialog.Hide());
                break;

            case RecvHeader.RoomListUpdate:
                pr = new PacketReader(data);
                RoomOperation operation = (RoomOperation)pr.ReadByte();
                if (operation == RoomOperation.New)
                {
                    Room newRoom = new Room();
                    newRoom.Decode(pr);
                    ClientWindow.Instance.Rooms.Add(newRoom.RoomId, newRoom);
                    ClientWindow.Instance.RoomList.Update();
                }
                break;

            case RecvHeader.ServerMessage:
                pr = new PacketReader(data);
                ClientWindow.Instance.WriteLog(pr.ReadString());
                break;

            case RecvHeader.JoinRoomResult:
                pr = new PacketReader(data);
                if (pr.ReadBool())
                {
                    int roomId = pr.ReadInt();
                    if (ClientWindow.Instance.Rooms.ContainsKey(roomId))
                    {
                        var room = ClientWindow.Instance.Rooms[roomId];
                        ClientWindow.Instance.Dispatcher.Invoke(() =>
                        {
                            room.Window            = new gui.room.RoomWindow(room);
                            room.Window.NoticeText = pr.ReadString();
                            room.Window.SetTitle("Phòng chat <" + room.Name + "> | vTalk");
                            room.Window.Show();
                            room.Window.Activate();
                        });
                    }
                    // Request for User list
                    pw = new PacketWriter();
                    pw.WriteInt(roomId);
                    SendData(SendHeader.UserListRequest, pw.ToArray());
                }
                else
                {
                    MessageBox.Show("Bạn không thể tham gia phòng chat này. Vui lòng kiểm tra lại.", "Lỗi");
                }
                break;

            case RecvHeader.RoomMessage:
                pr = new PacketReader(data);
                int desRoomId = pr.ReadInt();
                if (ClientWindow.Instance.Rooms.ContainsKey(desRoomId))
                {
                    Room room = ClientWindow.Instance.Rooms[desRoomId];
                    if (room.Window != null)
                    {
                        switch ((ChatType)pr.ReadByte())
                        {
                        case ChatType.Message:
                            room.Window.Log.WriteUserMessage("", "", pr.ReadString());
                            break;

                        case ChatType.User:
                            string user            = pr.ReadString();
                            string processedString = MessageProcessor.Process(pr.ReadString());
                            room.Window.Log.WriteUserMessage(user, DateTime.Now.ToString("H:m:s dd/MM/yyyy"), processedString);
                            ClientWindow.Instance.PlayNotificationSound();
                            break;

                        case ChatType.Success:
                            room.Window.Dispatcher.Invoke(() =>
                            {
                                room.Window.tbMessage.IsEnabled = true;
                                room.Window.tbMessage.Text      = "";
                            });
                            break;
                        }
                    }
                }
                break;

            case RecvHeader.UserList:
                pr = new PacketReader(data);
                long m      = pr.ReadLong();
                int  roomID = pr.ReadInt();
                Room uroom  = ClientWindow.Instance.Rooms[roomID];
                for (int i = 0; i < m; i++)
                {
                    User usr = new User();
                    usr.Name = pr.ReadString();
                    int check = 0;
                    foreach (User user in uroom.Clients)
                    {
                        if (user.Name == usr.Name)
                        {
                            check = 1;
                        }
                    }
                    if (check == 0)
                    {
                        uroom.Clients.Add(usr);
                    }
                    uroom.Window.Dispatcher.Invoke(() =>
                    {
                        uroom.Window.userList.Items.Clear();
                        foreach (User client in uroom.Clients)
                        {
                            ListViewItem lvi = new ListViewItem
                            {
                                Content = client.Name
                            };
                            uroom.Window.userList.Items.Add(lvi);
                        }
                    });
                }
                break;

            case RecvHeader.UserListUpdate:
                pr = new PacketReader(data);
                UserOperation userOperation = (UserOperation)pr.ReadByte();
                int           usroomId      = pr.ReadInt();
                //long o = pr.ReadLong();
                Room usroom = ClientWindow.Instance.Rooms[usroomId];
                if (userOperation == UserOperation.New)
                {
                    User usr = new User();
                    usr.Name = pr.ReadString();
                    int check = 0;
                    foreach (User user in usroom.Clients)
                    {
                        if (user.Name == usr.Name)
                        {
                            check = 1;
                        }
                    }
                    if (check == 0)
                    {
                        usroom.Clients.Add(usr);
                    }
                    usroom.Window.Dispatcher.Invoke(() =>
                    {
                        usroom.Window.userList.Items.Clear();
                        foreach (User client in usroom.Clients)
                        {
                            ListViewItem lvi = new ListViewItem
                            {
                                Content = client.Name
                            };
                            usroom.Window.userList.Items.Add(lvi);
                        }
                    });
                }
                else if (userOperation == UserOperation.Leave)
                {
                    string username = pr.ReadString();
                    foreach (User user in usroom.Clients)
                    {
                        if (user.Name.Equals(username))
                        {
                            usroom.Clients.Remove(user);
                            usroom.Window.userList.Dispatcher.Invoke(() =>
                            {
                                foreach (object item in usroom.Window.userList.Items)
                                {
                                    ListViewItem u = (ListViewItem)item;
                                    if (u.Content.Equals(username))
                                    {
                                        usroom.Window.userList.Items.Remove(item);
                                        break;
                                    }
                                }
                            });
                            break;
                        }
                    }
                }
                break;

            case RecvHeader.LeaveRoomResult:
                pr = new PacketReader(data);
                int roomIDToLeave = pr.ReadInt();
                if (pr.ReadBool())    // Leave successful
                {
                    if (ClientWindow.Instance.Rooms.ContainsKey(roomIDToLeave))
                    {
                        if (ClientWindow.Instance.Rooms[roomIDToLeave].Window != null)
                        {
                            ClientWindow.Instance.Rooms[roomIDToLeave].Window.Dispatcher.Invoke(() =>
                            {
                                ClientWindow.Instance.Rooms[roomIDToLeave].Window.SetLeaveRoom();
                                ClientWindow.Instance.Rooms[roomIDToLeave].Window.Close();
                                ClientWindow.Instance.Rooms[roomIDToLeave].Window = null;
                            });
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Không thể rời phòng chat.", "Lỗi");
                }
                break;
            }
        }
Example #3
0
 public bool RoomOperations(RoomOperation op, int arg1, int arg2, out int result)
 {
     throw new NotImplementedException();
 }