/// <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); }
/// <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}"); } }
/// <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}"); } }
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 } }