private static void Start(string[] args)
        {
            //Setup error handling for unmanaged exceptions
            AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;
            Application.ThreadException += Application_ThreadException;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            LogManager.APILog.WriteLine("Starting SEServerExtender with " + args.Length.ToString() + " arguments ...");

            CommandLineArgs extenderArgs = new CommandLineArgs();

            //Setup the default args
            extenderArgs.autoStart    = false;
            extenderArgs.worldName    = "";
            extenderArgs.instanceName = "";
            extenderArgs.noGUI        = false;
            extenderArgs.noConsole    = false;
            extenderArgs.debug        = false;
            extenderArgs.gamePath     = "";
            extenderArgs.noWCF        = false;
            extenderArgs.noSLWCF      = true;
            extenderArgs.autosave     = 0;
            extenderArgs.wcfPort      = 0;
            extenderArgs.path         = "";

            //Process the args
            foreach (string arg in args)
            {
                if (arg.Split('=').Length > 1)
                {
                    string argName  = arg.Split('=')[0];
                    string argValue = arg.Split('=')[1];

                    if (argName.ToLower().Equals("instance"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(0, argValue.Length - 1);
                        }
                        extenderArgs.instanceName = argValue;
                    }
                    else if (argName.ToLower().Equals("gamepath"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(0, argValue.Length - 1);
                        }
                        extenderArgs.gamePath = argValue;
                    }
                    else if (argName.ToLower().Equals("autosave"))
                    {
                        try
                        {
                            extenderArgs.autosave = int.Parse(argValue);
                        }
                        catch (Exception)
                        {
                            //Do nothing
                        }
                    }
                    else if (argName.ToLower().Equals("wcfport"))
                    {
                        try
                        {
                            extenderArgs.wcfPort = ushort.Parse(argValue);
                        }
                        catch (Exception)
                        {
                            //Do nothing
                        }
                    }
                    else if (argName.ToLower().Equals("slwcfport"))
                    {
                        try
                        {
                            extenderArgs.slWcfPort = ushort.Parse(argValue);
                        }
                        catch (Exception)
                        {
                            //Do nothing
                        }
                    }
                    else if (argName.ToLower().Equals("path"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(0, argValue.Length - 1);
                        }
                        extenderArgs.path = argValue;
                    }
                    else if (argName.ToLower().Equals("noslwcf"))
                    {
                        if (argValue.ToLower() == "false")
                        {
                            extenderArgs.noSLWCF = false;
                        }
                    }
                }
                else
                {
                    if (arg.ToLower().Equals("autostart"))
                    {
                        extenderArgs.autoStart = true;
                    }
                    if (arg.ToLower().Equals("nogui"))
                    {
                        extenderArgs.noGUI = true;

                        //Implies autostart
                        extenderArgs.autoStart = true;
                    }
                    if (arg.ToLower().Equals("noconsole"))
                    {
                        extenderArgs.noConsole = true;

                        //Implies nogui and autostart
                        extenderArgs.noGUI     = true;
                        extenderArgs.autoStart = true;
                    }
                    if (arg.ToLower().Equals("debug"))
                    {
                        extenderArgs.debug = true;
                    }
                    if (arg.ToLower().Equals("nowcf"))
                    {
                        extenderArgs.noWCF = true;
                    }
                }
            }

            if (extenderArgs.noWCF)
            {
                extenderArgs.wcfPort = 0;
            }

            if (!string.IsNullOrEmpty(extenderArgs.path))
            {
                extenderArgs.instanceName = "";
            }

            if (!Environment.UserInteractive)
            {
                extenderArgs.noConsole = true;
                extenderArgs.noGUI     = true;
                extenderArgs.autoStart = true;
            }

            if (extenderArgs.debug)
            {
                SandboxGameAssemblyWrapper.IsDebugging = true;
            }

            try
            {
                bool unitTestResult = BasicUnitTestManager.Instance.Run();
                if (!unitTestResult)
                {
                    SandboxGameAssemblyWrapper.IsInSafeMode = true;
                }

                m_server = Server.Instance;
                m_server.CommandLineArgs = extenderArgs;
                m_server.IsWCFEnabled    = !extenderArgs.noWCF;
                m_server.IsSLWCFEnabled  = !extenderArgs.noSLWCF;
                m_server.WCFPort         = extenderArgs.wcfPort;
                m_server.SLWCFPort       = extenderArgs.slWcfPort;
                m_server.Init();

                ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand();
                guiCommand.command  = "gui";
                guiCommand.callback = ChatCommand_GUI;
                ChatManager.Instance.RegisterChatCommand(guiCommand);

                if (extenderArgs.autoStart)
                {
                    m_server.StartServer();
                }

                if (!extenderArgs.noGUI)
                {
                    Thread uiThread = new Thread(new ThreadStart(StartGUI));
                    uiThread.SetApartmentState(ApartmentState.STA);
                    uiThread.Start();
                }
            }
            catch (AutoException eEx)
            {
                if (!extenderArgs.noConsole)
                {
                    Console.WriteLine("AutoException - " + eEx.AdditionnalInfo + "\n\r" + eEx.GetDebugString());
                }
                if (!extenderArgs.noGUI)
                {
                    MessageBox.Show(eEx.AdditionnalInfo + "\n\r" + eEx.GetDebugString(), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.noConsole && extenderArgs.noGUI)
                {
                    throw eEx.GetBaseException();
                }
            }
            catch (TargetInvocationException ex)
            {
                if (!extenderArgs.noConsole)
                {
                    Console.WriteLine("TargetInvocationException - " + ex.ToString() + "\n\r" + ex.InnerException.ToString());
                }
                if (!extenderArgs.noGUI)
                {
                    MessageBox.Show(ex.ToString() + "\n\r" + ex.InnerException.ToString(), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.noConsole && extenderArgs.noGUI)
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                if (!extenderArgs.noConsole)
                {
                    Console.WriteLine("Exception - " + ex.ToString());
                }
                if (!extenderArgs.noGUI)
                {
                    MessageBox.Show(ex.ToString(), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.noConsole && extenderArgs.noGUI)
                {
                    throw ex;
                }
            }
        }
Example #2
0
        private static void Start(string[] args)
        {
            // SE_VERSION is a private constant. Need to use reflection to get it.
            FieldInfo field = typeof(SpaceEngineersGame).GetField("SE_VERSION", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);

            SeVersion = new Version(new MyVersion((int)field.GetValue(null)).FormattedText.ToString().Replace("_", "."));

            //bool stableBuild = (bool)typeof(MyFinalBuildConstants).GetField("IS_STABLE").GetValue(null);

            ApplicationLog.BaseLog.Info($"SE version: {SeVersion}");

            string versionMessage = $"Extender version: {Assembly.GetExecutingAssembly().GetName().Version}";

#if DEBUG
            //mark debug builds as such
            versionMessage += " DEBUG";
#endif
            ApplicationLog.BaseLog.Info(versionMessage);

            /*
             * if (stableBuild)
             * {
             *  BaseLog.Info("Detected \"Stable\" branch!");
             *  //BaseLog.Error("WARNING: THIS BUILD OF SESE IS NOT COMPATIBLE WITH STABLE BRANCH");
             *          //if (SystemInformation.UserInteractive)
             *          //{
             *          //    var result = MessageBox.Show("This build of SESE is not compatible with stable branch!",
             *          //                                 "Fatal Error",
             *          //                                 MessageBoxButtons.OK,
             *          //                                 MessageBoxIcon.Error);
             *          //    if (result == DialogResult.OK)
             *          //    {
             *          //        Stop();
             *          //        return;
             *          //    }
             *          //}
             *          //else
             *          //{
             *          //    Stop();
             *          //    return;
             *          //}
             *          IsStable = true;
             *          PluginManager.IsStable = true;
             *          Server.IsStable = true;
             * }
             * else
             *  BaseLog.Info("Detected \"Development\" branch!");
             */
            InitSandbox();

            //Setup error handling for unmanaged exceptions
            AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;
            Application.ThreadException += Application_ThreadException;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            //AppDomain.CurrentDomain.ClearEventInvocations("_unhandledException");

            BaseLog.Info("Starting SEServerExtender with {0} arguments: {1}", args.Length, string.Join("\r\n\t", args));

            CommandLineArgs extenderArgs = CommandLineArgs = new CommandLineArgs
            {
                ConsoleTitle = string.Empty,
                AutoStart    = false,
                WorldName    = string.Empty,
                InstanceName = string.Empty,
                NoGui        = false,
                NoConsole    = false,
                Debug        = false,
                GamePath     = new DirectoryInfo(PathManager.BasePath).Parent.FullName,
                //TODO: turn noWFC back to off by default whenever WCF gets fixed
                NoWcf          = true,
                Autosave       = 0,
                InstancePath   = string.Empty,
                CloseOnCrash   = false,
                RestartOnCrash = false,
                NoProfiler     = false,
                Args           = string.Join(" ", args.Select(x => string.Format("\"{0}\"", x)))
            };

            if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"] != null)
            {
                if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"], out _maxChatHistoryMessageAge))
                {
                    ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryAge", "3600");
                }
            }
            if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"] != null)
            {
                if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"], out _maxChatHistoryMessageCount))
                {
                    ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryCount", "100");
                }
            }

            bool logPathSet = false;
            //Process the args
            foreach (string arg in args)
            {
                string[] splitAtEquals = arg.Split('=');
                if (splitAtEquals.Length > 1)
                {
                    string argName  = splitAtEquals[0];
                    string argValue = splitAtEquals[1];

                    string lowerCaseArgument = argName.ToLower( );
                    if (lowerCaseArgument.Equals("instance"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        //sanitize input because stupid people put full paths for this argument
                        extenderArgs.InstanceName = argValue.Replace(@"\", "-").Replace(@":", "-");

                        //Only let this override log path if the log path wasn't already explicitly set
                        if (!logPathSet)
                        {
                            FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget;
                            if (baseLogTarget != null)
                            {
                                baseLogTarget.FileName = baseLogTarget.FileName.Render(new LogEventInfo {
                                    TimeStamp = DateTime.Now
                                }).Replace("NoInstance", argValue.Replace(@"\", "-").Replace(@":", "-"));
                            }
                            FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget;
                            if (chatLogTarget != null)
                            {
                                chatLogTarget.FileName = chatLogTarget.FileName.Render(new LogEventInfo {
                                    TimeStamp = DateTime.Now
                                }).Replace("NoInstance", argValue.Replace(@"\", "-").Replace(@":", "-"));
                            }
                            FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget;
                            if (pluginLogTarget != null)
                            {
                                pluginLogTarget.FileName = pluginLogTarget.FileName.Render(new LogEventInfo {
                                    TimeStamp = DateTime.Now
                                }).Replace("NoInstance", argValue.Replace(@"\", "-").Replace(@":", "-"));
                            }
                        }
                    }
                    else if (lowerCaseArgument.Equals("gamepath"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.GamePath = argValue;
                    }
                    else if (lowerCaseArgument.Equals("autosave"))
                    {
                        if (!int.TryParse(argValue, out extenderArgs.Autosave))
                        {
                            BaseLog.Warn("Autosave parameter was not a valid integer.");
                        }
                    }
                    else if (lowerCaseArgument.Equals("path"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.InstancePath = argValue;
                    }
                    else if (lowerCaseArgument.Equals("instancepath"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.InstancePath = argValue;
                    }
                    else if (lowerCaseArgument.Equals("title"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.ConsoleTitle = argValue;
                    }
                    else if (lowerCaseArgument == "logpath")
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }

                        //This argument always prevails.
                        FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget;
                        if (baseLogTarget != null)
                        {
                            Layout l = new SimpleLayout(Path.Combine(argValue, "SEServerExtenderLog-${shortdate}.log"));
                            baseLogTarget.FileName = l.Render(new LogEventInfo {
                                TimeStamp = DateTime.Now
                            });
                            ApplicationLog.BaseLog = BaseLog;
                        }
                        FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget;
                        if (chatLogTarget != null)
                        {
                            Layout l = new SimpleLayout(Path.Combine(argValue, "ChatLog-${shortdate}.log"));
                            chatLogTarget.FileName = l.Render(new LogEventInfo {
                                TimeStamp = DateTime.Now
                            });
                            ApplicationLog.ChatLog = ChatLog;
                        }
                        FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget;
                        if (pluginLogTarget != null)
                        {
                            Layout l = new SimpleLayout(Path.Combine(argValue, "PluginLog-${shortdate}.log"));
                            pluginLogTarget.FileName = l.Render(new LogEventInfo {
                                TimeStamp = DateTime.Now
                            });
                            logPathSet = true;
                            ApplicationLog.PluginLog = PluginLog;
                        }
                    }
                }
                else
                {
                    string lowerCaseArgument = arg.ToLower( );
                    if (lowerCaseArgument.Equals("autostart"))
                    {
                        extenderArgs.AutoStart = true;
                    }
                    else if (lowerCaseArgument.Equals("nogui"))
                    {
                        extenderArgs.NoGui = true;

                        //Implies autostart
                        //extenderArgs.AutoStart = true;
                    }
                    else if (lowerCaseArgument.Equals("noconsole"))
                    {
                        extenderArgs.NoConsole = true;

                        //Implies nogui and autostart
                        extenderArgs.NoGui     = true;
                        extenderArgs.AutoStart = true;
                    }
                    else if (lowerCaseArgument.Equals("debug"))
                    {
                        extenderArgs.Debug = true;
                    }
                    else if (lowerCaseArgument.Equals("nowcf"))
                    {
                        extenderArgs.NoWcf = true;
                    }
                    else if (lowerCaseArgument.Equals("wcfon"))
                    {
                        extenderArgs.NoWcf = false;
                    }
                    else if (lowerCaseArgument.Equals("closeoncrash"))
                    {
                        extenderArgs.CloseOnCrash = true;
                    }
                    else if (lowerCaseArgument.Equals("autosaveasync"))
                    {
                        extenderArgs.AutoSaveSync = false;
                    }
                    else if (lowerCaseArgument.Equals("autosavesync"))
                    {
                        extenderArgs.AutoSaveSync = true;
                    }
                    else if (lowerCaseArgument.Equals("restartoncrash"))
                    {
                        extenderArgs.RestartOnCrash = true;
                    }
                    else if (lowerCaseArgument.Equals("noprofiler") && !IsStable)
                    {
                        extenderArgs.NoProfiler = true;
                        Server.DisableProfiler  = true;
                    }
                    //these things are legacy and don't work anyway

                    /*
                     *                  else if ( lowerCaseArgument.Equals( "wrr" ) )
                     *                  {
                     *                          extenderArgs.WorldRequestReplace = true;
                     *                  }
                     *                  else if ( lowerCaseArgument.Equals( "wrm" ) )
                     *                  {
                     *                          extenderArgs.WorldDataModify = true;
                     *                  }
                     * else if (lowerCaseArgument.Equals("wvm"))
                     * {
                     *  extenderArgs.WorldVoxelModify = true;
                     * }
                     */
                }
            }

            if (!Environment.UserInteractive)
            {
                extenderArgs.NoConsole = true;
                extenderArgs.NoGui     = true;
                extenderArgs.AutoStart = true;
            }

            if (extenderArgs.Debug)
            {
                ExtenderOptions.IsDebugging = true;
            }

            try
            {
                bool unitTestResult = BasicUnitTestManager.Instance.Run( );
                if (!unitTestResult)
                {
                    ExtenderOptions.IsInSafeMode = true;
                }

                Server = Server.Instance;
                Server.CommandLineArgs = extenderArgs;
                Server.IsWCFEnabled    = !extenderArgs.NoWcf;
                Server.Init( );

                //if(!DedicatedServerAssemblyWrapper.IsStable)
                //    InitSandbox(Path.Combine( GameInstallationInfo.GamePath, @"..\Content"), Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "SpaceEngineers"));

                ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand("gui", ChatCommand_GUI, false);
                ChatManager.Instance.RegisterChatCommand(guiCommand);

                if (!CommandLineArgs.NoConsole)
                {
                    if (string.IsNullOrEmpty(extenderArgs.ConsoleTitle) || string.IsNullOrWhiteSpace(extenderArgs.ConsoleTitle))
                    {
                        Console.Title = "SESE";
                    }
                    else
                    {
                        Console.Title = extenderArgs.ConsoleTitle;
                    }
                }

                if (extenderArgs.AutoStart)
                {
                    Server.StartServer( );
                }

                if (!extenderArgs.NoWcf)
                {
                    string uriString = string.Format("{0}{1}", ConfigurationManager.AppSettings["WCFServerServiceBaseAddress"], CommandLineArgs.InstanceName);
                    BaseLog.Info("Opening up WCF service listener at {0}", uriString);
                    ServerServiceHost = new ServiceHost(typeof(ServerService.ServerService), new Uri(uriString, UriKind.Absolute));
                    ServerServiceHost.Open( );
                    ChatManager.Instance.ChatMessage += ChatManager_ChatMessage;
                }

                if (!extenderArgs.NoGui)
                {
                    Thread uiThread = new Thread(StartGui);
                    uiThread.SetApartmentState(ApartmentState.STA);
                    uiThread.Start( );
                }
                else if (Environment.UserInteractive)
                {
                    Console.ReadLine( );
                }
            }
            catch (AutoException eEx)
            {
                if (!extenderArgs.NoConsole)
                {
                    BaseLog.Info("AutoException - {0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( ));
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(string.Format("{0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw eEx.GetBaseException( );
                }
            }
            catch (TargetInvocationException ex)
            {
                if (!extenderArgs.NoConsole)
                {
                    BaseLog.Info("TargetInvocationException - {0}\n\r{1}", ex, ex.InnerException);
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(string.Format("{0}\n\r{1}", ex, ex.InnerException), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw;
                }
            }
            catch (Exception ex)
            {
                if (!extenderArgs.NoConsole)
                {
                    BaseLog.Info(ex, "Exception - {0}", ex);
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(ex.ToString( ), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw;
                }
            }
        }
Example #3
0
        private static void Start(string[] args)
        {
            //Setup error handling for unmanaged exceptions
            AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;
            Application.ThreadException += Application_ThreadException;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            //AppDomain.CurrentDomain.ClearEventInvocations("_unhandledException");

            BaseLog.Info("Starting SEServerExtender with {0} arguments: {1}", args.Length, string.Join("\r\n\t", args));

            CommandLineArgs extenderArgs = CommandLineArgs = new CommandLineArgs
            {
                AutoStart      = false,
                WorldName      = string.Empty,
                InstanceName   = string.Empty,
                NoGui          = false,
                NoConsole      = false,
                Debug          = false,
                GamePath       = new DirectoryInfo(PathManager.BasePath).Parent.FullName,
                NoWcf          = false,
                Autosave       = 0,
                InstancePath   = string.Empty,
                CloseOnCrash   = false,
                RestartOnCrash = false,
                Args           = string.Join(" ", args.Select(x => string.Format("\"{0}\"", x)))
            };

            if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"] != null)
            {
                if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"], out _maxChatHistoryMessageAge))
                {
                    ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryAge", "3600");
                }
            }
            if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"] != null)
            {
                if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"], out _maxChatHistoryMessageCount))
                {
                    ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryCount", "100");
                }
            }

            bool logPathSet = false;

            //Process the args
            foreach (string arg in args)
            {
                string[] splitAtEquals = arg.Split('=');
                if (splitAtEquals.Length > 1)
                {
                    string argName  = splitAtEquals[0];
                    string argValue = splitAtEquals[1];

                    string lowerCaseArgument = argName.ToLower( );
                    if (lowerCaseArgument.Equals("instance"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.InstanceName = argValue;

                        //Only let this override log path if the log path wasn't already explicitly set
                        if (!logPathSet)
                        {
                            FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget;
                            if (baseLogTarget != null)
                            {
                                baseLogTarget.FileName = baseLogTarget.FileName.Render(new LogEventInfo {
                                    TimeStamp = DateTime.Now
                                }).Replace("NoInstance", argValue);
                            }
                            FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget;
                            if (chatLogTarget != null)
                            {
                                chatLogTarget.FileName = chatLogTarget.FileName.Render(new LogEventInfo {
                                    TimeStamp = DateTime.Now
                                }).Replace("NoInstance", argValue);
                            }
                            FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget;
                            if (pluginLogTarget != null)
                            {
                                pluginLogTarget.FileName = pluginLogTarget.FileName.Render(new LogEventInfo {
                                    TimeStamp = DateTime.Now
                                }).Replace("NoInstance", argValue);
                            }
                        }
                    }
                    else if (lowerCaseArgument.Equals("gamepath"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.GamePath = argValue;
                    }
                    else if (lowerCaseArgument.Equals("autosave"))
                    {
                        if (!int.TryParse(argValue, out extenderArgs.Autosave))
                        {
                            BaseLog.Warn("Autosave parameter was not a valid integer.");
                        }
                    }
                    else if (lowerCaseArgument.Equals("path"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.InstancePath = argValue;
                    }
                    else if (lowerCaseArgument.Equals("instancepath"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }
                        extenderArgs.InstancePath = argValue;
                    }
                    else if (lowerCaseArgument == "logpath")
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(1, argValue.Length - 2);
                        }

                        //This argument always prevails.
                        FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget;
                        if (baseLogTarget != null)
                        {
                            Layout l = new SimpleLayout(Path.Combine(argValue, "SEServerExtenderLog-${shortdate}.log"));
                            baseLogTarget.FileName = l.Render(new LogEventInfo {
                                TimeStamp = DateTime.Now
                            });
                            ApplicationLog.BaseLog = BaseLog;
                        }
                        FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget;
                        if (chatLogTarget != null)
                        {
                            Layout l = new SimpleLayout(Path.Combine(argValue, "ChatLog-${shortdate}.log"));
                            chatLogTarget.FileName = l.Render(new LogEventInfo {
                                TimeStamp = DateTime.Now
                            });
                            ApplicationLog.ChatLog = ChatLog;
                        }
                        FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget;
                        if (pluginLogTarget != null)
                        {
                            Layout l = new SimpleLayout(Path.Combine(argValue, "PluginLog-${shortdate}.log"));
                            pluginLogTarget.FileName = l.Render(new LogEventInfo {
                                TimeStamp = DateTime.Now
                            });
                            logPathSet = true;
                            ApplicationLog.PluginLog = PluginLog;
                        }
                    }
                }
                else
                {
                    string lowerCaseArgument = arg.ToLower( );
                    if (lowerCaseArgument.Equals("autostart"))
                    {
                        extenderArgs.AutoStart = true;
                    }
                    else if (lowerCaseArgument.Equals("nogui"))
                    {
                        extenderArgs.NoGui = true;

                        //Implies autostart
                        //extenderArgs.AutoStart = true;
                    }
                    else if (lowerCaseArgument.Equals("noconsole"))
                    {
                        extenderArgs.NoConsole = true;

                        //Implies nogui and autostart
                        extenderArgs.NoGui     = true;
                        extenderArgs.AutoStart = true;
                    }
                    else if (lowerCaseArgument.Equals("debug"))
                    {
                        extenderArgs.Debug = true;
                    }
                    else if (lowerCaseArgument.Equals("nowcf"))
                    {
                        extenderArgs.NoWcf = true;
                    }
                    else if (lowerCaseArgument.Equals("closeoncrash"))
                    {
                        extenderArgs.CloseOnCrash = true;
                    }
                    else if (lowerCaseArgument.Equals("autosaveasync"))
                    {
                        extenderArgs.AutoSaveSync = false;
                    }
                    else if (lowerCaseArgument.Equals("autosavesync"))
                    {
                        extenderArgs.AutoSaveSync = true;
                    }
                    else if (lowerCaseArgument.Equals("restartoncrash"))
                    {
                        extenderArgs.RestartOnCrash = true;
                    }
                    else if (lowerCaseArgument.Equals("wrr"))
                    {
                        extenderArgs.WorldRequestReplace = true;
                    }
                    else if (lowerCaseArgument.Equals("wrm"))
                    {
                        extenderArgs.WorldDataModify = true;
                    }
                    else if (lowerCaseArgument.Equals("wvm"))
                    {
                        extenderArgs.WorldVoxelModify = true;
                    }
                }
            }

            if (!Environment.UserInteractive)
            {
                extenderArgs.NoConsole = true;
                extenderArgs.NoGui     = true;
                extenderArgs.AutoStart = true;
            }

            if (extenderArgs.Debug)
            {
                ExtenderOptions.IsDebugging = true;
            }

            try
            {
                bool unitTestResult = BasicUnitTestManager.Instance.Run( );
                if (!unitTestResult)
                {
                    ExtenderOptions.IsInSafeMode = true;
                }

                Server = Server.Instance;
                Server.CommandLineArgs = extenderArgs;
                Server.IsWCFEnabled    = !extenderArgs.NoWcf;
                Server.Init( );

                ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand("gui", ChatCommand_GUI, false);
                ChatManager.Instance.RegisterChatCommand(guiCommand);

                if (extenderArgs.AutoStart)
                {
                    Server.StartServer( );
                }

                if (!extenderArgs.NoWcf)
                {
                    string uriString = string.Format("{0}{1}", ConfigurationManager.AppSettings["WCFServerServiceBaseAddress"], CommandLineArgs.InstanceName);
                    BaseLog.Info("Opening up WCF service listener at {0}", uriString);
                    ServerServiceHost = new ServiceHost(typeof(ServerService.ServerService), new Uri(uriString, UriKind.Absolute));
                    ServerServiceHost.Open( );
                    ChatManager.Instance.ChatMessage += ChatManager_ChatMessage;
                }

                if (!extenderArgs.NoGui)
                {
                    Thread uiThread = new Thread(StartGui);
                    uiThread.SetApartmentState(ApartmentState.STA);
                    uiThread.Start( );
                }
                else if (Environment.UserInteractive)
                {
                    Console.ReadLine( );
                }
            }
            catch (AutoException eEx)
            {
                if (!extenderArgs.NoConsole)
                {
                    BaseLog.Info("AutoException - {0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( ));
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(string.Format("{0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw eEx.GetBaseException( );
                }
            }
            catch (TargetInvocationException ex)
            {
                if (!extenderArgs.NoConsole)
                {
                    BaseLog.Info("TargetInvocationException - {0}\n\r{1}", ex, ex.InnerException);
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(string.Format("{0}\n\r{1}", ex, ex.InnerException), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw;
                }
            }
            catch (Exception ex)
            {
                if (!extenderArgs.NoConsole)
                {
                    BaseLog.Info(ex, "Exception - {0}", ex);
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(ex.ToString( ), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw;
                }
            }
        }
Example #4
0
        private static void Start(string[] args)
        {
            //Setup error handling for unmanaged exceptions
            AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;
            Application.ThreadException += Application_ThreadException;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            //AppDomain.CurrentDomain.ClearEventInvocations("_unhandledException");

            LogManager.APILog.WriteLine(string.Format("Starting SEServerExtender with {0} arguments ...", args.Length));

            CommandLineArgs extenderArgs = new CommandLineArgs
            {
                AutoStart      = false,
                WorldName      = string.Empty,
                InstanceName   = string.Empty,
                NoGui          = false,
                NoConsole      = false,
                Debug          = false,
                GamePath       = string.Empty,
                NoWcf          = false,
                Autosave       = 0,
                WcfPort        = 0,
                Path           = string.Empty,
                CloseOnCrash   = false,
                RestartOnCrash = false,
                Args           = string.Join(" ", args.Select(x => string.Format("\"{0}\"", x)))
            };

            //Setup the default args

            //Process the args
            foreach (string arg in args)
            {
                if (arg.Split('=').Length > 1)
                {
                    string argName  = arg.Split('=')[0];
                    string argValue = arg.Split('=')[1];

                    if (argName.ToLower( ).Equals("instance"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(0, argValue.Length - 1);
                        }
                        extenderArgs.InstanceName = argValue;
                    }
                    else if (argName.ToLower( ).Equals("gamepath"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(0, argValue.Length - 1);
                        }
                        extenderArgs.GamePath = argValue;
                    }
                    else if (argName.ToLower( ).Equals("autosave"))
                    {
                        try
                        {
                            extenderArgs.Autosave = int.Parse(argValue);
                        }
                        catch
                        {
                            //Do nothing
                        }
                    }
                    else if (argName.ToLower( ).Equals("wcfport"))
                    {
                        try
                        {
                            extenderArgs.WcfPort = ushort.Parse(argValue);
                        }
                        catch
                        {
                            //Do nothing
                        }
                    }
                    else if (argName.ToLower( ).Equals("path"))
                    {
                        if (argValue[argValue.Length - 1] == '"')
                        {
                            argValue = argValue.Substring(0, argValue.Length - 1);
                        }
                        extenderArgs.Path = argValue;
                    }
                }
                else
                {
                    if (arg.ToLower( ).Equals("autostart"))
                    {
                        extenderArgs.AutoStart = true;
                    }
                    if (arg.ToLower( ).Equals("nogui"))
                    {
                        extenderArgs.NoGui = true;

                        //Implies autostart
                        extenderArgs.AutoStart = true;
                    }
                    if (arg.ToLower( ).Equals("noconsole"))
                    {
                        extenderArgs.NoConsole = true;

                        //Implies nogui and autostart
                        extenderArgs.NoGui     = true;
                        extenderArgs.AutoStart = true;
                    }
                    if (arg.ToLower( ).Equals("debug"))
                    {
                        extenderArgs.Debug = true;
                    }
                    if (arg.ToLower( ).Equals("nowcf"))
                    {
                        extenderArgs.NoWcf = true;
                    }
                    if (arg.ToLower( ).Equals("closeoncrash"))
                    {
                        extenderArgs.CloseOnCrash = true;
                    }
                    if (arg.ToLower( ).Equals("autosaveasync"))
                    {
                        extenderArgs.AutoSaveSync = false;
                    }
                    if (arg.ToLower( ).Equals("autosavesync"))
                    {
                        extenderArgs.AutoSaveSync = true;
                    }
                    if (arg.ToLower( ).Equals("restartoncrash"))
                    {
                        extenderArgs.RestartOnCrash = true;
                    }
                    if (arg.ToLower( ).Equals("wrr"))
                    {
                        extenderArgs.WorldRequestReplace = true;
                    }
                    if (arg.ToLower( ).Equals("wrm"))
                    {
                        extenderArgs.WorldDataModify = true;
                    }
                }
            }

            if (extenderArgs.NoWcf)
            {
                extenderArgs.WcfPort = 0;
            }

            if (!string.IsNullOrEmpty(extenderArgs.Path))
            {
                extenderArgs.InstanceName = string.Empty;
            }

            if (!Environment.UserInteractive)
            {
                extenderArgs.NoConsole = true;
                extenderArgs.NoGui     = true;
                extenderArgs.AutoStart = true;
            }

            if (extenderArgs.Debug)
            {
                SandboxGameAssemblyWrapper.IsDebugging = true;
            }

            try
            {
                bool unitTestResult = BasicUnitTestManager.Instance.Run( );
                if (!unitTestResult)
                {
                    SandboxGameAssemblyWrapper.IsInSafeMode = true;
                }

                _server = Server.Instance;
                _server.CommandLineArgs = extenderArgs;
                _server.IsWCFEnabled    = !extenderArgs.NoWcf;
                _server.WCFPort         = extenderArgs.WcfPort;
                _server.Init( );

                ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand {
                    Command = "gui", Callback = ChatCommand_GUI
                };
                ChatManager.Instance.RegisterChatCommand(guiCommand);

                if (extenderArgs.AutoStart)
                {
                    _server.StartServer( );
                }

                if (!extenderArgs.NoGui)
                {
                    Thread uiThread = new Thread(StartGui);
                    uiThread.SetApartmentState(ApartmentState.STA);
                    uiThread.Start( );
                }
                else if (Environment.UserInteractive)
                {
                    Console.ReadLine( );
                }
            }
            catch (AutoException eEx)
            {
                if (!extenderArgs.NoConsole)
                {
                    Console.WriteLine("AutoException - {0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( ));
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(string.Format("{0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw eEx.GetBaseException( );
                }
            }
            catch (TargetInvocationException ex)
            {
                if (!extenderArgs.NoConsole)
                {
                    Console.WriteLine("TargetInvocationException - {0}\n\r{1}", ex, ex.InnerException);
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(string.Format("{0}\n\r{1}", ex, ex.InnerException), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw;
                }
            }
            catch (Exception ex)
            {
                if (!extenderArgs.NoConsole)
                {
                    Console.WriteLine("Exception - {0}", ex);
                }
                if (!extenderArgs.NoGui)
                {
                    MessageBox.Show(ex.ToString( ), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (extenderArgs.NoConsole && extenderArgs.NoGui)
                {
                    throw;
                }
            }
        }