private bool Is_Channel_Shutdown_Reason( ERemovedFromLobbyReason reason )
        {
            switch ( reason )
            {
                case ERemovedFromLobbyReason.Lobby_Destroyed_By_Creator:
                case ERemovedFromLobbyReason.Lobby_Destroyed_Creation_Failure:
                case ERemovedFromLobbyReason.Lobby_Destroyed_Game_Started:
                case ERemovedFromLobbyReason.Lobby_Destroyed_Due_To_Disconnect_Timeout:
                    return true;

                default:
                    return false;
            }
        }
        public void Remove_From_Lobby( ELobbyID lobby_id, EPersistenceID player_id, ERemovedFromLobbyReason reason, EMessageRequestID request_id )
        {
            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                return;
            }

            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Removing player {0} from lobby {1} for reason {2}.",
                                                                                                    CConnectedPlayerManager.Get_Player_Log_Name( player_id ),
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    reason.ToString() ) );

            if ( CConnectedPlayerManager.Instance.Is_Connected( player_id ) && reason != ERemovedFromLobbyReason.Lobby_Destroyed_Game_Started )
            {
                CAsyncBackendOperations.Join_General_Channel( player_id, EMessageRequestID.Invalid );
            }

            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Player_By_Persistence_ID( player_id );
            player.On_Leave_Lobby();

            CLobbyMemberLeftOperation op = new CLobbyMemberLeftOperation( player_id, reason );
            bool is_lobby_shutdown = Is_Channel_Shutdown_Reason( reason );
            if ( is_lobby_shutdown )
            {
                CServerMessageRouter.Send_Message_To_Player( new CLobbyOperationMessage( op ), player_id );
            }
            else
            {
                Send_Message_To_Members( lobby_id, new CLobbyOperationMessage( op ) );
            }

            lobby.Remove_Member( player_id, !is_lobby_shutdown );
        }
 // construction
 public CLobbyMemberLeftOperation( EPersistenceID player_id, ERemovedFromLobbyReason reason )
 {
     PlayerID = player_id;
     Reason = reason;
 }
 public void Remove_From_Lobby( ELobbyID lobby_id, EPersistenceID player_id, ERemovedFromLobbyReason reason )
 {
     Remove_From_Lobby( lobby_id, player_id, reason, EMessageRequestID.Invalid );
 }
        private EClientTextID Compute_Leave_Lobby_Text_ID( ERemovedFromLobbyReason reason, EPersistenceID leaving_player_id, EPersistenceID creator_id )
        {
            EPersistenceID local_player_id = CClientLogicalThread.Instance.ConnectedID;
            switch ( reason )
            {
                case ERemovedFromLobbyReason.Kicked_By_Creator:
                    if ( local_player_id == leaving_player_id )
                    {
                        return EClientTextID.Client_Lobby_Leave_You_Were_Kicked;
                    }
                    else if ( local_player_id == creator_id )
                    {
                        return EClientTextID.Client_Lobby_Leave_You_Kicked_Someone;
                    }
                    else
                    {
                        return EClientTextID.Client_Lobby_Leave_Someone_Was_Kicked;
                    }

                case ERemovedFromLobbyReason.Banned_By_Creator:
                    if ( local_player_id == leaving_player_id )
                    {
                        return EClientTextID.Client_Lobby_Leave_You_Were_Banned;
                    }
                    else if ( local_player_id == creator_id )
                    {
                        return EClientTextID.Invalid;	// in this case, we just want to print the success message from the ban result message
                    }
                    else
                    {
                        return EClientTextID.Client_Lobby_Leave_Someone_Was_Banned;
                    }

                case ERemovedFromLobbyReason.Disconnect_Timeout:
                    return EClientTextID.Client_Lobby_Leave_Disconnect_Timeout;

                case ERemovedFromLobbyReason.Lobby_Destroyed_Due_To_Disconnect_Timeout:
                    return EClientTextID.Client_Lobby_Leave_Creator_Disconnect_Timeout;

                case ERemovedFromLobbyReason.Lobby_Destroyed_By_Creator:
                    if ( local_player_id == creator_id )
                    {
                        return EClientTextID.Client_Lobby_Leave_You_Destroyed_The_Lobby;
                    }
                    else
                    {
                        return EClientTextID.Client_Lobby_Leave_Lobby_Destroyed;
                    }

                case ERemovedFromLobbyReason.Lobby_Destroyed_Creation_Failure:
                    return EClientTextID.Invalid;

                case ERemovedFromLobbyReason.Lobby_Destroyed_Game_Started:
                    return EClientTextID.Invalid;

                case ERemovedFromLobbyReason.Self_Request:
                    if ( local_player_id == leaving_player_id )
                    {
                        return EClientTextID.Client_Lobby_Leave_You_Left;
                    }
                    else
                    {
                        return EClientTextID.Client_Lobby_Leave_Player_Left;
                    }

                case ERemovedFromLobbyReason.Unknown:
                    return EClientTextID.Client_Lobby_Leave_Unknown_Reason;

                case ERemovedFromLobbyReason.Rejoin_Failure:
                    return EClientTextID.Client_Lobby_Leave_Rejoin_Failure;
            }

            return EClientTextID.Invalid;
        }