예제 #1
0
        public Controller()
        {
            Instance  = this;
            IsRunning = true;

            // Time since startup
            var timer = new Stopwatch();

            timer.Start();
            TimeSinceStartup = () => timer.Elapsed.TotalSeconds;

            RootDirectory          = Environment.CurrentDirectory;
            PluginDirectory        = Path.Combine(RootDirectory, "plugins");
            LogDirectory           = Path.Combine(RootDirectory, "logs");
            LanguageDirectory      = Path.Combine(RootDirectory, "lang");
            DataDirectory          = Path.Combine(RootDirectory, "data");
            DataTemporaryDirectory = Path.Combine(DataDirectory, "Temporary");

            if (!Directory.Exists(PluginDirectory))
            {
                Directory.CreateDirectory(PluginDirectory);
            }
            if (!Directory.Exists(LogDirectory))
            {
                Directory.CreateDirectory(LogDirectory);
            }
            if (!Directory.Exists(LanguageDirectory))
            {
                Directory.CreateDirectory(LanguageDirectory);
            }
            if (!Directory.Exists(DataDirectory))
            {
                Directory.CreateDirectory(DataDirectory);
            }
            if (!Directory.Exists(DataTemporaryDirectory))
            {
                Directory.CreateDirectory(DataTemporaryDirectory);
            }

            DataFileSystem = new DataFileSystem(DataDirectory);

            // Logging exceptions
            AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) =>
            {
                Log.Exception((Exception)eventArgs.ExceptionObject);
                Log.Error("Exit in 5 seconds");

                System.Console.Beep(1000, 1000);
                Thread.Sleep(5000);
                IsRunning = false;
                Environment.Exit(0);
            };

            // File System Watchers
            FSWatcherPlugins                       = new FileSystemWatcher(PluginDirectory, "*.dll");
            FSWatcherPlugins.Created              += OnFileCreated;
            FSWatcherPlugins.Changed              += OnFileChanged;
            FSWatcherPlugins.Deleted              += OnFileDeleted;
            FSWatcherPlugins.Renamed              += OnFileRenamed;
            FSWatcherPlugins.NotifyFilter          = NotifyFilters.FileName | NotifyFilters.LastWrite;
            FSWatcherPlugins.IncludeSubdirectories = false;
            FSWatcherPlugins.EnableRaisingEvents   = true;
            GC.KeepAlive(FSWatcherPlugins);

            // Version setup
            Version = new Version(Assembly.GetExecutingAssembly());

            // Initializing console
            ConsoleManager = new ConsoleManager();
            ConsoleManager.Initialize();

            // Loading core plugins
            Plugin.CreatePlugin(typeof(Core), string.Empty, false);

            // Loading other available plugins
            var files = Directory.GetFiles(PluginDirectory);

            for (var i = 0; i < files.Length; i++)
            {
                var path = files[i];
                if (Path.GetExtension(path) == ".dll")
                {
                    Interface.LoadAssembly(path);
                }
            }

            Interface.CallHook("OnInitialized");
        }