// Construction
 public CChatPlayer( EPersistenceID persistence_id, ESessionID session_id, string name, List< EPersistenceID > ignore_list )
 {
     PersistenceID = persistence_id;
     SessionID = session_id;
     Name = name;
     ignore_list.ShallowCopy( m_IgnoreList );
 }
 // Construction
 public CConnection( ESessionID id )
 {
     ID = id;
     m_IncomingReader = new BinaryReader( m_IncomingMessageStream );
     Connected = false;
     PendingDisconnectReason = EDisconnectReason.Invalid;
 }
 // Construction
 public CConnectedPlayer( EPersistenceID persistence_id, ESessionID session_id, string name )
 {
     PersistenceID = persistence_id;
     SessionID = session_id;
     Name = name;
     LobbyID = ELobbyID.Invalid;
     MatchID = EMatchInstanceID.Invalid;
     State = EConnectedPlayerState.Chat_Idle;
     ConnectionState = EConnectedPlayerConnectionState.Connecting;
 }
 // Construction
 public CDisconnectRequestOperation( ESessionID id, EDisconnectReason reason )
     : base(ENetworkOperation.Disconnect, id)
 {
     Reason = reason;
 }
 // Construction
 public CConnectRequestOperation( IPEndPoint connection_endpoint, ESessionID id, string name )
     : base(ENetworkOperation.Connect, id)
 {
     Endpoint = connection_endpoint;
     Name = name;
 }
 public void Resume( ESessionID new_id )
 {
     SessionID = new_id;
     ConnectionState = EConnectedPlayerConnectionState.Connecting;
 }
 // Kinda ugly, but otherwise no way to start a message send from CRShared; override in the appropriate places on client/server
 public virtual void Send_Message( CNetworkMessage message, ESessionID destination_id )
 {
 }
        private EPersistenceID Get_Persistence_ID_By_Session_ID( ESessionID session_id )
        {
            EPersistenceID persistence_id = EPersistenceID.Invalid;
            m_ActiveSessions.TryGetValue( session_id, out persistence_id );

            return persistence_id;
        }
        // Player Ops
        private static void On_Chat_Server_Announce_Response( CResponseMessage response, ESessionID session_id, EMessageRequestID client_request_id )
        {
            if ( !CConnectedPlayerManager.Instance.Is_Connection_Valid( session_id ) )
            {
                return;
            }

            CAnnouncePlayerToChatServerResponse message = response as CAnnouncePlayerToChatServerResponse;
            CAnnouncePlayerToChatServerRequest request = message.Request as CAnnouncePlayerToChatServerRequest;
            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Active_Player_By_Persistence_ID( request.PersistenceID );
            if ( player != null )
            {
                CConnectedPlayerManager.Instance.On_Chat_Server_Announce_Response( player, message.Success, client_request_id );
            }
        }
        private void On_Query_Player_Info_Request( CQueryPlayerInfoRequest request, ESessionID source_session )
        {
            CQueryPlayerInfoResponse response = new CQueryPlayerInfoResponse( request.RequestID );
            foreach ( var id in request.IDs )
            {
                CConnectedPlayer player = Get_Active_Player_By_Persistence_ID( id );
                if ( player != null )
                {
                    CPlayerInfo player_info = new CPlayerInfo( id );
                    player_info.Name = player.Name;

                    response.Add_Player_Info( player_info );
                }
            }

            Send_Message( response, source_session );
        }
        public void Add_Connected_Player( ESessionID session_id, EPersistenceID persistence_id, CClientHelloRequest request )
        {
            if ( Get_Player_By_Session_ID( session_id ) != null )
            {
                Send_Message( new CClientHelloResponse( request.RequestID, EConnectRefusalReason.Name_Already_Connected ), session_id );
                Add_Network_Operation( new CDisconnectRequestOperation( session_id, EDisconnectReason.Server_Request ) );
                return;
            }

            if ( Get_Active_Player_By_Persistence_ID( persistence_id ) != null )
            {
                Send_Message( new CClientHelloResponse( request.RequestID, EConnectRefusalReason.Name_Already_Connected ), session_id );
                Add_Network_Operation( new CDisconnectRequestOperation( session_id, EDisconnectReason.Server_Request ) );
                return;
            }

            CPersistentPlayerData player_data = CDatabaseProxy.Instance.Get_Player_Data( persistence_id );
            if ( player_data == null )
            {
                Send_Message( new CClientHelloResponse( request.RequestID, EConnectRefusalReason.Internal_Persistence_Error ), session_id );
                Add_Network_Operation( new CDisconnectRequestOperation( session_id, EDisconnectReason.Server_Request ) );
                return;
            }

            CConnectedPlayer player = null;
            if ( m_SuspendedPlayers.TryGetValue( persistence_id, out player ) )
            {
                m_SuspendedPlayers.Remove( persistence_id );
                m_ConnectedPlayers.Add( persistence_id, player );
                player.Resume( session_id );
                CServerResource.Output_Text( EServerTextID.Server_Player_Reconnected_Notice, player.Name );
                CLog.Log( ELoggingChannel.Logic, ELogLevel.Low, CServerResource.Get_Text( EServerTextID.Server_Player_Reconnected_Notice, player.Name ) );
            }
            else
            {
                player = new CConnectedPlayer( persistence_id, session_id, request.Name );
                m_ConnectedPlayers.Add( persistence_id, player );
                CServerResource.Output_Text( EServerTextID.Server_Player_Connected_Notice, player.Name );
                CLog.Log( ELoggingChannel.Logic, ELogLevel.Low, CServerResource.Get_Text( EServerTextID.Server_Player_Connected_Notice, player.Name ) );
            }

            m_ActiveSessions.Add( session_id, persistence_id );

            // add to chat
            CAsyncBackendOperations.New_Player_Announce_To_Chat( player, player_data, request.RequestID );
        }
        public void Suspend_Connected_Player( ESessionID session_id )
        {
            CConnectedPlayer player = Get_Player_By_Session_ID( session_id );
            if ( player != null )
            {
                m_ConnectedPlayers.Remove( player.PersistenceID );
                player.Suspend();
                CServerLobbyBrowserManager.Instance.Stop_Browsing( player.PersistenceID );
                m_SuspendedPlayers.Add( player.PersistenceID, player );
                m_ActiveSessions.Remove( session_id );

                Send_Message( new CRemovePlayerFromChatServerMessage( session_id ), ESessionID.Loopback );

                CServerResource.Output_Text( EServerTextID.Server_Player_Linkdead_Notice, player.Name );
                CLog.Log( ELoggingChannel.Logic, ELogLevel.Low, CServerResource.Get_Text( EServerTextID.Server_Player_Linkdead_Notice, player.Name ) );
            }
        }
 public void Send_Message( CNetworkMessage message, ESessionID destination_id )
 {
     CServerLogicalThread.Instance.Send_Message( message, destination_id );
 }
        public void Remove_Connected_Player( ESessionID session_id )
        {
            CConnectedPlayer player = Get_Player_By_Session_ID( session_id );
            if ( player != null )
            {
                Detach_Player_From_Game_Systems( player.PersistenceID );

                m_ConnectedPlayers.Remove( player.PersistenceID );
                m_ActiveSessions.Remove( session_id );

                Send_Message( new CRemovePlayerFromChatServerMessage( session_id ), ESessionID.Loopback );

                CServerResource.Output_Text( EServerTextID.Server_Player_Removed_Notice, player.Name );
            }
        }
 public bool Is_Connection_Valid( ESessionID session_id )
 {
     return m_ActiveSessions.ContainsKey( session_id );
 }
        public EPersistenceID Get_Player_ID_By_Session_ID( ESessionID session_id )
        {
            EPersistenceID persistence_id = EPersistenceID.Invalid;
            if ( !m_ActiveSessions.TryGetValue( session_id, out persistence_id ) )
            {
                return EPersistenceID.Invalid;
            }

            return persistence_id;
        }
        public CConnectedPlayer Get_Player_By_Session_ID( ESessionID session_id )
        {
            EPersistenceID persistence_id = EPersistenceID.Invalid;
            if ( !m_ActiveSessions.TryGetValue( session_id, out persistence_id ) )
            {
                return null;
            }

            CConnectedPlayer player = null;
            if ( !m_ConnectedPlayers.TryGetValue( persistence_id, out player ) )
            {
                return null;
            }

            return player;
        }
        private void Handle_Client_Hello_Request( CClientHelloRequest message, ESessionID session_id )
        {
            CGetPlayerDataPersistenceRequest get_data_request = new CGetPlayerDataPersistenceRequest( message.Name );
            get_data_request.Handler = delegate( CPersistenceResponse response )
                {
                    CGetPlayerDataPersistenceResponse get_data_response = response as CGetPlayerDataPersistenceResponse;

                    EPersistenceID player_id = get_data_response.PlayerData.ID;
                    CConnectedPlayerManager.Instance.Add_Connected_Player( session_id, player_id, message );
                };

            CDatabaseProxy.Instance.Submit_Request( get_data_request );
        }
 private void Handle_Disconnection_Request( CDisconnectRequestMessage message, ESessionID session_id )
 {
     CConnectedPlayerManager.Instance.Remove_Connected_Player( session_id );
     Add_Network_Operation( new CDisconnectRequestOperation( session_id, EDisconnectReason.Client_Request ) );
 }
 // Construction
 public CRemovePlayerFromChatServerMessage( ESessionID session_id )
     : base()
 {
     SessionID = session_id;
 }
 public static void Send_Message_To_Session( CNetworkMessage message, ESessionID session_id )
 {
     CServerLogicalThread.Instance.Send_Message( message, session_id );
 }
        // Construction
        public CAnnouncePlayerToChatServerRequest( ESessionID session_id, EPersistenceID persistence_id, string name, List< EPersistenceID > ignore_list )
            : base()
        {
            SessionID = session_id;
            PersistenceID = persistence_id;
            Name = name;

            IgnoreList = new List< EPersistenceID >();
            ignore_list.ShallowCopy( IgnoreList );
        }
        private static void On_Join_General_Channel_Response( CResponseMessage response, ESessionID session_id, EMessageRequestID client_request_id )
        {
            if ( !CConnectedPlayerManager.Instance.Is_Connection_Valid( session_id ) )
            {
                return;
            }

            CJoinChatChannelResponseServerMessage message = response as CJoinChatChannelResponseServerMessage;
            CJoinChatChannelRequestServerMessage request = message.Request as CJoinChatChannelRequestServerMessage;
            EPersistenceID player_id = request.PlayerID;

            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Active_Player_By_Persistence_ID( player_id );
            if ( player != null )
            {
                player.On_Join_General_Channel_Response( message.Error, client_request_id );
            }
        }
        private void Remove_Player( ESessionID session_id )
        {
            CChatPlayer player = Get_Player_By_Session_ID( session_id );
            if ( player == null )
            {
                return;
            }

            List< EChannelID > channels = player.Channels.ToList();
            channels.Apply( channel_id => Remove_From_Channel( player.PersistenceID, channel_id, ELeftChannelReason.Player_Logoff, EPersistenceID.Invalid ) );

            m_ActiveSessions.Remove( player.SessionID );
            m_Players.Remove( player.PersistenceID );
            m_PlayersByName.Remove( player.Name.ToUpper() );

            CLog.Log( ELoggingChannel.Chat, ELogLevel.Medium, String.Format( "Player {0} on session {1} removed from chat server.", player.Name, (int) session_id ) );
        }
        private CChatPlayer Get_Player_By_Session_ID( ESessionID session_id )
        {
            EPersistenceID persistence_id = EPersistenceID.Invalid;
            if ( !m_ActiveSessions.TryGetValue( session_id, out persistence_id ) )
            {
                return null;
            }

            return Get_Player_By_Persistence_ID( persistence_id );
        }
 public void Add_Message( CNetworkMessage message, ESessionID destination_id )
 {
     m_CurrentNetworkFrame.Add_Message( message, destination_id );
 }
        private bool Announce_Player( ESessionID session_id, EPersistenceID persistence_id, string name, List< EPersistenceID > ignore_list )
        {
            if ( Get_Player_By_Session_ID( session_id ) != null || Get_Player_By_Persistence_ID( persistence_id ) != null )
            {
                return false;
            }

            CChatPlayer new_player = new CChatPlayer( persistence_id, session_id, name, ignore_list );
            m_Players.Add( persistence_id, new_player );
            m_ActiveSessions.Add( session_id, persistence_id );
            m_PlayersByName.Add( name.ToUpper(), persistence_id );
            return true;
        }
 // Construction
 public CNetworkOperation( ENetworkOperation op, ESessionID id )
 {
     NetworkOp = op;
     ID = id;
 }
 public override void Send_Message( CNetworkMessage message, ESessionID destination_id )
 {
     Add_Message( message, destination_id );
 }
 // Construction
 public CServerConnection( ESessionID id )
     : base(id)
 {
 }