/// <summary>
        /// Handle PackageData
        /// </summary>
        /// <param name="p">Package</param>
        public void Handle(Package p)
        {
            try
            {
                switch (p.PackageType)
                {
                    case (int)Package.PackageTypes.Unknown:
                        Core.Logger.Log("Unable to handle the package due to unknown type.", Logger.LogTypes.Debug, p.Client);
                        break;

                    case (int)Package.PackageTypes.Authentication:
                    case (int)Package.PackageTypes.Ping:
                        Core.Logger.Log("Unable to handle this package as it is not getable.", Logger.LogTypes.Debug, p.Client);
                        break;

                    case (int)Package.PackageTypes.Kick:
                        HandleKick(p);
                        break;

                    case (int)Package.PackageTypes.AddPlayer:
                        HandleAddPlayer(p);
                        break;

                    case (int)Package.PackageTypes.UpdatePlayer:
                        HandleUpdatePlayer(p);
                        break;

                    case (int)Package.PackageTypes.RemovePlayer:
                        HandleRemovePlayer(p);
                        break;

                    case (int)Package.PackageTypes.Logger:
                        HandleLogger(p);
                        break;

                    case (int)Package.PackageTypes.GetAllCrashLogs:
                    case (int)Package.PackageTypes.GetAllLogs:
                    case (int)Package.PackageTypes.BeginCreateFile:
                    case (int)Package.PackageTypes.BeginDownloadFile:
                    case (int)Package.PackageTypes.EndDownloadFile:
                    case (int)Package.PackageTypes.EndCreateFile:
                        Core.RCONGUIDownloadQueue.HandlePackage(p);
                        break;

                    default:
                        Core.Logger.Log("Unable to handle the package due to unknown type.", Logger.LogTypes.Debug, p.Client);
                        break;
                }
            }
            catch (Exception ex)
            {
                ex.CatchError();
            }
        }
 private void HandleLogger(Package p)
 {
     LoggerEvent.Invoke(p.DataItems[0]);
 }
 private void HandleRemovePlayer(Package p)
 {
     PlayerEvent.Invoke(PlayerEvent.Types.Remove, p.DataItems[0]);
 }
 private void HandleUpdatePlayer(Package p)
 {
     PlayerEvent.Invoke(PlayerEvent.Types.Update, p.DataItems[0]);
 }
 private void HandleAddPlayer(Package p)
 {
     PlayerEvent.Invoke(PlayerEvent.Types.Add, p.DataItems[0]);
 }
 private void HandleKick(Package p)
 {
     Core.Logger.Log($"You have been kicked with the following reason: {p.DataItems[0]}", Logger.LogTypes.Info);
     Core.RCONGUIListener.Dispose();
 }
        private void ThreadStartListening()
        {
            try
            {
                Core.Logger.Log($"Connecting to the specified server... Please wait.", Logger.LogTypes.Info);

                Client = new TcpClient();

                if (!Client.ConnectAsync(IPAddress, Port).Wait(5000))
                {
                    Core.Logger.Log(Core.Setting.Token("RCON_CONNECTFAILED"), Logger.LogTypes.Info);
                    return;
                }

                Reader = new StreamReader(Client.GetStream());
                Writer = new StreamWriter(Client.GetStream());

                SentToServer(new Package(Package.PackageTypes.Authentication, new List<string> { Password.Md5HashGenerator(), Password.SHA1HashGenerator(), Password.SHA256HashGenerator() }, null));

                string ReturnMessage = Reader.ReadLine();

                if (string.IsNullOrEmpty(ReturnMessage))
                {
                    Core.Logger.Log(Core.Setting.Token("RCON_CONNECTFAILED"), Logger.LogTypes.Info);
                    return;
                }
                else
                {
                    Package Package = new Package(ReturnMessage, Client);
                    if (Package.IsValid)
                    {
                        Core.Logger.Log($"Receive: {Package.ToString()}", Logger.LogTypes.Debug, Client);

                        if (Package.DataItems[0] == Package.AuthenticationStatus.AccessGranted.ToString())
                        {
                            Core.Logger.Log($"You are now connected to the server.", Logger.LogTypes.Info);
                            IsActive = true;
                        }
                        else if (Package.DataItems[0] == Package.AuthenticationStatus.AccessDenied.ToString())
                        {
                            Core.Logger.Log(Core.Setting.Token("RCON_CONNECTFAILED"), Logger.LogTypes.Info);
                            return;
                        }
                    }
                    else
                    {
                        Core.Logger.Log(Core.Setting.Token("RCON_CONNECTFAILED"), Logger.LogTypes.Info);
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                ex.CatchError();
                Core.Logger.Log(Core.Setting.Token("RCON_CONNECTFAILED"), Logger.LogTypes.Info);
                return;
            }

            Thread Thread2 = new Thread(new ThreadStart(ThreadStartPinging)) { IsBackground = true };
            Thread2.Start();
            ThreadCollection.Add(Thread2);

            do
            {
                try
                {
                    ThreadPool.QueueWorkItem(new WorkItemCallback(ThreadPreHandlePackage), Reader.ReadLine());
                }
                catch (Exception) { }
            } while (IsActive);
        }
 /// <summary>
 /// Sent To Server
 /// </summary>
 /// <param name="p">Package to send.</param>
 public void SentToServer(Package p)
 {
     ThreadPool3.QueueWorkItem(new WorkItemCallback(ThreadSentToServer), p);
 }
        private object ThreadPreHandlePackage(object p)
        {
            if (string.IsNullOrEmpty((string)p))
            {
                if (IsActive)
                {
                    IsActive = false;
                    Core.Logger.Log(Core.Setting.Token("SERVER_CLOSE"), Logger.LogTypes.Info);
                    Dispose();
                }
            }
            else
            {
                Package Package = new Package((string)p, Client);
                if (Package.IsValid)
                {
                    ThreadPool2.QueueWorkItem(new WorkItemCallback(ThreadHandlePackage), Package);
                    Core.Logger.Log($"Receive: {Package.ToString()}", Logger.LogTypes.Debug, Client);
                }
            }

            return null;
        }
        private void Download(Package p)
        {
            if (Status == DownloadStatus.Initializing.ToString())
            {
                Status = DownloadStatus.Downloading.ToString();
            }

            for (int i = 1; i < p.DataItemsCount; i += 2)
            {
                CurrentLineID += 1;

                if (p.DataItems[i].ToInt() == CurrentLineID)
                {
                    CurrentBytes_L += Encoding.UTF8.GetByteCount((p.DataItems[i + 1] + Environment.NewLine).ToCharArray());

                    if (CurrentBytes_L < 1024)
                    {
                        CurrentBytes = CurrentBytes_L.ToString("F2") + " B";
                    }
                    else if (CurrentBytes_L < 1024 * 1024)
                    {
                        CurrentBytes = Shared.jianmingyong.Modules.Math.Round(CurrentBytes_L / 1024, 2).ToString("F2") + " KB";
                    }
                    else if (CurrentBytes_L < 1024 * 1024 * 1024)
                    {
                        CurrentBytes = Shared.jianmingyong.Modules.Math.Round(CurrentBytes_L / 1024 / 1024,2).ToString("F2") + " MB";
                    }

                    Writer.WriteLine(p.DataItems[i + 1]);
                    Writer.Flush();
                }
                else
                {
                    Status = DownloadStatus.Canceled.ToString();
                    break;
                }
            }

            if (Status == DownloadStatus.Canceled.ToString())
            {
                Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginDownloadFile, new List<string> { ID.ToString(), Package.BeginDownloadFileStatus.Cancel.ToString() }, null));
            }
            else if (Status == DownloadStatus.Downloading.ToString())
            {
                Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginDownloadFile, new List<string> { ID.ToString(), Package.BeginDownloadFileStatus.RequestNextLine.ToString() }, null));
            }
            else if (Status == DownloadStatus.Paused.ToString())
            {
                Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginDownloadFile, new List<string> { ID.ToString(), Package.BeginDownloadFileStatus.Pause.ToString() }, null));
            }
        }
        /// <summary>
        /// Handle Package
        /// </summary>
        /// <param name="p">Package</param>
        public void HandlePackage(Package p)
        {
            if (p.PackageType == (int)Package.PackageTypes.BeginDownloadFile)
            {
                if (p.DataItems[1].ToInt() == 1)
                {
                    Writer = new StreamWriter(Stream);

                    Thread Thread = new Thread(new ThreadStart(GetDownloadSpeed)) { IsBackground = true };
                    Thread.Start();
                    ThreadCollection.Add(Thread);
                }

                Download(p);
            }
            else if (p.PackageType == (int)Package.PackageTypes.EndDownloadFile)
            {
                if (CurrentBytes_L == TotalBytes_L)
                {
                    Status = DownloadStatus.Completed.ToString();
                    Speed = "0 B/s";
                }
                else if (CurrentBytes_L - Encoding.UTF8.GetByteCount(Environment.NewLine.ToCharArray()) == TotalBytes_L)
                {
                    Status = DownloadStatus.Completed.ToString();
                    Speed = "0 B/s";
                }
                else
                {
                    Status = DownloadStatus.Canceled.ToString();
                }

                Writer.Dispose();

                Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.EndDownloadFile, new List<string> { ID.ToString(), Package.EndDownloadFileStatus.DownloadStreamDisposed.ToString() }, null));
            }
            else if (p.PackageType == (int)Package.PackageTypes.EndCreateFile)
            {
                Stream.Dispose();

                Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.EndCreateFile, new List<string> { ID.ToString(), Package.EndCreateFileStatus.FileStreamDisposed.ToString() }, null));
            }
        }
        /// <summary>
        /// New Download File
        /// </summary>
        /// <param name="p">Package</param>
        /// <param name="Type">File Type</param>
        public DownloadFile(Package p, FileType Type)
        {
            ID = p.DataItems[0].ToInt();
            Name = p.DataItems[1];
            TotalBytes_L = p.DataItems[2].ToLong();

            if (TotalBytes_L < 1024)
            {
                TotalBytes = TotalBytes_L.ToString("F2") + " B";
            }
            else if (TotalBytes_L < 1024 * 1024)
            {
                TotalBytes = Shared.jianmingyong.Modules.Math.Round(TotalBytes_L / 1024, 2).ToString("F2") + " KB";
            }
            else if (TotalBytes_L < 1024 * 1024 * 1024)
            {
                TotalBytes = Shared.jianmingyong.Modules.Math.Round(TotalBytes_L / 1024 / 1024,2).ToString("F2") + " MB";
            }

            Status = DownloadStatus.Initializing.ToString();

            if (Type == FileType.CrashLog)
            {
                if (!Directory.Exists(Core.Setting.ApplicationDirectory + "\\Download\\CrashLogs"))
                {
                    Directory.CreateDirectory(Core.Setting.ApplicationDirectory + "\\Download\\CrashLogs");
                }

                if (File.Exists(Core.Setting.ApplicationDirectory + "\\Download\\CrashLogs\\" + Name))
                {
                    Stream = new FileStream(Core.Setting.ApplicationDirectory + "\\Download\\CrashLogs\\" + Name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

                    if (Stream.Length == TotalBytes_L || Stream.Length - Encoding.UTF8.GetByteCount(Environment.NewLine.ToCharArray()) == TotalBytes_L)
                    {
                        Status = DownloadStatus.Skipped.ToString();

                        Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginCreateFile, new List<string> { ID.ToString(), Package.BeginCreateFileStatus.FileExisted.ToString() }, null));
                    }
                    else
                    {
                        Stream = new FileStream(Core.Setting.ApplicationDirectory + "\\Download\\CrashLogs\\" + Name, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

                        Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginCreateFile, new List<string> { ID.ToString(), Package.BeginCreateFileStatus.FileCreated.ToString() }, null));
                    }
                }
                else
                {
                    Stream = new FileStream(Core.Setting.ApplicationDirectory + "\\Download\\CrashLogs\\" + Name, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

                    Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginCreateFile, new List<string> { ID.ToString(), Package.BeginCreateFileStatus.FileCreated.ToString() }, null));
                }
            }
            else if (Type == FileType.Logger)
            {
                if (!Directory.Exists(Core.Setting.ApplicationDirectory + "\\Download\\Logger"))
                {
                    Directory.CreateDirectory(Core.Setting.ApplicationDirectory + "\\Download\\Logger");
                }

                if (File.Exists(Core.Setting.ApplicationDirectory + "\\Download\\Logger\\" + Name))
                {
                    Stream = new FileStream(Core.Setting.ApplicationDirectory + "\\Download\\Logger\\" + Name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

                    if (Stream.Length == TotalBytes_L || Stream.Length - Encoding.UTF8.GetByteCount(Environment.NewLine.ToCharArray()) == TotalBytes_L)
                    {
                        Status = DownloadStatus.Skipped.ToString();

                        Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginCreateFile, new List<string> { ID.ToString(), Package.BeginCreateFileStatus.FileExisted.ToString() }, null));
                    }
                    else
                    {
                        Stream = new FileStream(Core.Setting.ApplicationDirectory + "\\Download\\Logger\\" + Name, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

                        Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginCreateFile, new List<string> { ID.ToString(), Package.BeginCreateFileStatus.FileCreated.ToString() }, null));
                    }
                }
                else
                {
                    Stream = new FileStream(Core.Setting.ApplicationDirectory + "\\Download\\Logger\\" + Name, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

                    Core.RCONGUIListener.SentToServer(new Package(Package.PackageTypes.BeginCreateFile, new List<string> { ID.ToString(), Package.BeginCreateFileStatus.FileCreated.ToString() }, null));
                }
            }
        }