/* * Created by SharpDevelop. * User: Bitl * Date: 6/15/2019 * Time: 5:10 PM * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using Mono.Nat; using System.Diagnostics; using System.IO; namespace NovetusCMD { class Program { public static void InitUPnP() { if (GlobalVars.UPnP == true) { try { UPnP.InitUPnP(DeviceFound,DeviceLost); ConsolePrint("UPnP: Service initialized", 3); } catch (Exception ex) { ConsolePrint("UPnP: Unable to initialize UPnP. Reason - " + ex.Message, 2); } } } public static void StartUPnP(INatDevice device, Protocol protocol, int port) { if (GlobalVars.UPnP == true) { try { UPnP.StartUPnP(device,protocol,port); ConsolePrint("UPnP: Port " + port + " opened on '" + device.GetExternalIP() + "' (" + protocol.ToString() + ")", 3); } catch (Exception ex) { ConsolePrint("UPnP: Unable to open port mapping. Reason - " + ex.Message, 2); } } } public static void StopUPnP(INatDevice device, Protocol protocol, int port) { if (GlobalVars.UPnP == true) { try { UPnP.StopUPnP(device,protocol,port); ConsolePrint("UPnP: Port " + port + " closed on '" + device.GetExternalIP() + "' (" + protocol.ToString() + ")", 3); } catch (Exception ex) { ConsolePrint("UPnP: Unable to close port mapping. Reason - " + ex.Message, 2); } } } private static void DeviceFound(object sender, DeviceEventArgs args) { try { INatDevice device = args.Device; ConsolePrint("UPnP: Device '" + device.GetExternalIP() + "' registered.", 3); StartUPnP(device, Protocol.Udp, GlobalVars.RobloxPort); StartUPnP(device, Protocol.Tcp, GlobalVars.RobloxPort); StartUPnP(device, Protocol.Udp, GlobalVars.WebServer_Port); StartUPnP(device, Protocol.Tcp, GlobalVars.WebServer_Port); } catch (Exception ex) { ConsolePrint("UPnP: Unable to register device. Reason - " + ex.Message, 2); } } private static void DeviceLost(object sender, DeviceEventArgs args) { try { INatDevice device = args.Device; ConsolePrint("UPnP: Device '" + device.GetExternalIP() + "' disconnected.", 3); StopUPnP(device, Protocol.Udp, GlobalVars.RobloxPort); StopUPnP(device, Protocol.Tcp, GlobalVars.RobloxPort); StopUPnP(device, Protocol.Udp, GlobalVars.WebServer_Port); StopUPnP(device, Protocol.Tcp, GlobalVars.WebServer_Port); } catch (Exception ex) { ConsolePrint("UPnP: Unable to disconnect device. Reason - " + ex.Message, 2); } } static void StartWebServer() { if (SecurityFuncs.IsElevated) { try { GlobalVars.WebServer = new SimpleHTTPServer(GlobalVars.DataPath, GlobalVars.WebServer_Port); ConsolePrint("WebServer: Server is running on port: " + GlobalVars.WebServer.Port.ToString(), 3); } catch (Exception ex) { ConsolePrint("WebServer: Failed to launch WebServer. Some features may not function. (" + ex.Message + ")", 2); } } else { ConsolePrint("WebServer: Failed to launch WebServer. Some features may not function. (Did not run as Administrator)", 2); } } static void StopWebServer() { if (SecurityFuncs.IsElevated) { try { ConsolePrint("WebServer: Server has stopped on port: " + GlobalVars.WebServer.Port.ToString(), 2); GlobalVars.WebServer.Stop(); } catch (Exception ex) { ConsolePrint("WebServer: Failed to stop WebServer. Some features may not function. (" + ex.Message + ")", 2); } } else { ConsolePrint("WebServer: Failed to stop WebServer. Some features may not function. (Did not run as Administrator)", 2); } } static void WriteConfigValues() { LauncherFuncs.WriteConfigValues(GlobalVars.ConfigDir + "\\config.ini"); ConsolePrint("Config Saved.", 3); } static void ProgramClose(object sender, EventArgs e) { WriteConfigValues(); if (GlobalVars.IsWebServerOn == true) { StopWebServer(); } } static void ReadConfigValues() { LauncherFuncs.ReadConfigValues(GlobalVars.ConfigDir + "\\config.ini"); if (GlobalVars.UserID == 0) { LauncherFuncs.GeneratePlayerID(); WriteConfigValues(); } if (GlobalVars.PlayerLimit == 0) { //We need at least a limit of 12 players. GlobalVars.PlayerLimit = 12; } ConsolePrint("Config loaded.", 3); ReadClientValues(GlobalVars.SelectedClient); } static void ReadClientValues(string ClientName) { string clientpath = GlobalVars.ClientDir + @"\\" + ClientName + @"\\clientinfo.nov"; if (!File.Exists(clientpath)) { ConsolePrint("ERROR 1 - No clientinfo.nov detected with the client you chose. The client either cannot be loaded, or it is not available.", 2); GlobalVars.SelectedClient = GlobalVars.DefaultClient; } LauncherFuncs.ReadClientValues(clientpath); ConsolePrint("Client '" + GlobalVars.SelectedClient + "' successfully loaded.", 3); } static string ProcessInput(string s) { return s; } public static void Main(string[] args) { bool StartInNo3D = false; if (args.Length == 0) { ConsolePrint("WARNING 1 - NovetusCMD will launch the server in 3D mode. To launch the server in No3D mode, add -no3d as a command line argument.", 5); } else { foreach (string s in args) { GlobalVars.SharedArgs = ProcessInput(s); } if (GlobalVars.SharedArgs.Equals("-no3d")) { StartInNo3D = true; } } ConsolePrint("NOTE: NovetusCMD will use values defined from the launcher. If you want to define values for NovetusCMD, change the settings in the launcher through the 'Host' tab.", 5); string[] lines = File.ReadAllLines(GlobalVars.ConfigDir + "\\info.txt"); //File is in System.IO string version = lines[0]; GlobalVars.DefaultClient = lines[1]; GlobalVars.DefaultMap = lines[2]; GlobalVars.SelectedClient = GlobalVars.DefaultClient; GlobalVars.Map = GlobalVars.DefaultMap; Console.Title = "Novetus " + version; ConsolePrint("Novetus version " + version + " loaded. Initializing config.", 4); if (!File.Exists(GlobalVars.ConfigDir + "\\config.ini")) { ConsolePrint("WARNING 2 - config.ini not found. Creating one with default values.", 5); WriteConfigValues(); } GlobalVars.Version = version; ReadConfigValues(); InitUPnP(); StartWebServer(); AppDomain.CurrentDomain.ProcessExit += new EventHandler(ProgramClose); StartServer(StartInNo3D); Console.ReadKey(); } static void StartServer(bool no3d) { string luafile = ""; if (!GlobalVars.FixScriptMapMode) { luafile = "rbxasset://scripts\\\\" + GlobalVars.ScriptName + ".lua"; } else { luafile = GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\content\\scripts\\" + GlobalVars.ScriptGenName + ".lua"; } string mapfile = GlobalVars.MapsDir + @"\\" + TreeNodeHelper.GetFolderNameFromPrefix(GlobalVars.Map) + GlobalVars.Map; string rbxexe = ""; if (GlobalVars.LegacyMode == true) { rbxexe = GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\RobloxApp.exe"; } else { rbxexe = GlobalVars.ClientDir + @"\\" + GlobalVars.SelectedClient + @"\\RobloxApp_server.exe"; } string quote = "\""; string args = ""; if (GlobalVars.CustomArgs.Equals("%args%")) { if (!GlobalVars.FixScriptMapMode) { args = quote + mapfile + "\" -script \"dofile('" + luafile + "'); " + ScriptGenerator.GetScriptFuncForType(ScriptGenerator.ScriptType.Server, GlobalVars.SelectedClient) + quote + (no3d ? " -no3d" : ""); } else { ScriptGenerator.GenerateScriptForClient(ScriptGenerator.ScriptType.Server, GlobalVars.SelectedClient); args = "-script " + quote + luafile + quote + (no3d ? " -no3d" : "") + " " + quote + mapfile + quote; } } else { if (!no3d) { args = ClientScript.CompileScript(GlobalVars.CustomArgs, "", "", mapfile, luafile, rbxexe); } else { args = ClientScript.CompileScript(GlobalVars.CustomArgs, "", "", mapfile, luafile, rbxexe); } } try { //when we add upnp, change this ConsolePrint("Server Loaded.", 4); Process client = new Process(); client.StartInfo.FileName = rbxexe; client.StartInfo.Arguments = args; client.EnableRaisingEvents = true; ReadClientValues(GlobalVars.SelectedClient); client.Exited += new EventHandler(ServerExited); client.Start(); SecurityFuncs.RenameWindow(client, ScriptGenerator.ScriptType.Server); } catch (Exception ex) { ConsolePrint("ERROR 2 - Failed to launch Novetus. (" + ex.Message + ")", 2); } } static void ServerExited(object sender, EventArgs e) { Environment.Exit(0); } static void ConsolePrint(string text, int type) { ConsoleText("[" + DateTime.Now.ToShortTimeString() + "] - ", ConsoleColor.White); if (type == 1) { ConsoleText(text, ConsoleColor.White); } else if (type == 2) { ConsoleText(text, ConsoleColor.Red); } else if (type == 3) { ConsoleText(text, ConsoleColor.Green); } else if (type == 4) { ConsoleText(text, ConsoleColor.Cyan); } else if (type == 5) { ConsoleText(text, ConsoleColor.Yellow); } ConsoleText(Environment.NewLine, ConsoleColor.White); } static void ConsoleText(string text, ConsoleColor color) { Console.ForegroundColor = color; Console.Write(text); } } }