/// <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)); } } }