public static void ManageClient(object service)
        {
            IMessagingClient client = (IMessagingClient)service;

            while (true)
            {
                try
                {
                    if (Program.ServerState == 0)
                    {
                        client.SendShutdown("The server is shutting down.");
                        return;
                    }
                    if (Program.ServerState == 2)
                    {
                        Thread.Sleep(Timeout.Infinite);
                    }
                    CommandParameterPair message = client.RecieveMessage();
                    if (message == null)
                    {
                        Program.Disconnect(ThreadType.ClientThread, client.UserName);
                        return;
                    }
                    var parameters = new StringBuilder();
                    foreach (string param in message.Parameters)
                    {
                        parameters.Append(param + " ");
                    }
                    ConsoleUtilities.PrintCommand("Command {0} was sent from the user {1} with parameters '{2}'", message.Command,
                                                  client.UserName,
                                                  parameters);
                    ClientCommand command;
                    if (Program.ClientCommands.TryGetValue(message.Command, out command))
                    {
                        CommandParameterPair classic = command(client.UserName, message.Parameters);
                        if (classic == null)
                        {
                            continue;
                        }
                        client.SendCommand(classic);
                    }
                    else
                    {
                        client.SendInvalid(String.Format("Unknown command: {0}", message.Command));
                    }
                    if (Program.ServerState == 0)
                    {
                        client.SendShutdown("The server is shutting down.");
                        return;
                    }
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (ThreadInterruptedException)
                {
                }
                catch (ObjectDisposedException e)
                {
                    ConsoleUtilities.PrintWarning("User {0} has disconnected. Data: {1}", client.Client.UserName, e.Message);
                    Program.Disconnect(ThreadType.ClientThread, client.UserName);
                    return;
                }
                catch (IOException e)
                {
                    ConsoleUtilities.PrintWarning("User {0} has disconnected. Data: {1}", client.Client.UserName, e.Message);
                    Program.Disconnect(ThreadType.ClientThread, client.UserName);
                    return;
                }
                catch (SocketException e)
                {
                    ConsoleUtilities.PrintWarning("User {0} has disconnected. Data: {1}", client.Client.UserName, e.Message);
                    Program.Disconnect(ThreadType.ClientThread, client.UserName);
                    return;
                }
                catch (NetworkInformationException e)
                {
                    ConsoleUtilities.PrintWarning("A user has disconnected {0}", e.Message);
                    client.Disconnect("An unknown error has occurred.");
                    Program.Disconnect(ThreadType.ClientThread, client.Client.UserName);
                    return;
                }
            }
        }