Ejemplo n.º 1
0
        /// <summary>
        ///     Gets the given server gamemodes.
        ///     The gamemodes are used to load modules filtered.
        ///     If no gamemodes given, any modules would be loaded.
        /// </summary>
        /// <returns>Array[string] with server gamemodes</returns>
        public static string[] GetServerGamemodes()
        {
            // Set defaults
            ParameterHandler.SetDefault("Gamemode", "any");

            // ServerType already setten -> return;
            if (_serverTypes != null)
            {
                return(_serverTypes);
            }

            List <string> serverGamemodes = ParameterHandler.GetValue("Gamemode").Split(',').ToList();

            serverGamemodes.ForEach(x => x = x.Trim());

            // Only default parameter gamemode value loaded -> warning
            if (ParameterHandler.IsDefault("Gamemode"))
            {
                ConsoleOutput.WriteLine(ConsoleType.Config,
                                        $"~-^-~The server started without defined gamemodes, so the default value~o~ \"any\"~;~ was used. " +
                                        $"Nevertheless, it is strongly advised to include the desired gamemodes, " +
                                        $"because mode ~o~\"any\"~;~ could have massive side effects.~-v-~");
            }

            // Shared is always needed
            serverGamemodes.Add("shared");

            // Cast to array
            _serverTypes = serverGamemodes.ToArray();
            return(_serverTypes);
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     Refreshing the server resource modules.
        ///     Hint: Runs only if "DEBUG" constant is given
        /// </summary>
        public void CopyModulesToServer()
        {
#if !DEBUG
            if (ParameterHandler.IsDefault("onlyCopy"))
            {
                ConsoleOutput.WriteLine(ConsoleType.Core, "Release state. Copying modules skipped.");
                return;
            }
#endif
            ConsoleOutput.WriteLine(ConsoleType.Core,
                                    $"Refreshing server resource modules...");
            // Define constants for the folder top copy from and to copy to
            const string gtMpServerModulesFolder = @"./resources/EvoMp/dist";
            const string projectSolutionCompiledModulesFolder = @"./../EvoMp/";


            // Create the Modules folder in the resource if it doesnt exist
            if (!Directory.Exists(gtMpServerModulesFolder))
            {
                Directory.CreateDirectory(gtMpServerModulesFolder);
            }

            // Delete old modules
            List <string> oldModules = Directory.EnumerateFiles(gtMpServerModulesFolder, "EvoMp.Module.*.*",
                                                                SearchOption.AllDirectories)
                                       .Where(file => file.Contains("EvoMp.Module."))
                                       .ToList();

            // Get the DLLs from the project folders
            // (Including *.pdb files. Used for debugging)
            try
            {
                ConsoleOutput.AppendPrefix("\t");
                // Search for modules.
                List <string> newModules = Directory.EnumerateFiles(projectSolutionCompiledModulesFolder,
                                                                    "EvoMp.Module.*.*",
                                                                    SearchOption.AllDirectories).ToList();
                newModules = newModules.Select(file => file.Replace(@"\", "/")).ToList();

                newModules = newModules.Where(path => path.Contains("bin/"))
                             .Where(file =>
                                    file.ToLower().EndsWith("dll") || file.ToLower().EndsWith("pdb") ||
                                    file.ToLower().EndsWith("xml"))
                             .ToList();

                const string slash = "/";

                // Clean old modules wich existing as dll's in other modules
                foreach (string module in newModules.ToArray())
                {
                    // modulePath contains no "\" -> next
                    if (!module.Contains(slash))
                    {
                        continue;
                    }

                    string moduleFile = module.Substring(module.LastIndexOf(slash, StringComparison.Ordinal) + 1);
                    string modulePath = module.Substring(0, module.LastIndexOf(slash, StringComparison.Ordinal));

                    // ModuleFile contains no "." -> next
                    if (!moduleFile.Contains("."))
                    {
                        continue;
                    }
                    // Remove .dll .pdb etc..
                    moduleFile = moduleFile.Substring(0, moduleFile.LastIndexOf(".", StringComparison.Ordinal));

                    // Path didn't contains the name of the module file -> remove from new modules
                    if (!modulePath.Contains(moduleFile))
                    {
                        newModules.Remove(module);
                    }
                }

                // Copy new modules
                foreach (string newModule in newModules)
                {
                    string destFile = gtMpServerModulesFolder + slash + Path.GetFileName(newModule);

                    // Destfile exist & destfile is same to new file -> skip
                    if (File.Exists(destFile))
                    {
                        if (new FileInfo(destFile).LastWriteTime >= new FileInfo(newModule).LastWriteTime)
                        {
                            continue;
                        }
                    }

                    // Copy new module & write message
                    File.Copy(newModule, destFile, true);
                    if (destFile.EndsWith(".dll"))
                    {
                        ConsoleOutput.WriteLine(ConsoleType.Core,
                                                $"Copying module: ~#83cfff~\"{Path.GetFileName(destFile)}\".");
                    }
                }

                // Delete old modules
                foreach (string deleteModule in oldModules.Where(t => !newModules.Select(Path.GetFileName)
                                                                 .Contains(Path.GetFileName(t))))
                {
                    File.Delete(deleteModule);
                    ConsoleOutput.WriteLine(ConsoleType.Core,
                                            $"Delete old module: ~#83cfff~\"{Path.GetFileName(deleteModule)}\".");
                }

                ConsoleOutput.ResetPrefix();
            }
            catch (Exception exception)
            {
                // Throw exception
                throw new Exception($"Internal error in \"EvoMp.Core.Core.ModuleStructure\" " +
                                    $"{Environment.NewLine}" +
                                    $"{exception.Message}{Environment.NewLine}" +
                                    $"{exception.StackTrace}");
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        ///     Copying NuGet packages to the gtmp server files
        ///     Hint: Runs only if "DEBUG" constant is given
        /// </summary>
        public void CopyNuGetPackagesToServer()
        {
#if !DEBUG
            if (ParameterHandler.IsDefault("onlyCopy"))
            {
                ConsoleOutput.WriteLine(ConsoleType.Core, "Release state. Copying NuGet packeges skipped.");
                return;
            }
#endif
            const string serverRootFolder = ".";

            const string projectSolutionNuGetPackagesFolder = @"../EvoMp/packages";

            try
            {
                // Search for solution NuGet packages
                ConsoleOutput.WriteLine(ConsoleType.Core,
                                        $"Searching for new dependencies in " +
                                        $"~#83cfff~\"{Path.GetFullPath(projectSolutionNuGetPackagesFolder)}\\*\"~;~.");
                List <string> packageFiles = Directory.EnumerateFiles(projectSolutionNuGetPackagesFolder, "*",
                                                                      SearchOption.AllDirectories)
                                             .Where(file => file.ToLower().EndsWith("dll") || file.ToLower().EndsWith("xml"))
                                             .Where(file => file.Contains(@"lib\net45"))
                                             .Where(file => !Path.GetFileName(file).ToLower().StartsWith("evomp"))
                                             .ToList();

                // Clear duplicates
                packageFiles = packageFiles.Distinct().ToList();


                ConsoleOutput.WriteLine(ConsoleType.Core, "Using dependencies: ");
                ConsoleOutput.AppendPrefix("\t");

                List <string> usedPackagesList = new List <string>();
                // Copy new NuGet packages
                foreach (string packageFile in packageFiles)
                {
                    if (packageFile.EndsWith(".dll"))
                    {
                        string packageName = Path.GetFileName(packageFile).Replace("\\", "/");

                        // Packed already loaded -> continue;
                        if (usedPackagesList.Contains(packageName))
                        {
                            continue;
                        }

                        ConsoleOutput.WriteLine(ConsoleType.Core,
                                                $"~#83cfff~\"{packageName}\".");

                        usedPackagesList.Add(packageName);
                    }

                    // Get target filename
                    string destinationFile = serverRootFolder + @"/" + Path.GetFileName(packageFile).Replace("\\", "/");

                    // File exist -> Check creation date and delete if older
                    if (File.Exists(destinationFile))
                    {
                        // File is newest -> skip
                        if (new FileInfo(destinationFile).LastWriteTime >= new FileInfo(packageFile).LastWriteTime)
                        {
                            continue;
                        }

                        // Try to delete older file, if fails, skip file..
                        // I knew, not the best way.
                        // Feel free if u knew a better way..
                        // (But info one of the project directors about our change)
                        try
                        {
                            File.Delete(destinationFile);
                        }
                        catch (Exception)
                        {
                            continue;
                        }
                    }

                    // Copy file & message
                    File.Copy(packageFile, destinationFile);
                }

                ConsoleOutput.ResetPrefix();
            }
            catch (Exception exception)
            {
                // Throw exception
                throw new Exception($"Internal error in \"EvoMp.Core.Core.CopyNuGetPackagesToServer\" " +
                                    $"{Environment.NewLine}" +
                                    $"{exception.Message}{Environment.NewLine}" +
                                    $"{exception.StackTrace}");
            }
        }
Ejemplo n.º 4
0
        public Main()
        {
            DbConfiguration.SetConfiguration(new QueryLogDbConfiguration());
            try
            {
                #region Core preparing / initialization

                // Clear console, set console color & write copyright
                ConsoleUtils.Clear();

                // Prepare Console set title
                ConsoleHandler.Server.ConsoleHandler.PrepareConsole();

                #endregion // Core preparing / initialization

                ConsoleUtils.SetConsoleTitle("EvoMp GT-MP Server Core. All rights reserverd.");

                // Load Console params
                ParameterHandler.LoadParams();

                CheckDatabaseReset();

                // Load logo
                ParameterHandler.SetDefault("LogoPath", "./ServerFiles/Default_Logo.txt");
                string asciiLogoFile = ParameterHandler.GetValue("LogoPath");

                #region Logo, Copyright, Server informations

                ConsoleOutput.PrintLine("-", "~#E6E6E6~");

                // Write logo from logo file
                ConsoleOutput.WriteCentredText(ConsoleType.Note,
                                               ConsoleUtils.ParseTextFileForConsole($"{asciiLogoFile}", 2, 1));

                // No Logo defined -> message and use default Logo
                if (ParameterHandler.IsDefault("LogoPath"))
                {
                    ConsoleOutput.WriteCentredText(ConsoleType.Config,
                                                   $"Using logo file ~o~\"{Path.GetFullPath($"{asciiLogoFile}")}\"~;~.\n" +
                                                   $"Please start your server with the ~b~" +
                                                   $"logopath ~;~ " +
                                                   $"parameter.");
                }

                // GetServerGamemodes writes cfg message to if not setten
                string moduleTypesString =
                    string.Join(", ",
                                ModuleTypeHandler.GetServerGamemodes().ToList().ConvertAll(input => input.ToUpper()));

                const string leftServerInfo  = "~#90A4AE~";
                const string rightServerInfo = "~#ECEFF1~";

                // Tiny gray line & Empty
                ConsoleOutput.PrintLine(" ");

                // Small centered line with headline & developer
                ConsoleOutput.WriteCentredText(ConsoleType.Note,
                                               "".PadRight(80, '-') + "\n" +
                                               "Server information\n" +
                                               "".PadRight(80, '-'));

                ConsoleOutput.WriteCentredText(ConsoleType.Info,
                                               $"{leftServerInfo}{"Server mode:".PadRight(35)}{string.Empty.PadRight(5)}{rightServerInfo}{$"{moduleTypesString}".PadRight(35)}\n" +
                                               $"{leftServerInfo}{"Runtime mode:".PadRight(35)}{string.Empty.PadRight(5)}{rightServerInfo}{$"{(Debug ? "Debugging" : "Release")}".PadRight(35)}\n" +
                                               $"{leftServerInfo}{"Server name:".PadRight(35)}{string.Empty.PadRight(5)}{rightServerInfo}{API.getServerName()}{"".PadRight(ColorUtils.CleanUp(API.getServerName()).Length > 35 ? 0 : 35 - ColorUtils.CleanUp(API.getServerName()).Length)}\n" +
                                               $"{leftServerInfo}{"Server port:".PadRight(35)}{string.Empty.PadRight(5)}{rightServerInfo}{$"{API.getServerPort():0000}".PadRight(35)}\n" +
                                               $"{leftServerInfo}{"Max players:".PadRight(35)}{string.Empty.PadRight(5)}{rightServerInfo}{$"{API.getMaxPlayers():0000}".PadRight(35)}\n");

                // One empty lines
                ConsoleOutput.PrintLine(" ");

                // Small centered line with headline & developer
                ConsoleOutput.WriteCentredText(ConsoleType.Note,
                                               "".PadRight(80, '-') + "\n" +
                                               "Developer team\n" +
                                               "".PadRight(80, '-'));

                const string usernameColor   = "~#ECEFF1~";
                const string diTitleColor    = "~#03A9F4~";
                const string depyTitleColor  = "~#4FC3F7~";
                const string staffTitleColor = "~#B3E5FC~";

                ConsoleOutput.WriteCentredText(ConsoleType.Note,
                                               $"{diTitleColor}{"Freeroam Director".PadRight(35)}{string.Empty.PadRight(5)}{usernameColor}{"Ruffo ~c~(Christian Groothoff)".PadRight(35 + 3)}\n" +
                                               $"{depyTitleColor}{"Freeroam Deputy".PadRight(35)}{string.Empty.PadRight(5)}{usernameColor}{"Koka".PadRight(35)}\n" +
                                               $"{depyTitleColor}{"Freeroam Staff".PadRight(35)}{string.Empty.PadRight(5)}{usernameColor}{"Sascha".PadRight(35)}\n" +
                                               $"{staffTitleColor}{"Freeroam Staff".PadRight(35)}{string.Empty.PadRight(5)}{usernameColor}{"James".PadRight(35)}\n"
                                               );

                ConsoleOutput.PrintLine(" ");

                // Startup parameters
                ConsoleOutput.WriteCentredText(ConsoleType.Note,
                                               "".PadRight(80, '-') + "\n" +
                                               "Startup Parameters\n" +
                                               "".PadRight(80, '-'));
                ParameterHandler.PrintArgs();

                ConsoleOutput.PrintLine(" ");
                ConsoleOutput.PrintLine("-");

                #endregion Logo, Copyright, Server informations

                // Only copy and then stop. Used for docker

                ParameterHandler.SetDefault("onlyCopy", "false");

                // Write information about Core startup
                ConsoleOutput.WriteLine(ConsoleType.Core, "Initializing EvoMp Core...");

                // Init ModuleStructurer
                ModuleStructurer moduleStructurer = new ModuleStructurer();

                // Copy modules & NuGet files to Server
                moduleStructurer.CopyModulesToServer();
                moduleStructurer.CopyNuGetPackagesToServer();

                // Write complete & loading modules message
                ConsoleOutput.WriteLine(ConsoleType.Core, "Initializing EvoMp Core completed.");

                if (!ParameterHandler.IsDefault("onlyCopy"))
                {
                    // Finish sequence
                    SharedEvents.OnOnCoreStartupCompleted();
                    ConsoleOutput.WriteLine(ConsoleType.Core, "Core startup completed");
                    ConsoleOutput.PrintLine("-");

                    ConsoleOutput.WriteLine(ConsoleType.Core, "OnlyCopy parameter has been detected! Stopping Server!");
                    Environment.Exit(0);
                }
                else
                {
                    SharedEvents.OnOnModuleLoadingStart(API);

                    // Load Modules
                    new ModuleLoader(API).Load();

                    // Finish sequence
                    SharedEvents.OnOnCoreStartupCompleted();
                    ConsoleOutput.WriteLine(ConsoleType.Core, "Core startup completed");
                    ConsoleOutput.PrintLine("-");
                }

                SharedEvents.OnOnAfterCoreStartupCompleted();
            }
            catch (Exception e)
            {
                //#if DEBUG
                ConsoleOutput.WriteException(e.ToString());
                Exception innerException = e.InnerException;
                while (innerException != null)
                {
                    ConsoleOutput.WriteException(innerException.ToString());
                    innerException = innerException.InnerException;
                }

                //throw lastInnerException;
//#endif
            }
        }