private async Task ServerSetUpPlayer(
            string unverifiedClientId,
            string unverifiedUsername,
            string unverifiedUserid,
            int unverifiedClientVersion,
            string unverifiedToken)
        {
            Logger.LogFormat("A joinedviewer called CmdServerSetupPlayer on this server, Unverified ClientId: {0} Unverified Username: {1}",
                             Category.Connections,
                             unverifiedClientId, unverifiedUsername);

            // Register player to player list (logging code exists in PlayerList so no need for extra logging here)
            var unverifiedConnPlayer = PlayerList.Instance.AddOrUpdate(new ConnectedPlayer
            {
                Connection   = connectionToClient,
                GameObject   = gameObject,
                Username     = unverifiedUsername,
                Job          = JobType.NULL,
                ClientId     = unverifiedClientId,
                UserId       = unverifiedUserid,
                ConnectionIP = connectionToClient.address
            });

            // this validates Userid and Token
            var isValidPlayer =
                await PlayerList.Instance.ValidatePlayer(unverifiedClientVersion, unverifiedConnPlayer, unverifiedToken);

            if (isValidPlayer == false)
            {
                ClearCache();
                PlayerList.Instance.Remove(unverifiedConnPlayer);
                Logger.LogWarning($"Set up new player: invalid player. For {unverifiedUsername}", Category.Connections);
                return;
            }

            //Add player to the list of current round players
            PlayerList.Instance.AddToRoundPlayers(unverifiedConnPlayer);

            //Send to client their job ban entries
            var jobBanEntries = PlayerList.Instance.ClientAskingAboutJobBans(unverifiedConnPlayer);

            PlayerList.ServerSendsJobBanDataMessage.Send(unverifiedConnPlayer.Connection, jobBanEntries);

            //Send to client the current crew job counts
            if (CrewManifestManager.Instance != null)
            {
                SetJobCountsMessage.SendToPlayer(CrewManifestManager.Instance.Jobs, unverifiedConnPlayer);
            }

            UpdateConnectedPlayersMessage.Send();

            IsValidPlayerAndWaitingOnLoad = true;
            STUnverifiedClientId          = unverifiedClientId;
            STVerifiedUserid     = unverifiedUserid;         //Is validated within  PlayerList.Instance.ValidatePlayer(
            STVerifiedConnPlayer = unverifiedConnPlayer;
        }
    private async void ServerSetUpPlayer(
        string unverifiedClientId,
        string unverifiedUsername,
        string unverifiedUserid,
        int unverifiedClientVersion,
        string unverifiedToken)
    {
        Logger.LogFormat("A joinedviewer called CmdServerSetupPlayer on this server, Unverified ClientId: {0} Unverified Username: {1}",
                         Category.Connections,
                         unverifiedClientId, unverifiedUsername);

        // Register player to player list (logging code exists in PlayerList so no need for extra logging here)
        var unverifiedConnPlayer = PlayerList.Instance.AddOrUpdate(new ConnectedPlayer
        {
            Connection = connectionToClient,
            GameObject = gameObject,
            Username   = unverifiedUsername,
            Job        = JobType.NULL,
            ClientId   = unverifiedClientId,
            UserId     = unverifiedUserid
        });

        // this validates Userid and Token
        var isValidPlayer = await PlayerList.Instance.ValidatePlayer(unverifiedClientId, unverifiedUsername,
                                                                     unverifiedUserid, unverifiedClientVersion, unverifiedConnPlayer, unverifiedToken);

        if (isValidPlayer == false)
        {
            Logger.LogWarning($"Set up new player: invalid player. For {unverifiedUsername}", Category.Connections);
            return;
        }

        //Send to client their job ban entries
        var jobBanEntries = PlayerList.Instance.ClientAskingAboutJobBans(unverifiedConnPlayer);

        PlayerList.ServerSendsJobBanDataMessage.Send(unverifiedConnPlayer.Connection, jobBanEntries);

        //Send to client the current crew job counts
        if (CrewManifestManager.Instance != null)
        {
            SetJobCountsMessage.SendToPlayer(CrewManifestManager.Instance.Jobs, unverifiedConnPlayer);
        }

        UpdateConnectedPlayersMessage.Send();

        // Only sync the pre-round countdown if it's already started.
        if (GameManager.Instance.CurrentRoundState == RoundState.PreRound)
        {
            if (GameManager.Instance.waitForStart)
            {
                TargetSyncCountdown(connectionToClient, GameManager.Instance.waitForStart, GameManager.Instance.CountdownEndTime);
            }
            else
            {
                GameManager.Instance.CheckPlayerCount();
            }
        }

        // Check if they have a player to rejoin before creating a new ConnectedPlayer
        var loggedOffPlayer = PlayerList.Instance.RemovePlayerbyClientId(unverifiedClientId, unverifiedUserid, unverifiedConnPlayer);
        var checkForViewer  = loggedOffPlayer?.GameObject.GetComponent <JoinedViewer>();

        if (checkForViewer)
        {
            Destroy(loggedOffPlayer.GameObject);
            loggedOffPlayer = null;
        }

        // If there's a logged off player, we will force them to rejoin their body
        if (loggedOffPlayer == null)
        {
            TargetLocalPlayerSetupNewPlayer(connectionToClient, GameManager.Instance.CurrentRoundState);
        }
        else
        {
            StartCoroutine(WaitForLoggedOffObserver(loggedOffPlayer.GameObject));
        }

        PlayerList.Instance.CheckAdminState(unverifiedConnPlayer, unverifiedUserid);
        PlayerList.Instance.CheckMentorState(unverifiedConnPlayer, unverifiedUserid);
    }
 public void ServerClearList()
 {
     //Tell clients to clear
     SetJobCountsMessage.SendClearMessage();
 }