using System; using System.Collections.Concurrent; using System.Net; using Mistox.ResevedPackets; namespace Mistox.Client { public class MistoxClient { public string ServerName { get; set; } = ""; // The Name of the server public bool Alive { get; set; } = true; // Is the server running public mTCPClient ServerConnection; public ConcurrentDictionary clientConnections; public MistoxClient(IPEndPoint Server) { Console.WriteLine( "The client is initilized and trying to connect to the server at ip : " + Server.Address ); try { ServerConnection = new mTCPClient( this, Server ); Console.WriteLine( "Connected to the server sucessfully" ); } catch( Exception e ) { Console.WriteLine( "An error has occured with the connection to the server. Error { " ); Console.WriteLine( e.ToString() ); Console.WriteLine( "}" ); } Alive = true; } public void UserConnected(UserConnectedPacket packet) { mUDPClient user = new mUDPClient(this, packet.ClientIPAddress, packet.ClientPort) { UserName = packet.UserName }; clientConnections[packet.UserName] = user; InvokeOnUserConnected(user); } public void UserDisconnected(UserDisconnectedPacket packet) { mUDPClient copy = clientConnections[packet.UserName]; clientConnections[packet.UserName].Alive = false; clientConnections[packet.UserName].Dispose(); clientConnections[packet.UserName] = null; InvokeOnUserDisconnected( copy ); } // Events public event Action onServerConnected; public void InvokeOnServerConnected(){ Alive = true; onServerConnected?.Invoke(); } public event Action onUserConnected; public void InvokeOnUserConnected(mUDPClient ConnectedUser){ onUserConnected?.Invoke(ConnectedUser); } public event Action onDataReceived; public void InvokeOnReceived(dynamic DataPacket){ switch (DataPacket as object) { case UserConnectedPacket packet: UserConnected(packet); break; case UserDisconnectedPacket packet: UserDisconnected(packet); break; case null: Console.WriteLine("Received a null packet."); break; default: onDataReceived?.Invoke(DataPacket); break; } } public event Action onUserDisconnected; public void InvokeOnUserDisconnected(mUDPClient DisconnectedUser){ onUserDisconnected?.Invoke(DisconnectedUser); } public event Action onServerDisconnected; public void InvokeOnServerDisconnected(){ Alive = false; onServerDisconnected?.Invoke(); } } }