private ERemovedFromLobbyReason Compute_Removal_Reason( ELobbyDestroyedReason destroy_reason )
        {
            switch ( destroy_reason )
            {
                case ELobbyDestroyedReason.Creation_Failure:
                    return ERemovedFromLobbyReason.Lobby_Destroyed_Creation_Failure;

                case ELobbyDestroyedReason.Creator_Destroyed:
                    return ERemovedFromLobbyReason.Lobby_Destroyed_By_Creator;

                case ELobbyDestroyedReason.Creator_Disconnect_Timeout:
                    return ERemovedFromLobbyReason.Lobby_Destroyed_Due_To_Disconnect_Timeout;

                case ELobbyDestroyedReason.Game_Started:
                    return ERemovedFromLobbyReason.Lobby_Destroyed_Game_Started;

                case ELobbyDestroyedReason.Chat_Channel_Creation_Failure:
                case ELobbyDestroyedReason.Chat_Channel_Join_Failure:
                    return ERemovedFromLobbyReason.Unable_To_Join_Chat_Channel;
            }

            return ERemovedFromLobbyReason.Unknown;
        }
        public void Shutdown_Lobby( ELobbyID lobby_id, ELobbyDestroyedReason reason )
        {
            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Shutting down lobby {0} for reason {1}.",
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    reason.ToString() ) );

            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                return;
            }

            if ( lobby.IsPublic )
            {
                CServerLobbyBrowserManager.Instance.Notify_Browsers_Of_Removed_Lobby( lobby_id );
            }

            List< EPersistenceID > members = new List< EPersistenceID >( lobby.MemberIDs );
            members.Apply( member => Remove_From_Lobby( lobby.ID, member, Compute_Removal_Reason( reason ) ) );

            if ( lobby.ChatChannel != EChannelID.Invalid )
            {
                CDestroyChatChannelServerMessage destroy_channel_message = new CDestroyChatChannelServerMessage( lobby.ChatChannel );
                CServerMessageRouter.Send_Message_To_Chat_Server( destroy_channel_message );
            }

            m_Lobbies.Remove( lobby_id );
            m_LobbiesByCreator.Remove( lobby.Creator );
        }