public async Task ConnectToRemoteUser(string remoteIpAddress, int remotePortNumber)
        {
            Console.WriteLine("STATUS: Connecting to remote user");
            State  = ConnectionState.Connecting;
            Sender = await NetworkService.ConnectToRemoteAsync(Sender, remoteIpAddress, remotePortNumber);

            if (Sender != null)
            {
                Console.WriteLine($"RESULT: Connection to {((IPEndPoint)Sender.RemoteEndPoint).Address} established");
            }
            else
            {
                Console.WriteLine("RESULT: Connection to remote failed");
                Sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                State  = ConnectionState.Listening;
                InfoDisplay.Show("Could not connect to user");
                return;
            }

            Console.WriteLine("STATUS: Sending request data to remote user");
            NetworkData request = new NetworkData(LocalUser, NetworkDataType.Request);
            bool        sent    = await NetworkService.SendDataAsync(Sender, request);

            if (sent)
            {
                Console.WriteLine("RESULT: Sending of request data successful");
            }
            else
            {
                Console.WriteLine("RESULT: Sending of request data failed");
                Sender.Shutdown(SocketShutdown.Both);
                InfoDisplay.Show("Could not send request to user");
                State = ConnectionState.Listening;
            }
        }
        private void ProcessResponse(NetworkData networkData)
        {
            Console.WriteLine("STATUS: Processing response");
            Console.WriteLine($"RESULT: Received a response of type {networkData.ResponseType}");

            switch (networkData.ResponseType)
            {
            case ResponseType.Exit:
                ConnectionState tempState = State;
                State = ConnectionState.Listening;
                if (tempState == ConnectionState.Chatting)
                {
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        ExitChat();
                    });
                    InfoDisplay.Show($"{RemoteUser.UserName} left the chat");
                }
                else
                {
                    InfoDisplay.Show($"{RemoteUser.UserName} canceled their chat request");
                }
                break;

            case ResponseType.Accept:
                State = ConnectionState.Chatting;
                InfoDisplay.Show($"{RemoteUser.UserName} accepted your chat request");
                break;

            case ResponseType.Decline:
                State = ConnectionState.Listening;
                InfoDisplay.Show($"{RemoteUser.UserName} declined your chat request");
                break;

            case ResponseType.Buzz:
                if (State == ConnectionState.Chatting)
                {
                    System.Media.SystemSounds.Beep.Play();
                }
                break;

            case ResponseType.Disconnect:
                ConnectionState prevState = State;
                State = ConnectionState.Listening;
                if (prevState == ConnectionState.Chatting)
                {
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        ExitChat();
                    });
                }
                InfoDisplay.Show($"{RemoteUser.UserName} disconnected from application");
                break;

            case ResponseType.None:
                Console.WriteLine("ERROR: Network data is not a response");
                break;
            }
        }