protected IEnumerator ProcessConnection_Server(Socket socket,
                                                       Connection.ConnectionPurpose purpose,
                                                       byte?standardisedBattleLevel = null)
        {
            NetworkStream stream = Connection.CreateNetworkStream(socket);

            //Verify connection
            if (!Connection.VerifyConnection_Server(stream,
                                                    purpose,
                                                    errCallback: canvasController.SetStatusMessageError,
                                                    statusCallback: canvasController.SetStatusMessage))
            {
                stream.Close();
                Launch(connectionMode); //Reset section
                yield break;
            }

            switch (purpose)
            {
            case Connection.ConnectionPurpose.Battle:
                yield return(StartCoroutine(ProcessVerifiedConnection_Server_Battle(stream, standardisedBattleLevel)));

                break;

            case Connection.ConnectionPurpose.Trade:
                yield return(StartCoroutine(ProcessVerifiedConnection_Server_Trade(stream)));

                break;

            default:
                Debug.LogError("Unknown connection purpose to processes");
                stream.Close();
                break;
            }
        }
 protected void Run_Client(Connection.ConnectionPurpose purpose,
                           string addressString,
                           int port = -1)
 {
     if (!Connection.TryConnectToServer(
             out Socket socket,
             errCallback: canvasController.SetStatusMessageError,
             statusCallback: canvasController.SetStatusMessage,
             ipAddress: addressString,
             port: port))
     {
         socket?.Close();
         SetInteractable(true);
         return;
     }
        protected IEnumerator Server_Coroutine(Connection.ConnectionPurpose purpose,
                                               byte?standardisedLevel,
                                               int port = -1)
        {
            if (serverConnectionToProcess != null)
            {
                serverConnectionToProcess?.Close();
                Debug.LogWarning("Connection waiting to be processed");
                canvasController.SetStatusMessageError("Server connection trying to be opened whilst one already active");
                SetInteractable(true);
            }

            canvasController.SetStatusMessage("Setting up server...");

            Connection.TryStartHostServer(

                startedListeningListener: (IPEndPoint endPoint) => //Started listening
            {
                canvasController.SetStatusMessage($"Listening for connection at {endPoint.Address}:{endPoint.Port}...");
            },

                clientConnectedListener: null, //Async server doesn't use clientConnectedListener

                errCallback: canvasController.SetStatusMessageError,
                statusCallback: canvasController.SetStatusMessage,

                port: port);

            Socket sock;

            while (true)
            {
                sock = Connection.FetchAsyncNewClient();

                if (sock != null)
                {
                    break;
                }

                yield return(new WaitForFixedUpdate());
            }

            connectionPurpose = purpose;
            SetServerConnectionToProcess(sock, standardisedLevel);
        }
        private void GoButtonListener()
        {
            string addressString = addressInput.text;

            string purposeString = purposeDropdownOptions[purposeDropdown.value];

            Connection.ConnectionPurpose purpose = purposeDropdownOptionValues[purposeString];

            string standardisedLevelString = standarisedLevelDropdownOptions[standarisedLevelDropdown.value];
            byte?  standardisedLevel       = standardisedLevelDropdownOptionValues[standardisedLevelString];

            int port;

            if (portInput.text == "")
            {
                port = -1;
            }
            else
            {
                if (!int.TryParse(portInput.text, out port))
                {
                    canvasController.SetStatusMessageError("Invalid port provided");
                    return;
                }
            }

            switch (connectionMode)
            {
            case ConnectionMode.Server:
                SetInteractivityForServerListening();
                Run_Server(purpose, standardisedLevel, port);
                break;

            case ConnectionMode.Client:
                SetInteractable(false);
                Run_Client(purpose, addressString, port);
                break;

            default:
                Debug.LogError("Unknown connection mode - " + connectionMode);
                return;
            }
        }
 protected void Run_Server(Connection.ConnectionPurpose purpose,
                           byte?standardisedLevel,
                           int port = -1)
 {
     StartCoroutine(Server_Coroutine(purpose, standardisedLevel, port));
 }