static ServerStatus hostServer(ServerSettings settings) { Server server = new Server(settings); try { server.hostingLoop(); } catch (Exception e) { //Write an error log TextWriter writer = File.CreateText("KLFServerlog.txt"); writer.WriteLine(e.ToString()); if (server.threadExceptionStackTrace != null && server.threadExceptionStackTrace.Length > 0) { writer.Write("Stacktrace: "); writer.WriteLine(server.threadExceptionStackTrace); } writer.Close(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Red; Server.stampedConsoleWriteLine("Unexpected exception encountered! Crash report written to KLFServerlog.txt"); Console.WriteLine(e.ToString()); if (server.threadExceptionStackTrace != null && server.threadExceptionStackTrace.Length > 0) { Console.Write("Stacktrace: "); Console.WriteLine(server.threadExceptionStackTrace); } Console.WriteLine(); Console.ResetColor(); //server.clearState(); //return ServerStatus.CRASHED; } server.clearState(); if (server.stop) return ServerStatus.STOPPED; if (!settings.autoRestart || server.quit) return ServerStatus.QUIT; return ServerStatus.RESTARTING; }
static ServerStatus HostServer(ServerSettings s) { //main server instance Server server = new Server(s); try { server.HostingLoop(); } catch (Exception e) { //Write an error log TextWriter writer = File.CreateText("KLFServerlog.txt"); writer.WriteLine(e.ToString()); if(server.CurrentThreadExceptionStackTrace != null && server.CurrentThreadExceptionStackTrace.Length > 0) { writer.Write("Stacktrace: "); writer.WriteLine(server.CurrentThreadExceptionStackTrace); } writer.Close(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Red; Server.StampedConsoleWriteLine("Unexpected exception encountered! Crash report written to KLFServerlog.txt"); Console.WriteLine(e.ToString()); if(server.CurrentThreadExceptionStackTrace != null && server.CurrentThreadExceptionStackTrace.Length > 0) { Console.Write("Stacktrace: "); Console.WriteLine(server.CurrentThreadExceptionStackTrace); } Console.WriteLine(); Console.ResetColor(); //server.clearState(); //return ServerStatus.Crashed; } server.ClearState(); if (server.Stop) return ServerStatus.Stopped; if (!s.AutoRestart || server.Quit) return ServerStatus.Quit; return ServerStatus.Restarting; }
static void Main(string[] args) { Console.Title = "KLF Server " + KLFCommon.PROGRAM_VERSION; Console.WriteLine("KLF Server version " + KLFCommon.PROGRAM_VERSION); Console.WriteLine("Created by Alfred Lam"); Console.WriteLine(); ServerSettings settings = new ServerSettings(); settings.readConfigFile(); bool firstLoop = true; while (true) { Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Port: "); Console.ResetColor(); Console.WriteLine(settings.port); Console.ForegroundColor = ConsoleColor.Green; Console.Write("HTTP Port: "); Console.ResetColor(); Console.WriteLine(settings.httpPort); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Max Clients: "); Console.ResetColor(); Console.WriteLine(settings.maxClients); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Join Message: "); Console.ResetColor(); Console.WriteLine(settings.joinMessage); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Server Info: "); Console.ResetColor(); Console.WriteLine(settings.serverInfo); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Updates Per Second: "); Console.ResetColor(); Console.WriteLine(settings.updatesPerSecond); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Total Inactive Ships: "); Console.ResetColor(); Console.WriteLine(settings.totalInactiveShips); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Screenshot Height: "); Console.ResetColor(); Console.WriteLine(settings.screenshotSettings.maxHeight); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Screenshot Interval: "); Console.ResetColor(); Console.WriteLine(settings.screenshotInterval + "ms"); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Save Screenshots: "); Console.ResetColor(); Console.WriteLine(settings.saveScreenshots); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Auto-Restart: "); Console.ResetColor(); Console.WriteLine(settings.autoRestart); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Auto-Host: "); Console.ResetColor(); Console.WriteLine(settings.autoHost); Console.ResetColor(); Console.WriteLine(); Console.WriteLine("P: change port, HP: change http port, M: change max clients"); Console.WriteLine("J: join message, IF: server info, U: updates per second, IS: total inactive ships"); Console.WriteLine("SH: screenshot height, SI: screenshot interval, SV: save screenshots"); Console.WriteLine("AR: toggle auto-restart, AH: toggle auto-host"); Console.WriteLine("H: begin hosting, Q: quit"); String in_string; if (settings.autoHost && firstLoop) { in_string = "h"; } else { in_string = Console.ReadLine().ToLower(); } firstLoop = false; if (in_string == "q") { break; } else if (in_string == "p") { Console.Write("Enter the Port: "); int new_port; if (int.TryParse(Console.ReadLine(), out new_port)) { settings.port = new_port; settings.writeConfigFile(); } else { Console.WriteLine("Invalid port [" + IPEndPoint.MinPort + '-' + IPEndPoint.MaxPort + ']'); } } else if (in_string == "hp") { Console.Write("Enter the HTTP Port: "); int new_port; if (int.TryParse(Console.ReadLine(), out new_port)) { settings.httpPort = new_port; settings.writeConfigFile(); } else { Console.WriteLine("Invalid port [" + IPEndPoint.MinPort + '-' + IPEndPoint.MaxPort + ']'); } } else if (in_string == "m") { Console.Write("Enter the max number of clients: "); int new_value; if (int.TryParse(Console.ReadLine(), out new_value) && new_value > 0) { settings.maxClients = new_value; settings.writeConfigFile(); } else Console.WriteLine("Invalid number of clients"); } else if (in_string == "j") { Console.Write("Enter the join message: "); settings.joinMessage = Console.ReadLine(); settings.writeConfigFile(); } else if (in_string == "if") { Console.Write("Enter the server info message: "); settings.serverInfo = Console.ReadLine(); settings.writeConfigFile(); } else if (in_string == "u") { Console.Write("Enter the number of updates to receive per second: "); float new_value; if (float.TryParse(Console.ReadLine(), out new_value)) { settings.updatesPerSecond = new_value; settings.writeConfigFile(); } else { Console.WriteLine("Invalid updates per second [" + ServerSettings.MIN_UPDATES_PER_SECOND + '-' + ServerSettings.MAX_UPDATES_PER_SECOND + ']'); } } else if (in_string == "sh") { Console.Write("Enter the screenshot height: "); int new_value; if (int.TryParse(Console.ReadLine(), out new_value)) { settings.screenshotSettings.maxHeight = new_value; settings.writeConfigFile(); } else { Console.WriteLine("Invalid screenshot height."); } } else if (in_string == "si") { Console.Write("Enter the screenshot interval: "); int new_value; if (int.TryParse(Console.ReadLine(), out new_value)) { settings.screenshotInterval = new_value; settings.writeConfigFile(); } } else if (in_string == "is") { Console.Write("Enter the total number of inactive ships: "); byte new_value; if (byte.TryParse(Console.ReadLine(), out new_value)) { settings.totalInactiveShips = new_value; settings.writeConfigFile(); } else { Console.WriteLine("Invalid total inactive ships [" + Byte.MinValue + '-' + Byte.MaxValue + ']'); } } else if (in_string == "sv") { settings.saveScreenshots = !settings.saveScreenshots; settings.writeConfigFile(); } else if (in_string == "ar") { settings.autoRestart = !settings.autoRestart; settings.writeConfigFile(); } else if (in_string == "ah") { settings.autoHost = !settings.autoHost; settings.writeConfigFile(); } else if (in_string == "h") { ServerStatus status = hostServer(settings); while (status == ServerStatus.RESTARTING) { System.Threading.Thread.Sleep(AUTO_RESTART_DELAY); status = hostServer(settings); } if (status == ServerStatus.QUIT) { Console.WriteLine("Press any key to quit"); Console.ReadKey(); break; } else { Console.WriteLine("Server "+Enum.GetName(typeof(ServerStatus), status).ToLower()); } } } }
static void Main(string[] args) { Console.Title = "KLF Server " + KLFCommon.ProgramVersion; Console.WriteLine("KLF Server Copyright (C) 2013 Alfred Lam"); Console.WriteLine("This program comes with ABSOLUTELY NO WARRANTY; for details type `/show'."); Console.WriteLine("This is free software, and you are welcome to redistribute it"); Console.WriteLine("under certain conditions; type `/show' for details."); Console.WriteLine(); Configuration = ServerSettings.Load(Path.Combine("./", Filename)); if(Configuration == null) { Configuration = new ServerSettings();//default cfg Configuration.Save(Path.Combine("./", Filename)); } bool goodState = true; if(Configuration.AutoHost) goodState = ServerLoop();//jump right in while (goodState) { Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Port: "); Console.ResetColor(); Console.WriteLine(Configuration.Port); Console.ForegroundColor = ConsoleColor.Green; Console.Write("HTTP Port: "); Console.ResetColor(); Console.WriteLine(Configuration.HttpPort); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Max Clients: "); Console.ResetColor(); Console.WriteLine(Configuration.MaxClients); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Join Message: "); Console.ResetColor(); Console.WriteLine(Configuration.JoinMessage); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Server Info: "); Console.ResetColor(); Console.WriteLine(Configuration.ServerInfo); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Updates Per Second: "); Console.ResetColor(); Console.WriteLine(Configuration.UpdatesPerSecond); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Total Inactive Ships: "); Console.ResetColor(); Console.WriteLine(Configuration.TotalInactiveShips); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Screenshot Height: "); Console.ResetColor(); Console.WriteLine(Configuration.ScreenshotSettings.MaxHeight); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Screenshot Interval: "); Console.ResetColor(); Console.WriteLine(Configuration.ScreenshotInterval + "ms"); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Screenshot Backlog: "); Console.ResetColor(); Console.WriteLine(Configuration.ScreenshotBacklog); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Save Screenshots: "); Console.ResetColor(); Console.WriteLine(Configuration.SaveScreenshots); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Auto-Restart: "); Console.ResetColor(); Console.WriteLine(Configuration.AutoRestart); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Auto-Host: "); Console.ResetColor(); Console.WriteLine(Configuration.AutoHost); Console.ResetColor(); Console.WriteLine(); Console.WriteLine("/port change port"); Console.WriteLine("/http change http port"); Console.WriteLine("/max change max clients"); Console.WriteLine("/motd join message"); Console.WriteLine("/info server info"); Console.WriteLine("/rate updates per second"); Console.WriteLine("/ships total inactive ships"); Console.WriteLine("/size screenshot height"); Console.WriteLine("/shutter screenshot interval"); Console.WriteLine("/album screenshot save"); Console.WriteLine("/recent screenshot backlog"); Console.WriteLine("/auto toggle auto-restart"); Console.WriteLine("/quick toggle auto-host on startup"); Console.WriteLine("/host begin hosting"); Console.WriteLine("/quit quit"); String[] MenuArgs = Console.ReadLine().Split(' '); switch(MenuArgs[0].ToLowerInvariant()) { case "/quit": goodState = false; break; case "/port": Console.Write("Enter the Port: "); int newServerPort; if (int.TryParse(Console.ReadLine(), out newServerPort)) { Configuration.Port = newServerPort; Configuration.Save(); } else Console.WriteLine("Invalid port [" + IPEndPoint.MinPort + '-' + IPEndPoint.MaxPort + ']' ); break; case "/http": Console.Write("Enter the HTTP Port: "); int newHttpPort; if (int.TryParse(Console.ReadLine(), out newHttpPort)) { Configuration.HttpPort = newHttpPort; Configuration.Save(); } else Console.WriteLine("Invalid port [" + IPEndPoint.MinPort + '-' + IPEndPoint.MaxPort + ']' ); break; case "/max": Console.Write("Enter the max number of clients: "); int newMax; if (int.TryParse(Console.ReadLine(), out newMax) && newMax > 0) { Configuration.MaxClients = newMax; Configuration.Save(); } else Console.WriteLine("Invalid number of clients"); break; case "/motd": Console.Write("Enter the join message: "); Configuration.JoinMessage = Console.ReadLine(); Configuration.Save(); break; case "/info": Console.Write("Enter the server info message: "); Configuration.ServerInfo = Console.ReadLine(); Configuration.Save(); break; case "/rate": Console.Write("Enter the number of updates to receive per second: "); float newRate; if (float.TryParse(Console.ReadLine(), out newRate)) { Configuration.UpdatesPerSecond = newRate; Configuration.Save(); } else Console.WriteLine("Invalid updates per second (" + ServerSettings.MinUpdatesPerSecond + ".." + ServerSettings.MaxUpdatesPerSecond + ")" ); break; case "/size": Console.Write("Enter the screenshot height: "); int newHeight; if (int.TryParse(Console.ReadLine(), out newHeight)) { Configuration.ScreenshotSettings.MaxHeight = newHeight; Configuration.Save(); } else Console.WriteLine("Invalid screenshot height."); break; case "/shutter": Console.Write("Enter the screenshot interval: "); int newShutterSpeed; if (int.TryParse(Console.ReadLine(), out newShutterSpeed)) { Configuration.ScreenshotInterval = newShutterSpeed; Configuration.Save(); } break; case "/recent": Console.Write("Enter the screenshot backlog: "); int newRecentCount; if (int.TryParse(Console.ReadLine(), out newRecentCount) && newRecentCount >= 1) { Configuration.ScreenshotBacklog = newRecentCount; Configuration.Save(); } break; case "/ships": Console.Write("Enter the total number of inactive ships: "); byte newTrash; if (byte.TryParse(Console.ReadLine(), out newTrash)) { Configuration.TotalInactiveShips = newTrash; Configuration.Save(); } else Console.WriteLine("Invalid total inactive ships [" + Byte.MinValue + '-' + Byte.MaxValue + ']' ); break; case "/album": Configuration.SaveScreenshots = !Configuration.SaveScreenshots; Configuration.Save(); break; case "/auto": Configuration.AutoRestart = !Configuration.AutoRestart; Configuration.Save(); break; case "/quick": Configuration.AutoHost = !Configuration.AutoHost; Configuration.Save(); break; case "/host": goodState = ServerLoop(); break; case "/show": ShowLicense(); break; //TODO cases for Flooding and Throttle settings default: break; } } }
//Methods public Server(ServerSettings s) { this.Configuration = s; }
//Methods public Server(ServerSettings settings) { this.settings = settings; }