public void Run() { string input = AsyncConsoleReader.ReadLine(); while (input != "") { try { DarkLog.Normal("Command input: " + input); if (input.StartsWith("/")) { HandleServerInput(input.Substring(1)); } else { if (input != "") { m_commands["say"].func(input); } } input = AsyncConsoleReader.ReadLine(); } catch (Exception e) { if (Server.serverRunning) { DarkLog.Fatal("Error in command handler thread, Exception: " + e); throw; } } } }
public static void ThreadMain() { try { //Register commands CommandHandler.RegisterCommand("help", CommandHandler.DisplayHelp, "Displays this help"); CommandHandler.RegisterCommand("say", CommandHandler.Say, "Broadcasts a message to clients"); CommandHandler.RegisterCommand("dekessler", Dekessler.RunDekessler, "Clears out debris from the server"); CommandHandler.RegisterCommand("nukeksc", NukeKSC.RunNukeKSC, "Clears ALL vessels from KSC and the Runway"); CommandHandler.RegisterCommand("listclients", ListClients, "Lists connected clients"); CommandHandler.RegisterCommand("countclients", CountClients, "Counts connected clients"); CommandHandler.RegisterCommand("connectionstats", ConnectionStats, "Displays network traffic usage"); CommandHandler.RegisterCommand("nukeall", NukeKSC.RunNukeEverything, "Clears ALL vessels from the ENTIRE game universe"); //Main loop while (Server.serverRunning) { string input = ""; try { input = Console.ReadLine(); if (input == null) { DarkLog.Debug("Terminal may be not attached or broken, Exiting out of command handler"); return; } } catch { if (Server.serverRunning) { DarkLog.Debug("Ignored mono Console.ReadLine() bug"); } Thread.Sleep(500); } DarkLog.Normal("Command input: " + input); if (input.StartsWith("/")) { HandleServerInput(input.Substring(1)); } else { if (input != "") { commands["say"].func(input); } } } } catch (Exception e) { if (Server.serverRunning) { DarkLog.Fatal("Error in command handler thread, Exception: " + e); throw; } } }
private static void StartHTTPServer() { string OS = Environment.OSVersion.Platform.ToString(); if (Settings.settingsStore.httpPort > 0) { DarkLog.Normal("Starting HTTP server..."); httpListener = new HttpListener(); try { if (Settings.settingsStore.address != "0.0.0.0" && Settings.settingsStore.address != "::") { string listenAddress = Settings.settingsStore.address; if (listenAddress.Contains(":")) { //Sorry DarkLog.Error("Error: The server status port does not support specific IPv6 addresses. Sorry."); //listenAddress = "[" + listenAddress + "]"; return; } httpListener.Prefixes.Add("http://" + listenAddress + ":" + Settings.settingsStore.httpPort + '/'); } else { httpListener.Prefixes.Add("http://*:" + Settings.settingsStore.httpPort + '/'); } httpListener.Start(); httpListener.BeginGetContext(asyncHTTPCallback, httpListener); } catch (HttpListenerException e) { if (OS == "Win32NT" || OS == "Win32S" || OS == "Win32Windows" || OS == "WinCE") // if OS is Windows { if (e.ErrorCode == 5) // Access Denied { DarkLog.Debug("HTTP Server: access denied."); DarkLog.Debug("Prompting user to switch to administrator mode."); ProcessStartInfo startInfo = new ProcessStartInfo("DMPServer.exe") { Verb = "runas" }; Process.Start(startInfo); Environment.Exit(0); } } else { DarkLog.Fatal("Error while starting HTTP server.\n" + e); } throw; } } }
private static void ForceStopHTTPServer() { if (Settings.settingsStore.httpPort > 0) { DarkLog.Normal("Force stopping HTTP server..."); if (httpListener != null) { try { httpListener.Abort(); } catch (Exception e) { DarkLog.Fatal("Error trying to shutdown HTTP server: " + e); throw; } } } }
public static void ThreadMain() { try { //Register commands CommandHandler.RegisterCommand("help", CommandHandler.DisplayHelp, "Displays this help"); CommandHandler.RegisterCommand("say", CommandHandler.Say, "Broadcasts a message to clients"); CommandHandler.RegisterCommand("dekessler", Dekessler.RunDekessler, "Clears out debris from the server"); CommandHandler.RegisterCommand("nukeksc", NukeKSC.RunNukeKSC, "Clears ALL vessels from KSC and the Runway"); CommandHandler.RegisterCommand("listclients", ListClients, "Clears out debris from the server"); CommandHandler.RegisterCommand("countclients", CountClients, "Clears out debris from the server"); //Main loop while (Server.serverRunning) { string input = ""; try { input = Console.ReadLine(); } catch { if (Server.serverRunning) { DarkLog.Debug("Ignored mono Console.ReadLine() bug"); } Thread.Sleep(500); } DarkLog.Normal("Command input: " + input); if (input.StartsWith("/")) { string commandPart = input.Substring(1); string argumentPart = ""; if (commandPart.Contains(" ")) { if (commandPart.Length > commandPart.IndexOf(' ') + 1) { argumentPart = commandPart.Substring(commandPart.IndexOf(' ') + 1); } commandPart = commandPart.Substring(0, commandPart.IndexOf(' ')); } if (commandPart.Length > 0) { if (commands.ContainsKey(commandPart)) { try { commands[commandPart].func(argumentPart); } catch (Exception e) { DarkLog.Error("Error handling command " + commandPart + ", Exception " + e); } } else { DarkLog.Normal("Unknown command: " + commandPart); } } } else { if (input != "") { commands["say"].func(input); } } } } catch (Exception e) { if (Server.serverRunning) { DarkLog.Fatal("Error in command handler thread, Exception: " + e); throw; } } }
public static void Main() { #if !DEBUG try { #endif //Start the server clock serverClock = new Stopwatch(); serverClock.Start(); Settings.Reset(); //Set the last player activity time to server start lastPlayerActivity = serverClock.ElapsedMilliseconds; //Periodic garbage collection long lastGarbageCollect = 0; //Periodic screenshot check long lastScreenshotExpiredCheck = 0; //Periodic log check long lastLogExpiredCheck = 0; //Periodic day check long lastDayCheck = 0; //Set universe directory and modfile path universeDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Universe"); modFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DMPModControl.txt"); if (!Directory.Exists(configDirectory)) { Directory.CreateDirectory(configDirectory); } string oldSettingsFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DMPServerSettings.txt"); string newSettingsFile = Path.Combine(Server.configDirectory, "Settings.txt"); string oldGameplayFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DMPGameplaySettings.txt"); string newGameplayFile = Path.Combine(Server.configDirectory, "GameplaySettings.txt"); // Run the conversion BackwardsCompatibility.ConvertSettings(oldSettingsFile, newSettingsFile); if (File.Exists(oldGameplayFile)) { if (!File.Exists(newGameplayFile)) { File.Move(oldGameplayFile, newGameplayFile); } File.Delete(oldGameplayFile); } //Register the server commands CommandHandler.RegisterCommand("exit", Server.ShutDown, "Shuts down the server"); CommandHandler.RegisterCommand("quit", Server.ShutDown, "Shuts down the server"); CommandHandler.RegisterCommand("shutdown", Server.ShutDown, "Shuts down the server"); CommandHandler.RegisterCommand("restart", Server.Restart, "Restarts the server"); CommandHandler.RegisterCommand("kick", KickCommand.KickPlayer, "Kicks a player from the server"); CommandHandler.RegisterCommand("ban", BanSystem.fetch.BanPlayer, "Bans a player from the server"); CommandHandler.RegisterCommand("banip", BanSystem.fetch.BanIP, "Bans an IP Address from the server"); CommandHandler.RegisterCommand("bankey", BanSystem.fetch.BanPublicKey, "Bans a Guid from the server"); CommandHandler.RegisterCommand("pm", PMCommand.HandleCommand, "Sends a message to a player"); CommandHandler.RegisterCommand("admin", AdminCommand.HandleCommand, "Sets a player as admin/removes admin from the player"); CommandHandler.RegisterCommand("whitelist", WhitelistCommand.HandleCommand, "Change the server whitelist"); //Register the ctrl+c event Console.CancelKeyPress += new ConsoleCancelEventHandler(CatchExit); serverStarting = true; //Fix kerbals from 0.23.5 to 0.24 (Now indexed by string, thanks Squad! BackwardsCompatibility.FixKerbals(); //Remove player tokens BackwardsCompatibility.RemoveOldPlayerTokens(); //Add new stock parts BackwardsCompatibility.UpdateModcontrolPartList(); if (System.Net.Sockets.Socket.OSSupportsIPv6) { Settings.settingsStore.address = "::"; } DarkLog.Debug("Loading settings..."); Settings.Load(); if (Settings.settingsStore.gameDifficulty == GameDifficulty.CUSTOM) { GameplaySettings.Reset(); GameplaySettings.Load(); } //Test compression if (Settings.settingsStore.compressionEnabled) { long testTime = Compression.TestSysIOCompression(); Compression.compressionEnabled = true; DarkLog.Debug("System.IO compression works: " + Compression.sysIOCompressionWorks + ", test time: " + testTime + " ms."); } //Set day for log change day = DateTime.Now.Day; //Load plugins DMPPluginHandler.LoadPlugins(); Console.Title = "DMPServer " + Common.PROGRAM_VERSION + ", protocol " + Common.PROTOCOL_VERSION; while (serverStarting || serverRestarting) { if (serverRestarting) { DarkLog.Debug("Reloading settings..."); Settings.Reset(); Settings.Load(); if (Settings.settingsStore.gameDifficulty == GameDifficulty.CUSTOM) { DarkLog.Debug("Reloading gameplay settings..."); GameplaySettings.Reset(); GameplaySettings.Load(); } } serverRestarting = false; DarkLog.Normal("Starting DMPServer " + Common.PROGRAM_VERSION + ", protocol " + Common.PROTOCOL_VERSION); if (Settings.settingsStore.gameDifficulty == GameDifficulty.CUSTOM) { //Generate the config file by accessing the object. DarkLog.Debug("Loading gameplay settings..."); GameplaySettings.Load(); } //Load universe DarkLog.Normal("Loading universe... "); CheckUniverse(); DarkLog.Normal("Starting " + Settings.settingsStore.warpMode + " server on port " + Settings.settingsStore.port + "... "); serverRunning = true; Thread commandThread = new Thread(new ThreadStart(CommandHandler.ThreadMain)); Thread clientThread = new Thread(new ThreadStart(ClientHandler.ThreadMain)); commandThread.Start(); clientThread.Start(); while (serverStarting) { Thread.Sleep(500); } StartHTTPServer(); DarkLog.Normal("Ready!"); DMPPluginHandler.FireOnServerStart(); while (serverRunning) { //Run a garbage collection every 30 seconds. if ((serverClock.ElapsedMilliseconds - lastGarbageCollect) > 30000) { lastGarbageCollect = serverClock.ElapsedMilliseconds; GC.Collect(); } //Run the screenshot expire function every 10 minutes if ((serverClock.ElapsedMilliseconds - lastScreenshotExpiredCheck) > 600000) { lastScreenshotExpiredCheck = serverClock.ElapsedMilliseconds; ScreenshotExpire.ExpireScreenshots(); } //Run the log expire function every 10 minutes if ((serverClock.ElapsedMilliseconds - lastLogExpiredCheck) > 600000) { lastLogExpiredCheck = serverClock.ElapsedMilliseconds; LogExpire.ExpireLogs(); } // Check if the day has changed, every minute if ((serverClock.ElapsedMilliseconds - lastDayCheck) > 60000) { lastDayCheck = serverClock.ElapsedMilliseconds; if (day != DateTime.Now.Day) { DarkLog.LogFilename = Path.Combine(DarkLog.LogFolder, "dmpserver " + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".log"); DarkLog.WriteToLog("Continued from logfile " + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".log"); day = DateTime.Now.Day; } } Thread.Sleep(500); } DMPPluginHandler.FireOnServerStop(); commandThread.Abort(); clientThread.Join(); } DarkLog.Normal("Goodbye!"); Environment.Exit(0); #if !DEBUG } catch (Exception e) { DarkLog.Fatal("Error in main server thread, Exception: " + e); throw; } #endif }
public static void ThreadMain() { try { clients = new List <ClientObject>().AsReadOnly(); Messages.WarpControl.Reset(); Messages.Chat.Reset(); Messages.ScreenshotLibrary.Reset(); SetupTCPServer(); while (Server.serverRunning) { //Process current clients foreach (ClientObject client in clients) { Messages.Heartbeat.CheckHeartBeat(client); } ModpackSystem.fetch.SendFilesToClients(); //Check timers NukeKSC.CheckTimer(); Dekessler.CheckTimer(); Messages.WarpControl.CheckTimer(); //Run plugin update DMPPluginHandler.FireOnUpdate(); Thread.Sleep(10); } } catch (Exception e) { DarkLog.Error("Fatal error thrown, exception: " + e); Server.ShutDown("Crashed!"); } try { long disconnectTime = DateTime.UtcNow.Ticks; bool sendingHighPriotityMessages = true; while (sendingHighPriotityMessages) { if ((DateTime.UtcNow.Ticks - disconnectTime) > 50000000) { DarkLog.Debug("Shutting down with " + Server.playerCount + " players, " + clients.Count + " connected clients"); break; } sendingHighPriotityMessages = false; foreach (ClientObject client in clients) { if (client.authenticated && (client.sendMessageQueueHigh.Count > 0)) { sendingHighPriotityMessages = true; } } Thread.Sleep(10); } ShutdownTCPServer(); } catch (Exception e) { DarkLog.Fatal("Fatal error thrown during shutdown, exception: " + e); throw; } }
public static void ThreadMain() { try { //Register commands CommandHandler.RegisterCommand("help", CommandHandler.DisplayHelp, "Displays this help"); CommandHandler.RegisterCommand("say", CommandHandler.Say, "Broadcasts a message to clients"); CommandHandler.RegisterCommand("dekessler", Dekessler.RunDekessler, "Clears out debris from the server"); CommandHandler.RegisterCommand("nukeksc", NukeKSC.RunNukeKSC, "Clears ALL vessels from KSC and the Runway"); CommandHandler.RegisterCommand("listclients", ListClients, "Lists connected clients"); CommandHandler.RegisterCommand("countclients", CountClients, "Counts connected clients"); CommandHandler.RegisterCommand("connectionstats", ConnectionStats, "Displays network traffic usage"); CommandHandler.RegisterCommand("editgroup", Groups.fetch.EditGroupCommand, "Sets the group to edit"); CommandHandler.RegisterCommand("addplayer", Groups.fetch.AddPlayerToGroupCommand, "Adds player to group, first player becomes admin"); CommandHandler.RegisterCommand("removeplayer", Groups.fetch.RemovePlayerFromGroupCommand, "Removes player from group"); CommandHandler.RegisterCommand("addadmin", Groups.fetch.AddPlayerAdminCommand, "Adds admin to group"); CommandHandler.RegisterCommand("removeadmin", Groups.fetch.RemovePlayerAdminCommand, "Removes admin from group"); CommandHandler.RegisterCommand("showgroups", Groups.fetch.ShowGroupsCommand, "Shows group database"); CommandHandler.RegisterCommand("editvessel", Permissions.fetch.EditVesselCommand, "Edits vessel permissions, takes same ID from Universe/Vessels/"); CommandHandler.RegisterCommand("vesselowner", Permissions.fetch.SetVesselOwnerCommand, "Sets a vessel owner"); CommandHandler.RegisterCommand("vesselgroup", Permissions.fetch.SetVesselGroupCommand, "Sets a vessels group"); CommandHandler.RegisterCommand("vesselprotection", Permissions.fetch.SetVesselProtectionCommand, "Sets vessel protection level. Valid levels: public, group, private."); CommandHandler.RegisterCommand("showvessels", Permissions.fetch.ShowVesselsCommand, "Shows vessel protection database"); //Main loop while (Server.serverRunning) { string input = ""; try { input = Console.ReadLine(); if (input == null) { DarkLog.Debug("Terminal may be not attached or broken, Exiting out of command handler"); return; } } catch { if (Server.serverRunning) { DarkLog.Debug("Ignored mono Console.ReadLine() bug"); } Thread.Sleep(500); } DarkLog.Normal("Command input: " + input); if (input.StartsWith("/", StringComparison.Ordinal)) { HandleServerInput(input.Substring(1)); } else { if (input != "") { commands["say"].func(input); } } } } catch (Exception e) { if (Server.serverRunning) { DarkLog.Fatal("Error in command handler thread, Exception: " + e); throw; } } }
public static void Main() { try { //Start the server clock serverClock = new Stopwatch(); serverClock.Start(); //Set the last player activity time to server start lastPlayerActivity = serverClock.ElapsedMilliseconds; //Periodic garbage collection long lastGarbageCollect = 0; //Periodic screenshot check long lastScreenshotExpiredCheck = 0; //Set universe directory and modfile path universeDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Universe"); modFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DMPModControl.txt"); CommandHandler commandHandler = new CommandHandler(); //Register the server commands commandHandler.RegisterCommand("exit", Server.ShutDown, "Shuts down the server"); commandHandler.RegisterCommand("quit", Server.ShutDown, "Shuts down the server"); commandHandler.RegisterCommand("shutdown", Server.ShutDown, "Shuts down the server"); commandHandler.RegisterCommand("restart", Server.Restart, "Restarts the server"); commandHandler.RegisterCommand("kick", x => WorldManager.Instance.KickPlayer(x), "Kicks a player from the server"); commandHandler.RegisterCommand("ban", x => WorldManager.Instance.BanPlayer(x), "Bans a player from the server"); commandHandler.RegisterCommand("banip", x => WorldManager.Instance.BanIP(x), "Bans an IP Address from the server"); commandHandler.RegisterCommand("bankey", x => WorldManager.Instance.BanPublicKey(x), "Bans a Guid from the server"); commandHandler.RegisterCommand("pm", x => WorldManager.Instance.PMCommand(x), "Sends a message to a player"); commandHandler.RegisterCommand("admin", x => WorldManager.Instance.AdminCommand(x), "Sets a player as admin/removes admin from the player"); commandHandler.RegisterCommand("whitelist", x => WorldManager.Instance.WhitelistCommand(x), "Change the server whitelist"); //Register the ctrl+c event Console.CancelKeyPress += new ConsoleCancelEventHandler(CatchExit); serverStarting = true; //Fix kerbals from 0.23.5 to 0.24 (Now indexed by string, thanks Squad! BackwardsCompatibility.FixKerbals(); //Remove player tokens BackwardsCompatibility.RemoveOldPlayerTokens(); //Load plugins DMPPluginHandler.LoadPlugins(); Console.Title = "DMPServer " + Common.PROGRAM_VERSION + ", protocol " + Common.PROTOCOL_VERSION; while (serverStarting || serverRestarting) { serverRestarting = false; DarkLog.Normal("Starting DMPServer " + Common.PROGRAM_VERSION + ", protocol " + Common.PROTOCOL_VERSION); //Load settings DarkLog.Normal("Loading universe... "); CheckUniverse(); DarkLog.Normal("Done!"); DarkLog.Normal("Loading settings... "); Settings.Load(); DarkLog.Normal("Done!"); DarkLog.Normal("Starting " + Settings.settingsStore.warpMode + " server on port " + Settings.settingsStore.port + "... "); serverRunning = true; DarkLog.Normal("Done!"); StartHTTPServer(); DarkLog.Normal("Done!"); DMPPluginHandler.FireOnServerStart(); while (serverRunning) { WorldManager.Instance.Update(); commandHandler.Run(); //Run a garbage collection every 2 minutes. if ((serverClock.ElapsedMilliseconds - lastGarbageCollect) > 12000) { lastGarbageCollect = serverClock.ElapsedMilliseconds; GC.Collect(); } //Run the screenshot expire function every 10 minutes if ((serverClock.ElapsedMilliseconds - lastScreenshotExpiredCheck) > 600000) { lastScreenshotExpiredCheck = serverClock.ElapsedMilliseconds; ScreenshotExpire.ExpireCache(); } Thread.Sleep(10); } DMPPluginHandler.FireOnServerStop(); } DarkLog.Normal("Goodbye!"); Environment.Exit(0); } catch (Exception e) { DarkLog.Fatal("Error in main server thread, Exception: " + e); throw; } }
public static void Main() { try { //Start the server clock serverClock = new Stopwatch(); serverClock.Start(); //Register the server commands CommandHandler.RegisterCommand("exit", Server.ShutDown, "Shuts down the server"); CommandHandler.RegisterCommand("quit", Server.ShutDown, "Shuts down the server"); CommandHandler.RegisterCommand("shutdown", Server.ShutDown, "Shuts down the server"); CommandHandler.RegisterCommand("restart", Server.Restart, "Restarts the server"); CommandHandler.RegisterCommand("kick", ClientHandler.KickPlayer, "Kicks a player from the server"); CommandHandler.RegisterCommand("ban", ClientHandler.BanPlayer, "Bans a player from the server"); CommandHandler.RegisterCommand("banip", ClientHandler.BanIP, "Bans an IP Address from the server"); CommandHandler.RegisterCommand("banguid", ClientHandler.BanGuid, "Bans a Guid from the server"); CommandHandler.RegisterCommand("pm", ClientHandler.PMCommand, "Sends a message to a player"); //Register the ctrl+c event Console.CancelKeyPress += new ConsoleCancelEventHandler(CatchExit); serverStarting = true; while (serverStarting || serverRestarting) { serverRestarting = false; DarkLog.Normal("Starting DMPServer " + Common.PROGRAM_VERSION + ", protocol " + Common.PROTOCOL_VERSION); //Load settings DarkLog.Normal("Loading universe... "); CheckUniverse(); DarkLog.Normal("Done!"); DarkLog.Normal("Loading settings... "); Settings.Load(); DarkLog.Normal("Done!"); DarkLog.Normal("Starting " + Settings.settingsStore.warpMode + " server on port " + Settings.settingsStore.port + "... "); serverRunning = true; Thread commandThread = new Thread(new ThreadStart(CommandHandler.ThreadMain)); Thread clientThread = new Thread(new ThreadStart(ClientHandler.ThreadMain)); commandThread.Start(); clientThread.Start(); while (serverStarting) { Thread.Sleep(500); } DarkLog.Normal("Done!"); StartHTTPServer(); DarkLog.Normal("Done!"); while (serverRunning) { Thread.Sleep(500); } commandThread.Abort(); clientThread.Join(); } DarkLog.Normal("Goodbye!"); } catch (Exception e) { DarkLog.Fatal("Error in main server thread, Exception: " + e); throw; } }