Merge pull request #19 from Bletch1971/PerformanceOptmisations

Performance optmisations
This commit is contained in:
Brett Hewitson 2021-12-16 08:55:16 +10:00 committed by GitHub
commit 927aaf6e3b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
51 changed files with 666 additions and 668 deletions

View file

@ -52,7 +52,7 @@ namespace ServerManagerTool.Lib
items = gameData.Items.ConvertAll(item => new PrimalItem { ClassName = item.ClassName, Mod = item.Mod, KnownItem = true, Category = item.Category }).ToArray();
// resources
resourceMultipliers = gameData.Items.Where(item => item.IsHarvestable).ToList().ConvertAll(item => new ResourceClassMultiplier { ClassName = item.ClassName, Mod = item.Mod, KnownResource = true }).ToArray();
resourceMultipliers = gameData.Items.Where(item => item.IsHarvestable).Select(item => new ResourceClassMultiplier { ClassName = item.ClassName, Mod = item.Mod, KnownResource = true }).ToArray();
// map spawners
gameData.MapSpawners.AddRange(userGameData.MapSpawners);
@ -77,9 +77,9 @@ namespace ServerManagerTool.Lib
if (gameData.GameMaps.Count > 0)
{
var maps1 = gameMaps.ToList();
maps1.AddRange(gameData.GameMaps.Where(item => !item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
maps1.AddRange(gameData.GameMaps.Where(item => !item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
var maps2 = gameMapsSotF.ToList();
maps2.AddRange(gameData.GameMaps.Where(item => item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
maps2.AddRange(gameData.GameMaps.Where(item => item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
gameMaps = maps1.ToArray();
gameMapsSotF = maps2.ToArray();
@ -91,9 +91,9 @@ namespace ServerManagerTool.Lib
if (gameData.TotalConversions.Count > 0)
{
var mods1 = totalConversions.ToList();
mods1.AddRange(gameData.TotalConversions.Where(item => !item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
mods1.AddRange(gameData.TotalConversions.Where(item => !item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
var mods2 = totalConversionsSotF.ToList();
mods2.AddRange(gameData.TotalConversions.Where(item => item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
mods2.AddRange(gameData.TotalConversions.Where(item => item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.ClassName, DisplayMember = item.Description }));
totalConversions = mods1.ToArray();
totalConversionsSotF = mods2.ToArray();
@ -130,9 +130,9 @@ namespace ServerManagerTool.Lib
if (gameData.Branches.Count > 0)
{
var branches1 = branches.ToList();
branches1.AddRange(gameData.Branches.Where(item => !item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.BranchName, DisplayMember = item.Description }));
branches1.AddRange(gameData.Branches.Where(item => !item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.BranchName, DisplayMember = item.Description }));
var branches2 = branchesSotF.ToList();
branches2.AddRange(gameData.Branches.Where(item => item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.BranchName, DisplayMember = item.Description }));
branches2.AddRange(gameData.Branches.Where(item => item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.BranchName, DisplayMember = item.Description }));
branches = branches1.ToArray();
branchesSotF = branches2.ToArray();
@ -144,9 +144,9 @@ namespace ServerManagerTool.Lib
if (gameData.Events.Count > 0)
{
var events1 = events.ToList();
events1.AddRange(gameData.Events.Where(item => !item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.EventName, DisplayMember = item.Description }));
events1.AddRange(gameData.Events.Where(item => !item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.EventName, DisplayMember = item.Description }));
var events2 = eventsSotF.ToList();
events2.AddRange(gameData.Events.Where(item => item.IsSotF).ToList().ConvertAll(item => new ComboBoxItem { ValueMember = item.EventName, DisplayMember = item.Description }));
events2.AddRange(gameData.Events.Where(item => item.IsSotF).Select(item => new ComboBoxItem { ValueMember = item.EventName, DisplayMember = item.Description }));
events = events1.ToArray();
eventsSotF = events2.ToArray();
@ -157,7 +157,7 @@ namespace ServerManagerTool.Lib
if (gameData.OfficialMods.Count > 0)
{
ModUtils.AddOfficialMods(gameData.OfficialMods.Where(m => !string.IsNullOrWhiteSpace(m.ModId)).Select(m => m.ModId));
ModUtils.AddOfficialMods(gameData.OfficialMods.Where(m => !string.IsNullOrWhiteSpace(m.ModId)).Select(m => m.ModId).ToList());
}
}

View file

@ -17,15 +17,13 @@ namespace ServerManagerTool.Lib
public override void FromIniValues(IEnumerable<string> iniValues)
{
var items = iniValues?.Select(AggregateIniValue.FromINIValue<EngramAutoUnlock>).ToArray();
var items = iniValues?.Select(AggregateIniValue.FromINIValue<EngramAutoUnlock>);
Clear();
var itemsToAdd = items.Where(i => !this.Any(e => e.IsEquivalent(i))).ToArray();
AddRange(itemsToAdd);
AddRange(items.Where(i => !this.Any(e => e.IsEquivalent(i))));
var itemsToUpdate = items.Where(i => this.Any(e => e.IsEquivalent(i))).ToArray();
foreach (var item in itemsToUpdate)
foreach (var item in items.Where(i => this.Any(e => e.IsEquivalent(i))))
{
var e = this.FirstOrDefault(r => r.IsEquivalent(item));
e.LevelToAutoUnlock = item.LevelToAutoUnlock;

View file

@ -18,15 +18,13 @@ namespace ServerManagerTool.Lib
public override void FromIniValues(IEnumerable<string> iniValues)
{
var items = iniValues?.Select(AggregateIniValue.FromINIValue<EngramEntry>).ToArray();
var items = iniValues?.Select(AggregateIniValue.FromINIValue<EngramEntry>);
Clear();
var itemsToAdd = items.Where(i => !this.Any(e => e.IsEquivalent(i))).ToArray();
AddRange(itemsToAdd);
AddRange(items.Where(i => !this.Any(e => e.IsEquivalent(i))));
var itemsToUpdate = items.Where(i => this.Any(e => e.IsEquivalent(i))).ToArray();
foreach (var item in itemsToUpdate)
foreach (var item in items.Where(i => this.Any(e => e.IsEquivalent(i))))
{
var e = this.FirstOrDefault(r => r.IsEquivalent(item));
e.EngramLevelRequirement = item.EngramLevelRequirement;

View file

@ -61,7 +61,7 @@ namespace ServerManagerTool.Lib
int index = 0;
int xpTotal = 0;
int engramTotal = 0;
foreach (var existingLevel in this.OrderBy(l => l.XPRequired).ToArray())
foreach (var existingLevel in this.OrderBy(l => l.XPRequired))
{
xpTotal += existingLevel.XPRequired;
engramTotal += existingLevel.EngramPoints;

View file

@ -6,7 +6,6 @@ using ServerManagerTool.Enums;
using ServerManagerTool.Interface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

View file

@ -14,11 +14,9 @@ namespace ServerManagerTool.Lib
{
}
public string[] RenderToView()
public IEnumerable<string> RenderToView()
{
List<string> errors = new List<string>();
return errors.ToArray();
return new List<string>();
}
public void RenderToModel()

View file

@ -1,5 +1,4 @@
using ServerManagerTool.Common.Model;
using ServerManagerTool.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
@ -18,22 +17,20 @@ namespace ServerManagerTool.Lib
public override void FromIniValues(IEnumerable<string> iniValues)
{
var items = iniValues?.Select(AggregateIniValue.FromINIValue<ResourceClassMultiplier>).ToArray();
var items = iniValues?.Select(AggregateIniValue.FromINIValue<ResourceClassMultiplier>);
Clear();
if (this._resetFunc != null)
this.AddRange(this._resetFunc());
var itemsToAdd = items.Where(i => !this.Any(r => r.IsEquivalent(i))).ToArray();
AddRange(itemsToAdd);
AddRange(items.Where(i => !this.Any(r => r.IsEquivalent(i))));
var itemsToUpdate = items.Where(i => this.Any(r => r.IsEquivalent(i))).ToArray();
foreach (var item in itemsToUpdate)
foreach (var item in items.Where(i => this.Any(r => r.IsEquivalent(i))))
{
this.FirstOrDefault(r => r.IsEquivalent(item)).Multiplier = item.Multiplier;
}
IsEnabled = (items.Length > 0);
IsEnabled = (Count > 0);
Sort(AggregateIniValue.SortKeySelector);
}

View file

@ -14,7 +14,7 @@ namespace ServerManagerTool.Lib
{
}
public string[] RenderToView()
public IEnumerable<string> RenderToView()
{
List<string> errors = new List<string>();
@ -27,7 +27,7 @@ namespace ServerManagerTool.Lib
}
}
return errors.ToArray();
return errors;
}
public void RenderToModel()

View file

@ -17,7 +17,7 @@ namespace ServerManagerTool.Lib
{
}
public string[] RenderToView()
public IEnumerable<string> RenderToView()
{
List<string> errors = new List<string>();
@ -48,7 +48,7 @@ namespace ServerManagerTool.Lib
Update();
return errors.ToArray();
return errors;
}
public void RenderToModel()

View file

@ -452,8 +452,8 @@ namespace ServerManagerTool.Lib
{
try
{
var playerInfo = gameServer?.GetPlayers()?.Where(p => !string.IsNullOrWhiteSpace(p.Name?.Trim())).ToList();
var playerCount = playerInfo?.Count ?? -1;
var playerInfo = gameServer?.GetPlayers()?.Where(p => !string.IsNullOrWhiteSpace(p.Name?.Trim()));
var playerCount = playerInfo?.Count() ?? -1;
// check if anyone is logged into the server
if (playerCount <= 0)
@ -1875,7 +1875,7 @@ namespace ServerManagerTool.Lib
comment.AppendLine($"PGM Server: {_profile.PGM_Enabled}");
comment.AppendLine($"Process: {ServerProcess}");
ZipUtils.ZipFiles(backupFile, files.ToArray(), comment.ToString(), false);
ZipUtils.ZipFiles(backupFile, files, comment.ToString(), false);
LogProfileMessage($"Backup file created - {backupFile}");
}
@ -2025,7 +2025,7 @@ namespace ServerManagerTool.Lib
comment.AppendLine($"PGM Server: {_profile.PGM_Enabled}");
comment.AppendLine($"Process: {ServerProcess}");
ZipUtils.ZipFiles(backupFile, files.ToArray(), comment.ToString(), false);
ZipUtils.ZipFiles(backupFile, files, comment.ToString(), false);
LogProfileMessage($"Backed up world files - {saveFolder}");
LogProfileMessage($"Backup file created - {backupFile}");
@ -2998,7 +2998,7 @@ namespace ServerManagerTool.Lib
if (ExitCode == EXITCODE_NORMALEXIT)
{
// get the profile associated with the branch
var profiles = _profiles.Keys.Where(p => p.EnableAutoUpdate && p.BranchName.Equals(branch.BranchName, StringComparison.OrdinalIgnoreCase)).ToArray();
var profiles = _profiles.Keys.Where(p => p.EnableAutoUpdate && p.BranchName.Equals(branch.BranchName, StringComparison.OrdinalIgnoreCase));
var profileExitCodes = new ConcurrentDictionary<ServerProfileSnapshot, int>();
if (Config.Default.AutoUpdate_ParallelUpdate)
@ -3249,7 +3249,7 @@ namespace ServerManagerTool.Lib
if (exitCode == EXITCODE_NORMALEXIT)
{
var branches = _profiles.Keys.Where(p => p.EnableAutoUpdate).Select(p => BranchSnapshot.Create(p)).Distinct(new BranchSnapshotComparer()).ToArray();
var branches = _profiles.Keys.Where(p => p.EnableAutoUpdate).Select(p => BranchSnapshot.Create(p)).Distinct(new BranchSnapshotComparer());
var exitCodes = new ConcurrentDictionary<BranchSnapshot, int>();
// update the server cache for each branch

View file

@ -223,7 +223,7 @@ namespace ServerManagerTool.Lib
token.ThrowIfCancellationRequested();
// remove any players that do not have a player file.
var droppedPlayers = _players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null).ToArray();
var droppedPlayers = _players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null);
foreach (var droppedPlayer in droppedPlayers)
{
_players.TryRemove(droppedPlayer.PlayerId, out PlayerInfo player);

View file

@ -3473,9 +3473,7 @@ namespace ServerManagerTool.Lib
{
InstallDirectory = folder;
LoadServerFileAdministrators();
LoadServerFileExclusive();
LoadServerFileWhitelisted();
LoadServerFiles(true, true, true);
SetupServerFilesWatcher();
}
@ -3561,9 +3559,7 @@ namespace ServerManagerTool.Lib
settings.MutagenLevelBoostBred.Reset();
settings.PerLevelStatsMultiplier_Player.Reset();
settings.PlayerBaseStatMultipliers.Reset();
settings.LoadServerFileAdministrators();
settings.LoadServerFileExclusive();
settings.LoadServerFileWhitelisted();
settings.LoadServerFiles(true, true, true);
settings.SetupServerFilesWatcher();
return settings;
}
@ -3597,7 +3593,7 @@ namespace ServerManagerTool.Lib
}
}
private static Enum[] GetExclusions()
private static IEnumerable<Enum> GetExclusions()
{
var exclusions = new List<Enum>();
@ -3641,7 +3637,7 @@ namespace ServerManagerTool.Lib
exclusions.Add(ServerProfileCategory.SOTF);
}
return exclusions.ToArray();
return exclusions;
}
private LevelList GetLevelList(LevelProgression levelProgression)
@ -4026,7 +4022,7 @@ namespace ServerManagerTool.Lib
return profile;
}
public static ServerProfile LoadFromINIFiles(string file, ServerProfile profile, Enum[] exclusions = null)
public static ServerProfile LoadFromINIFiles(string file, ServerProfile profile, IEnumerable<Enum> exclusions = null)
{
if (string.IsNullOrWhiteSpace(file) || !File.Exists(file))
return null;
@ -4140,9 +4136,7 @@ namespace ServerManagerTool.Lib
if (Config.Default.SectionPreventTransferOverridesEnabled)
profile.PreventTransferForClassNames.RenderToView();
profile.LoadServerFileAdministrators();
profile.LoadServerFileExclusive();
profile.LoadServerFileWhitelisted();
profile.LoadServerFiles(true, true, true);
profile.SetupServerFilesWatcher();
profile._lastSaveLocation = file;
@ -4400,7 +4394,7 @@ namespace ServerManagerTool.Lib
SaveINIFile(configDir);
}
public void SaveINIFile(string profileIniDir, Enum[] exclusions = null)
public void SaveINIFile(string profileIniDir, IEnumerable<Enum> exclusions = null)
{
if (exclusions == null)
exclusions = GetExclusions();
@ -4424,7 +4418,7 @@ namespace ServerManagerTool.Lib
filteredValues.AddRange(this.PlayerLevels.ToINIValuesForEngramPoints());
}
iniFile.WriteSection(IniFiles.Game, IniSections.Game_ShooterGameMode, filteredValues.ToArray());
iniFile.WriteSection(IniFiles.Game, IniSections.Game_ShooterGameMode, filteredValues);
}
public bool UpdateDirectoryPermissions()
@ -4984,7 +4978,7 @@ namespace ServerManagerTool.Lib
var csvMapper = new CsvDinoLevelMapping();
var csvParser = new CsvParser<ImportLevel>(csvParserOptions, csvMapper);
var result = csvParser.ReadFromFile(fileName, Encoding.ASCII).ToList();
var result = csvParser.ReadFromFile(fileName, Encoding.ASCII);
if (result.Any(r => !r.IsValid))
{
var error = result.First(r => r.Error != null);
@ -5011,7 +5005,7 @@ namespace ServerManagerTool.Lib
var csvMapper = new CsvPlayerLevelMapping();
var csvParser = new CsvParser<ImportLevel>(csvParserOptions, csvMapper);
var result = csvParser.ReadFromFile(fileName, Encoding.ASCII).ToList();
var result = csvParser.ReadFromFile(fileName, Encoding.ASCII);
if (result.Any(r => !r.IsValid))
{
var error = result.First(r => r.Error != null);
@ -5866,7 +5860,7 @@ namespace ServerManagerTool.Lib
this.CustomEngineSettings.Clear();
foreach (var section in sourceProfile.CustomEngineSettings)
{
this.CustomEngineSettings.Add(section.SectionName, section.ToIniValues().ToArray());
this.CustomEngineSettings.Add(section.SectionName, section.ToIniValues());
}
}
@ -5875,7 +5869,7 @@ namespace ServerManagerTool.Lib
this.CustomGameSettings.Clear();
foreach (var section in sourceProfile.CustomGameSettings)
{
this.CustomGameSettings.Add(section.SectionName, section.ToIniValues().ToArray());
this.CustomGameSettings.Add(section.SectionName, section.ToIniValues());
}
}
@ -5884,7 +5878,7 @@ namespace ServerManagerTool.Lib
this.CustomGameUserSettings.Clear();
foreach (var section in sourceProfile.CustomGameUserSettings)
{
this.CustomGameUserSettings.Add(section.SectionName, section.ToIniValues().ToArray());
this.CustomGameUserSettings.Add(section.SectionName, section.ToIniValues());
}
}
@ -6364,18 +6358,24 @@ namespace ServerManagerTool.Lib
#region Server Files
private void ServerFilesWatcher_Changed(object sender, FileSystemEventArgs e)
{
var adminFile = false;
var exclusiveFile = false;
var whitelistFile = false;
if (e.Name.Equals(Config.Default.ArkAdminFile, StringComparison.OrdinalIgnoreCase))
{
TaskUtils.RunOnUIThreadAsync(() => LoadServerFileAdministrators()).DoNotWait();
adminFile = true;
}
else if (e.Name.Equals(Config.Default.ArkExclusiveFile, StringComparison.OrdinalIgnoreCase))
if (e.Name.Equals(Config.Default.ArkExclusiveFile, StringComparison.OrdinalIgnoreCase))
{
TaskUtils.RunOnUIThreadAsync(() => LoadServerFileExclusive()).DoNotWait();
exclusiveFile = true;
}
else if (e.Name.Equals(Config.Default.ArkWhitelistFile, StringComparison.OrdinalIgnoreCase))
if (e.Name.Equals(Config.Default.ArkWhitelistFile, StringComparison.OrdinalIgnoreCase))
{
TaskUtils.RunOnUIThreadAsync(() => LoadServerFileWhitelisted()).DoNotWait();
whitelistFile = true;
}
TaskUtils.RunOnUIThreadAsync(() => LoadServerFiles(adminFile, exclusiveFile, whitelistFile)).DoNotWait();
}
private void ServerFilesWatcher_Error(object sender, ErrorEventArgs e)
@ -6447,74 +6447,76 @@ namespace ServerManagerTool.Lib
_serverFilesWatcherSaved.EnableRaisingEvents = true;
}
public void LoadServerFileAdministrators()
public void LoadServerFiles(bool adminFile, bool exclusiveFile, bool whitelistFile)
{
try
{
var list = this.ServerFilesAdmins ?? new PlayerUserList();
var list1 = this.ServerFilesAdmins ?? new PlayerUserList();
var list2 = this.ServerFilesExclusive ?? new PlayerUserList();
var list3 = this.ServerFilesWhitelisted ?? new PlayerUserList();
var file = Path.Combine(InstallDirectory, Config.Default.SavedRelativePath, Config.Default.ArkAdminFile);
if (File.Exists(file))
var allSteamIds = new List<string>();
string[] adminSteamIds = null;
string[] exclusiveSteamIds = null;
string[] whitelistSteamIds = null;
if (adminFile)
{
var steamIds = File.ReadAllLines(file);
var steamUsers = SteamUtils.GetSteamUserDetails(steamIds.ToList());
list = PlayerUserList.GetList(steamUsers, steamIds);
var file = Path.Combine(InstallDirectory, Config.Default.SavedRelativePath, Config.Default.ArkAdminFile);
if (File.Exists(file))
{
adminSteamIds = File.ReadAllLines(file);
allSteamIds.AddRange(adminSteamIds);
}
}
this.ServerFilesAdmins = list;
if (exclusiveFile)
{
var file = Path.Combine(InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ArkExclusiveFile);
if (File.Exists(file))
{
exclusiveSteamIds = File.ReadAllLines(file);
allSteamIds.AddRange(exclusiveSteamIds);
}
}
if (whitelistFile)
{
var file = Path.Combine(InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ArkWhitelistFile);
if (File.Exists(file))
{
whitelistSteamIds = File.ReadAllLines(file);
allSteamIds.AddRange(whitelistSteamIds);
}
}
// remove all duplicates
allSteamIds = allSteamIds.Distinct().ToList();
// fetch the details of all steam users in the list
var steamUsers = SteamUtils.GetSteamUserDetails(allSteamIds);
if (adminFile && adminSteamIds != null)
{
list1 = PlayerUserList.GetList(steamUsers, adminSteamIds);
}
if (exclusiveFile && exclusiveSteamIds != null)
{
list2 = PlayerUserList.GetList(steamUsers, exclusiveSteamIds);
}
if (whitelistFile && whitelistSteamIds != null)
{
list3 = PlayerUserList.GetList(steamUsers, whitelistSteamIds);
}
this.ServerFilesAdmins = list1;
this.ServerFilesExclusive = list2;
this.ServerFilesWhitelisted = list3;
}
catch (Exception ex)
{
this.ServerFilesAdmins = new PlayerUserList();
MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_ServerFilesLoadErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
public void LoadServerFileExclusive()
{
try
{
var list = this.ServerFilesExclusive ?? new PlayerUserList();
var file = Path.Combine(InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ArkExclusiveFile);
if (File.Exists(file))
{
var steamIds = File.ReadAllLines(file);
var steamUsers = SteamUtils.GetSteamUserDetails(steamIds.ToList());
list = PlayerUserList.GetList(steamUsers, steamIds);
}
this.ServerFilesExclusive = list;
}
catch (Exception ex)
{
this.ServerFilesExclusive = new PlayerUserList();
MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_ServerFilesLoadErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
public void LoadServerFileWhitelisted()
{
try
{
var list = this.ServerFilesWhitelisted ?? new PlayerUserList();
var file = Path.Combine(InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ArkWhitelistFile);
if (File.Exists(file))
{
var steamIds = File.ReadAllLines(file);
var steamUsers = SteamUtils.GetSteamUserDetails(steamIds.ToList());
list = PlayerUserList.GetList(steamUsers, steamIds);
}
this.ServerFilesWhitelisted = list;
}
catch (Exception ex)
{
this.ServerFilesWhitelisted = new PlayerUserList();
MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_ServerFilesLoadErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
@ -6528,7 +6530,7 @@ namespace ServerManagerTool.Lib
Directory.CreateDirectory(folder);
var file = Path.Combine(folder, Config.Default.ArkAdminFile);
File.WriteAllLines(file, this.ServerFilesAdmins.ToArray());
File.WriteAllLines(file, this.ServerFilesAdmins.ToEnumerable());
}
catch (Exception ex)
{
@ -6545,7 +6547,7 @@ namespace ServerManagerTool.Lib
Directory.CreateDirectory(folder);
var file = Path.Combine(folder, Config.Default.ArkExclusiveFile);
File.WriteAllLines(file, this.ServerFilesExclusive.ToArray());
File.WriteAllLines(file, this.ServerFilesExclusive.ToEnumerable());
}
catch (Exception ex)
{
@ -6562,7 +6564,7 @@ namespace ServerManagerTool.Lib
Directory.CreateDirectory(folder);
var file = Path.Combine(folder, Config.Default.ArkWhitelistFile);
File.WriteAllLines(file, this.ServerFilesWhitelisted.ToArray());
File.WriteAllLines(file, this.ServerFilesWhitelisted.ToEnumerable());
}
catch (Exception ex)
{

View file

@ -29,7 +29,7 @@ namespace ServerManagerTool.Lib
public string ServerMap;
public string ServerMapModId;
public string TotalConversionModId;
public List<string> ServerModIds;
public IEnumerable<string> ServerModIds;
public string MOTD;
public int MotDDuration;
public bool MOTDIntervalEnabled;

View file

@ -325,8 +325,8 @@ namespace ServerManagerTool.Lib
else if (command.command.Equals(RCON_COMMAND_GETCHAT, StringComparison.OrdinalIgnoreCase))
{
// TODO: Extract the player name from the chat
var lines = command.lines.Where(l => !String.IsNullOrEmpty(l) && l != NoResponseOutput).ToArray();
if (lines.Length == 0 && command.suppressCommand)
var lines = command.lines.Where(l => !String.IsNullOrEmpty(l) && l != NoResponseOutput);
if (!lines.Any() && command.suppressCommand)
{
command.suppressOutput = true;
}
@ -398,7 +398,7 @@ namespace ServerManagerTool.Lib
}
}
var droppedPlayers = this.players.Values.Where(p => onlinePlayers.FirstOrDefault(np => np.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null).ToArray();
var droppedPlayers = this.players.Values.Where(p => onlinePlayers.FirstOrDefault(np => np.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null);
foreach (var droppedPlayer in droppedPlayers)
{
if (droppedPlayer.IsOnline)
@ -604,7 +604,7 @@ namespace ServerManagerTool.Lib
token.ThrowIfCancellationRequested();
// remove any players that do not have a player file.
var droppedPlayers = this.players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null).ToArray();
var droppedPlayers = this.players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null);
foreach (var droppedPlayer in droppedPlayers)
{
players.TryRemove(droppedPlayer.PlayerId, out PlayerInfo player);

View file

@ -87,20 +87,24 @@ namespace ServerManagerTool.Lib.ViewModel
{
Reset();
foreach(var entry in this.DinoSpawnWeightMultipliers)
foreach(var entry in this.DinoSpawnWeightMultipliers.Where(e => !string.IsNullOrWhiteSpace(e.DinoNameTag)))
{
if (string.IsNullOrWhiteSpace(entry.DinoNameTag))
continue;
var dinoSettings = this.Where(vi => vi.NameTag == entry.DinoNameTag).ToArray();
if (dinoSettings == null || dinoSettings.Length == 0)
if (this.Any(d => d.NameTag == entry.DinoNameTag))
{
this.Add(CreateDinoSetting(entry.DinoNameTag, entry.Mod, entry.KnownDino, true, false));
foreach (var dinoSetting in this.Where(d => d.NameTag == entry.DinoNameTag))
{
dinoSetting.SpawnWeightMultiplier = entry.SpawnWeightMultiplier;
dinoSetting.OverrideSpawnLimitPercentage = entry.OverrideSpawnLimitPercentage;
dinoSetting.SpawnLimitPercentage = entry.SpawnLimitPercentage;
dinoSetting.OriginalSpawnWeightMultiplier = entry.SpawnWeightMultiplier;
dinoSetting.OriginalOverrideSpawnLimitPercentage = entry.OverrideSpawnLimitPercentage;
dinoSetting.OriginalSpawnLimitPercentage = entry.SpawnLimitPercentage;
}
}
dinoSettings = this.Where(vi => vi.NameTag == entry.DinoNameTag).ToArray();
foreach (var dinoSetting in dinoSettings)
else
{
var dinoSetting = CreateDinoSetting(entry.DinoNameTag, entry.Mod, entry.KnownDino, true, false);
dinoSetting.SpawnWeightMultiplier = entry.SpawnWeightMultiplier;
dinoSetting.OverrideSpawnLimitPercentage = entry.OverrideSpawnLimitPercentage;
dinoSetting.SpawnLimitPercentage = entry.SpawnLimitPercentage;
@ -108,115 +112,118 @@ namespace ServerManagerTool.Lib.ViewModel
dinoSetting.OriginalSpawnWeightMultiplier = entry.SpawnWeightMultiplier;
dinoSetting.OriginalOverrideSpawnLimitPercentage = entry.OverrideSpawnLimitPercentage;
dinoSetting.OriginalSpawnLimitPercentage = entry.SpawnLimitPercentage;
this.Add(dinoSetting);
}
}
foreach(var entry in this.PreventDinoTameClassNames)
foreach(var entry in this.PreventDinoTameClassNames.Where(e => !string.IsNullOrWhiteSpace(e)))
{
if (string.IsNullOrWhiteSpace(entry))
continue;
var dinoSettings = this.Where(vi => vi.ClassName == entry).ToArray();
if (dinoSettings == null || dinoSettings.Length == 0)
if (this.Any(d => d.ClassName == entry))
{
this.Add(CreateDinoSetting(entry, GameData.MOD_UNKNOWN, false, false, true));
foreach (var dinoSetting in this.Where(d => d.ClassName == entry && !d.CanTame))
{
dinoSetting.CanTame = false;
}
}
dinoSettings = this.Where(vi => vi.ClassName == entry).ToArray();
foreach (var dinoSetting in dinoSettings)
else
{
var dinoSetting = CreateDinoSetting(entry, GameData.MOD_UNKNOWN, false, false, true);
dinoSetting.CanTame = false;
this.Add(dinoSetting);
}
}
foreach(var entry in this.NpcReplacements)
foreach(var entry in this.NpcReplacements.Where(e => !string.IsNullOrWhiteSpace(e.FromClassName)))
{
if (string.IsNullOrWhiteSpace(entry.FromClassName))
continue;
var dinoSettings = this.Where(vi => vi.ClassName == entry.FromClassName).ToArray();
if (dinoSettings == null || dinoSettings.Length == 0)
if (this.Any(d => d.ClassName == entry.FromClassName))
{
this.Add(CreateDinoSetting(entry.FromClassName, GameData.MOD_UNKNOWN, false, false, true));
foreach (var dinoSetting in this.Where(d => d.ClassName == entry.FromClassName))
{
dinoSetting.CanSpawn = !string.IsNullOrWhiteSpace(entry.ToClassName);
dinoSetting.ReplacementClass = dinoSetting.CanSpawn ? entry.ToClassName : dinoSetting.ClassName;
}
}
dinoSettings = this.Where(vi => vi.ClassName == entry.FromClassName).ToArray();
foreach (var dinoSetting in dinoSettings)
else
{
var dinoSetting = CreateDinoSetting(entry.FromClassName, GameData.MOD_UNKNOWN, false, false, true);
dinoSetting.CanSpawn = !string.IsNullOrWhiteSpace(entry.ToClassName);
dinoSetting.ReplacementClass = dinoSetting.CanSpawn ? entry.ToClassName : dinoSetting.ClassName;
this.Add(dinoSetting);
}
}
foreach (var entry in this.TamedDinoClassDamageMultipliers)
foreach (var entry in this.TamedDinoClassDamageMultipliers.Where(e => !string.IsNullOrWhiteSpace(e.ClassName)))
{
if (string.IsNullOrWhiteSpace(entry.ClassName))
continue;
var dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
if (dinoSettings == null || dinoSettings.Length == 0)
if (this.Any(d => d.ClassName == entry.ClassName))
{
this.Add(CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true));
foreach (var dinoSetting in this.Where(d => d.ClassName == entry.ClassName && d.TamedDamageMultiplier != entry.Multiplier))
{
dinoSetting.TamedDamageMultiplier = entry.Multiplier;
}
}
dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
foreach (var dinoSetting in dinoSettings)
else
{
var dinoSetting = CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true);
dinoSetting.TamedDamageMultiplier = entry.Multiplier;
this.Add(dinoSetting);
}
}
foreach(var entry in this.TamedDinoClassResistanceMultipliers)
foreach(var entry in this.TamedDinoClassResistanceMultipliers.Where(e => !string.IsNullOrWhiteSpace(e.ClassName)))
{
if (string.IsNullOrWhiteSpace(entry.ClassName))
continue;
var dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
if (dinoSettings == null || dinoSettings.Length == 0)
if (this.Any(d => d.ClassName == entry.ClassName))
{
this.Add(CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true));
foreach (var dinoSetting in this.Where(d => d.ClassName == entry.ClassName && d.TamedResistanceMultiplier != entry.Multiplier))
{
dinoSetting.TamedResistanceMultiplier = entry.Multiplier;
}
}
dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
foreach (var dinoSetting in dinoSettings)
else
{
var dinoSetting = CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true);
dinoSetting.TamedResistanceMultiplier = entry.Multiplier;
this.Add(dinoSetting);
}
}
foreach (var entry in this.DinoClassDamageMultipliers)
foreach (var entry in this.DinoClassDamageMultipliers.Where(e => !string.IsNullOrWhiteSpace(e.ClassName)))
{
if (string.IsNullOrWhiteSpace(entry.ClassName))
continue;
var dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
if (dinoSettings == null || dinoSettings.Length == 0)
if (this.Any(d => d.ClassName == entry.ClassName))
{
this.Add(CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true));
foreach (var dinoSetting in this.Where(d => d.ClassName == entry.ClassName && d.WildDamageMultiplier != entry.Multiplier))
{
dinoSetting.WildDamageMultiplier = entry.Multiplier;
}
}
dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
foreach (var dinoSetting in dinoSettings)
else
{
var dinoSetting = CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true);
dinoSetting.WildDamageMultiplier = entry.Multiplier;
this.Add(dinoSetting);
}
}
foreach (var entry in this.DinoClassResistanceMultipliers)
foreach (var entry in this.DinoClassResistanceMultipliers.Where(e => !string.IsNullOrWhiteSpace(e.ClassName)))
{
if (string.IsNullOrWhiteSpace(entry.ClassName))
continue;
var dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
if (dinoSettings == null || dinoSettings.Length == 0)
if (this.Any(d => d.ClassName == entry.ClassName))
{
this.Add(CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true));
foreach (var dinoSetting in this.Where(d => d.ClassName == entry.ClassName && d.WildResistanceMultiplier != entry.Multiplier))
{
dinoSetting.WildResistanceMultiplier = entry.Multiplier;
}
}
dinoSettings = this.Where(vi => vi.ClassName == entry.ClassName).ToArray();
foreach (var dinoSetting in dinoSettings)
else
{
var dinoSetting = CreateDinoSetting(entry.ClassName, GameData.MOD_UNKNOWN, false, false, true);
dinoSetting.WildResistanceMultiplier = entry.Multiplier;
this.Add(dinoSetting);
}
}
@ -244,22 +251,9 @@ namespace ServerManagerTool.Lib.ViewModel
!entry.SpawnLimitPercentage.Equals(DinoSpawn.DEFAULT_SPAWN_LIMIT_PERCENTAGE) ||
!entry.SpawnWeightMultiplier.Equals(DinoSpawn.DEFAULT_SPAWN_WEIGHT_MULTIPLIER))
{
var dinoSpawns = this.DinoSpawnWeightMultipliers.Where(d => d.DinoNameTag.Equals(entry.NameTag, StringComparison.OrdinalIgnoreCase)).ToArray();
if (dinoSpawns == null || dinoSpawns.Length == 0)
if (this.DinoSpawnWeightMultipliers.Any(d => d.DinoNameTag.Equals(entry.NameTag, StringComparison.OrdinalIgnoreCase)))
{
this.DinoSpawnWeightMultipliers.Add(new DinoSpawn()
{
ClassName = entry.ClassName,
DinoNameTag = entry.NameTag,
OverrideSpawnLimitPercentage = entry.OverrideSpawnLimitPercentage,
SpawnLimitPercentage = entry.SpawnLimitPercentage,
SpawnWeightMultiplier = entry.SpawnWeightMultiplier
});
}
else
{
foreach (var dinoSpawn in dinoSpawns)
foreach (var dinoSpawn in this.DinoSpawnWeightMultipliers.Where(d => d.DinoNameTag.Equals(entry.NameTag, StringComparison.OrdinalIgnoreCase)))
{
if (entry.SpawnWeightMultiplier != entry.OriginalSpawnWeightMultiplier ||
entry.OverrideSpawnLimitPercentage != entry.OriginalOverrideSpawnLimitPercentage ||
@ -271,6 +265,17 @@ namespace ServerManagerTool.Lib.ViewModel
}
}
}
else
{
this.DinoSpawnWeightMultipliers.Add(new DinoSpawn()
{
ClassName = entry.ClassName,
DinoNameTag = entry.NameTag,
OverrideSpawnLimitPercentage = entry.OverrideSpawnLimitPercentage,
SpawnLimitPercentage = entry.SpawnLimitPercentage,
SpawnWeightMultiplier = entry.SpawnWeightMultiplier
});
}
}
}
@ -287,20 +292,28 @@ namespace ServerManagerTool.Lib.ViewModel
{
// check if the value has changed.
if (!entry.TamedDamageMultiplier.Equals(ClassMultiplier.DEFAULT_MULTIPLIER))
{
this.TamedDinoClassDamageMultipliers.Add(new ClassMultiplier() { ClassName = entry.ClassName, Multiplier = entry.TamedDamageMultiplier });
}
// check if the value has changed.
if (!entry.TamedResistanceMultiplier.Equals(ClassMultiplier.DEFAULT_MULTIPLIER))
{
this.TamedDinoClassResistanceMultipliers.Add(new ClassMultiplier() { ClassName = entry.ClassName, Multiplier = entry.TamedResistanceMultiplier });
}
}
// check if the value has changed.
if (!entry.WildDamageMultiplier.Equals(ClassMultiplier.DEFAULT_MULTIPLIER))
{
this.DinoClassDamageMultipliers.Add(new ClassMultiplier() { ClassName = entry.ClassName, Multiplier = entry.WildDamageMultiplier });
}
// check if the value has changed.
if (!entry.WildResistanceMultiplier.Equals(ClassMultiplier.DEFAULT_MULTIPLIER))
{
this.DinoClassResistanceMultipliers.Add(new ClassMultiplier() { ClassName = entry.ClassName, Multiplier = entry.WildResistanceMultiplier });
}
}
}
}

View file

@ -80,14 +80,13 @@ namespace ServerManagerTool.Lib.ViewModel
if (string.IsNullOrWhiteSpace(entry.EngramClassName))
continue;
var engramSettings = this.Where(vi => vi.EngramClassName == entry.EngramClassName).ToArray();
if (engramSettings == null || engramSettings.Length == 0)
if (!this.Any(vi => vi.EngramClassName == entry.EngramClassName))
{
var engram = GameData.GetEngramForClass(entry.EngramClassName);
this.Add(CreateEngramSetting(entry.EngramClassName, engram?.Mod ?? GameData.MOD_UNKNOWN, engram?.KnownEngram ?? false, engram?.IsTekgram ?? false));
}
engramSettings = this.Where(vi => vi.EngramClassName == entry.EngramClassName).ToArray();
var engramSettings = this.Where(vi => vi.EngramClassName == entry.EngramClassName);
foreach (var engramSetting in engramSettings)
{
engramSetting.EngramLevelRequirement = entry.EngramLevelRequirement;
@ -117,14 +116,13 @@ namespace ServerManagerTool.Lib.ViewModel
if (string.IsNullOrWhiteSpace(entry.EngramClassName))
continue;
var engramSettings = this.Where(vi => vi.EngramClassName == entry.EngramClassName).ToArray();
if (engramSettings == null || engramSettings.Length == 0)
if (!this.Any(vi => vi.EngramClassName == entry.EngramClassName))
{
var engram = GameData.GetEngramForClass(entry.EngramClassName);
this.Add(CreateEngramSetting(entry.EngramClassName, engram?.Mod ?? GameData.MOD_UNKNOWN, engram?.KnownEngram ?? false, engram?.IsTekgram ?? false));
}
engramSettings = this.Where(vi => vi.EngramClassName == entry.EngramClassName).ToArray();
var engramSettings = this.Where(vi => vi.EngramClassName == entry.EngramClassName);
foreach (var engramSetting in engramSettings)
{
engramSetting.EngramAutoUnlock = true;

View file

@ -990,7 +990,7 @@ namespace ServerManagerTool
var zipFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), this.Settings.ProfileID + ".zip");
if (File.Exists(zipFile)) File.Delete(zipFile);
ZipUtils.ZipFiles(zipFile, files.ToArray(), comment.ToString());
ZipUtils.ZipFiles(zipFile, files, comment.ToString());
foreach (var kvp in obfuscateFiles)
{
ZipUtils.ZipAFile(zipFile, kvp.Key, kvp.Value);
@ -1348,37 +1348,37 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var dinoSpawnWeightMultipliers = new AggregateIniValueList<DinoSpawn>(nameof(Server.Profile.DinoSpawnWeightMultipliers), null);
dinoSpawnWeightMultipliers.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{dinoSpawnWeightMultipliers.IniCollectionKey}=")));
dinoSpawnWeightMultipliers.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{dinoSpawnWeightMultipliers.IniCollectionKey}=")));
Server.Profile.DinoSpawnWeightMultipliers.AddRange(dinoSpawnWeightMultipliers);
Server.Profile.DinoSpawnWeightMultipliers.IsEnabled |= dinoSpawnWeightMultipliers.IsEnabled;
var preventDinoTameClassNames = new StringIniValueList(nameof(Server.Profile.PreventDinoTameClassNames), null);
preventDinoTameClassNames.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{preventDinoTameClassNames.IniCollectionKey}=")));
preventDinoTameClassNames.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{preventDinoTameClassNames.IniCollectionKey}=")));
Server.Profile.PreventDinoTameClassNames.AddRange(preventDinoTameClassNames);
Server.Profile.PreventDinoTameClassNames.IsEnabled |= preventDinoTameClassNames.IsEnabled;
var npcReplacements = new AggregateIniValueList<NPCReplacement>(nameof(Server.Profile.NPCReplacements), null);
npcReplacements.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{npcReplacements.IniCollectionKey}=")));
npcReplacements.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{npcReplacements.IniCollectionKey}=")));
Server.Profile.NPCReplacements.AddRange(npcReplacements);
Server.Profile.NPCReplacements.IsEnabled |= npcReplacements.IsEnabled;
var tamedDinoClassDamageMultipliers = new AggregateIniValueList<ClassMultiplier>(nameof(Server.Profile.TamedDinoClassDamageMultipliers), null);
tamedDinoClassDamageMultipliers.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{tamedDinoClassDamageMultipliers.IniCollectionKey}=")));
tamedDinoClassDamageMultipliers.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{tamedDinoClassDamageMultipliers.IniCollectionKey}=")));
Server.Profile.TamedDinoClassDamageMultipliers.AddRange(tamedDinoClassDamageMultipliers);
Server.Profile.TamedDinoClassDamageMultipliers.IsEnabled |= tamedDinoClassDamageMultipliers.IsEnabled;
var tamedDinoClassResistanceMultipliers = new AggregateIniValueList<ClassMultiplier>(nameof(Server.Profile.TamedDinoClassResistanceMultipliers), null);
tamedDinoClassResistanceMultipliers.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{tamedDinoClassResistanceMultipliers.IniCollectionKey}=")));
tamedDinoClassResistanceMultipliers.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{tamedDinoClassResistanceMultipliers.IniCollectionKey}=")));
Server.Profile.TamedDinoClassResistanceMultipliers.AddRange(tamedDinoClassResistanceMultipliers);
Server.Profile.TamedDinoClassResistanceMultipliers.IsEnabled |= tamedDinoClassResistanceMultipliers.IsEnabled;
var dinoClassDamageMultipliers = new AggregateIniValueList<ClassMultiplier>(nameof(Server.Profile.DinoClassDamageMultipliers), null);
dinoClassDamageMultipliers.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{dinoClassDamageMultipliers.IniCollectionKey}=")));
dinoClassDamageMultipliers.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{dinoClassDamageMultipliers.IniCollectionKey}=")));
Server.Profile.DinoClassDamageMultipliers.AddRange(dinoClassDamageMultipliers);
Server.Profile.DinoClassDamageMultipliers.IsEnabled |= dinoClassDamageMultipliers.IsEnabled;
var dinoClassResistanceMultipliers = new AggregateIniValueList<ClassMultiplier>(nameof(Server.Profile.DinoClassResistanceMultipliers), null);
dinoClassResistanceMultipliers.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{dinoClassResistanceMultipliers.IniCollectionKey}=")));
dinoClassResistanceMultipliers.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{dinoClassResistanceMultipliers.IniCollectionKey}=")));
Server.Profile.DinoClassResistanceMultipliers.AddRange(dinoClassResistanceMultipliers);
Server.Profile.DinoClassResistanceMultipliers.IsEnabled |= dinoClassResistanceMultipliers.IsEnabled;
}
@ -1406,7 +1406,8 @@ namespace ServerManagerTool
{
Settings.DinoSettings.RenderToModel();
var iniValues = Settings.DinoSpawnWeightMultipliers.ToIniValues().ToList();
var iniValues = new List<string>();
iniValues.AddRange(Settings.DinoSpawnWeightMultipliers.ToIniValues());
iniValues.AddRange(Settings.PreventDinoTameClassNames.ToIniValues());
iniValues.AddRange(Settings.NPCReplacements.ToIniValues());
iniValues.AddRange(Settings.DinoClassDamageMultipliers.ToIniValues());
@ -1458,7 +1459,7 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var harvestResourceItemAmountClassMultipliers = new AggregateIniValueList<ResourceClassMultiplier>(nameof(Server.Profile.HarvestResourceItemAmountClassMultipliers), null);
harvestResourceItemAmountClassMultipliers.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{harvestResourceItemAmountClassMultipliers.IniCollectionKey}=")));
harvestResourceItemAmountClassMultipliers.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{harvestResourceItemAmountClassMultipliers.IniCollectionKey}=")));
Server.Profile.HarvestResourceItemAmountClassMultipliers.AddRange(harvestResourceItemAmountClassMultipliers);
Server.Profile.HarvestResourceItemAmountClassMultipliers.IsEnabled |= harvestResourceItemAmountClassMultipliers.IsEnabled;
}
@ -1487,7 +1488,7 @@ namespace ServerManagerTool
private void SaveCustomResources_Click(object sender, RoutedEventArgs e)
{
var iniValues = Settings.HarvestResourceItemAmountClassMultipliers.ToIniValues().ToList();
var iniValues = Settings.HarvestResourceItemAmountClassMultipliers.ToIniValues();
var iniValue = string.Join("\r\n", iniValues);
var window = new CommandLineWindow(iniValue);
@ -1686,12 +1687,12 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var overrideNamedEngramEntries = new EngramEntryList(nameof(Server.Profile.OverrideNamedEngramEntries));
overrideNamedEngramEntries.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{overrideNamedEngramEntries.IniCollectionKey}=")));
overrideNamedEngramEntries.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{overrideNamedEngramEntries.IniCollectionKey}=")));
Server.Profile.OverrideNamedEngramEntries.AddRange(overrideNamedEngramEntries);
Server.Profile.OverrideNamedEngramEntries.IsEnabled |= overrideNamedEngramEntries.IsEnabled;
var engramEntryAutoUnlocks = new EngramAutoUnlockList(nameof(Server.Profile.EngramEntryAutoUnlocks));
engramEntryAutoUnlocks.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{engramEntryAutoUnlocks.IniCollectionKey}=")));
engramEntryAutoUnlocks.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{engramEntryAutoUnlocks.IniCollectionKey}=")));
Server.Profile.EngramEntryAutoUnlocks.AddRange(engramEntryAutoUnlocks);
Server.Profile.EngramEntryAutoUnlocks.IsEnabled |= engramEntryAutoUnlocks.IsEnabled;
}
@ -1716,7 +1717,8 @@ namespace ServerManagerTool
Settings.EngramSettings.OnlyAllowSpecifiedEngrams = Settings.OnlyAllowSpecifiedEngrams;
Settings.EngramSettings.RenderToModel();
var iniValues = Settings.OverrideNamedEngramEntries.ToIniValues().ToList();
var iniValues = new List<string>();
iniValues.AddRange(Settings.OverrideNamedEngramEntries.ToIniValues());
iniValues.AddRange(Settings.EngramEntryAutoUnlocks.ToIniValues());
var iniValue = string.Join("\r\n", iniValues);
@ -1790,7 +1792,7 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var configOverrideItemCraftingCosts = new AggregateIniValueList<CraftingOverride>(nameof(Server.Profile.ConfigOverrideItemCraftingCosts), null);
configOverrideItemCraftingCosts.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{configOverrideItemCraftingCosts.IniCollectionKey}=")));
configOverrideItemCraftingCosts.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{configOverrideItemCraftingCosts.IniCollectionKey}=")));
Server.Profile.ConfigOverrideItemCraftingCosts.AddRange(configOverrideItemCraftingCosts);
Server.Profile.ConfigOverrideItemCraftingCosts.IsEnabled |= configOverrideItemCraftingCosts.IsEnabled;
}
@ -1822,7 +1824,8 @@ namespace ServerManagerTool
private void SaveCraftingOverride_Click(object sender, RoutedEventArgs e)
{
var iniValues = Settings.ConfigOverrideItemCraftingCosts.ToIniValues().ToList();
var iniValues = new List<string>();
iniValues.AddRange(Settings.ConfigOverrideItemCraftingCosts.ToIniValues());
var iniValue = string.Join("\r\n", iniValues);
var window = new CommandLineWindow(iniValue);
@ -1898,7 +1901,7 @@ namespace ServerManagerTool
// cycle through the sections, adding them to the custom section list. Will bypass any sections that are named as per the ARK default sections.
foreach (var section in iniFile.Sections.Where(s => !string.IsNullOrWhiteSpace(s.SectionName) && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
Settings.CustomGameUserSettings.Add(section.SectionName, section.KeysToStringArray(), false);
Settings.CustomGameUserSettings.Add(section.SectionName, section.KeysToStringEnumerable(), false);
}
MessageBox.Show(_globalizer.GetResourceString("ServerSettings_LoadCustomConfig_Label"), _globalizer.GetResourceString("ServerSettings_LoadCustomConfig_Title"), MessageBoxButton.OK, MessageBoxImage.Information);
@ -1957,7 +1960,7 @@ namespace ServerManagerTool
// cycle through the sections, adding them to the custom section list. Will bypass any sections that are named as per the ARK default sections.
foreach (var section in iniFile.Sections.Where(s => !string.IsNullOrWhiteSpace(s.SectionName) && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
Settings.CustomGameUserSettings.Add(section.SectionName, section.KeysToStringArray(), false);
Settings.CustomGameUserSettings.Add(section.SectionName, section.KeysToStringEnumerable(), false);
}
}
@ -1980,7 +1983,7 @@ namespace ServerManagerTool
var configIniFile = Path.Combine(ServerProfile.GetProfileServerConfigDir(Settings), Config.Default.ServerGameUserSettingsConfigFile);
// load only this section, using the full exclusion list
var tempServerProfile = ServerProfile.LoadFromINIFiles(configIniFile, null, exclusions.ToArray());
var tempServerProfile = ServerProfile.LoadFromINIFiles(configIniFile, null, exclusions);
// perform a profile sync
Settings.SyncSettings(ServerProfileCategory.CustomGameUserSettings, tempServerProfile);
}
@ -2059,7 +2062,7 @@ namespace ServerManagerTool
// cycle through the sections, adding them to the custom section list. Will bypass any sections that are named as per the ARK default sections.
foreach (var section in iniFile.Sections.Where(s => !string.IsNullOrWhiteSpace(s.SectionName) && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
Settings.CustomGameSettings.Add(section.SectionName, section.KeysToStringArray(), false);
Settings.CustomGameSettings.Add(section.SectionName, section.KeysToStringEnumerable(), false);
}
MessageBox.Show(_globalizer.GetResourceString("ServerSettings_LoadCustomConfig_Label"), _globalizer.GetResourceString("ServerSettings_LoadCustomConfig_Title"), MessageBoxButton.OK, MessageBoxImage.Information);
@ -2118,7 +2121,7 @@ namespace ServerManagerTool
// cycle through the sections, adding them to the custom section list. Will bypass any sections that are named as per the ARK default sections.
foreach (var section in iniFile.Sections.Where(s => !string.IsNullOrWhiteSpace(s.SectionName) && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
Settings.CustomGameSettings.Add(section.SectionName, section.KeysToStringArray(), false);
Settings.CustomGameSettings.Add(section.SectionName, section.KeysToStringEnumerable(), false);
}
}
@ -2141,7 +2144,7 @@ namespace ServerManagerTool
var configIniFile = Path.Combine(ServerProfile.GetProfileServerConfigDir(Settings), Config.Default.ServerGameUserSettingsConfigFile);
// load only this section, using the full exclusion list
var tempServerProfile = ServerProfile.LoadFromINIFiles(configIniFile, null, exclusions.ToArray());
var tempServerProfile = ServerProfile.LoadFromINIFiles(configIniFile, null, exclusions);
// perform a profile sync
Settings.SyncSettings(ServerProfileCategory.CustomGameSettings, tempServerProfile);
}
@ -2220,7 +2223,7 @@ namespace ServerManagerTool
// cycle through the sections, adding them to the custom section list. Will bypass any sections that are named as per the ARK default sections.
foreach (var section in iniFile.Sections.Where(s => !string.IsNullOrWhiteSpace(s.SectionName) && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
Settings.CustomEngineSettings.Add(section.SectionName, section.KeysToStringArray(), false);
Settings.CustomEngineSettings.Add(section.SectionName, section.KeysToStringEnumerable(), false);
}
MessageBox.Show(_globalizer.GetResourceString("ServerSettings_LoadCustomConfig_Label"), _globalizer.GetResourceString("ServerSettings_LoadCustomConfig_Title"), MessageBoxButton.OK, MessageBoxImage.Information);
@ -2279,7 +2282,7 @@ namespace ServerManagerTool
// cycle through the sections, adding them to the custom section list. Will bypass any sections that are named as per the ARK default sections.
foreach (var section in iniFile.Sections.Where(s => !string.IsNullOrWhiteSpace(s.SectionName) && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
Settings.CustomEngineSettings.Add(section.SectionName, section.KeysToStringArray(), false);
Settings.CustomEngineSettings.Add(section.SectionName, section.KeysToStringEnumerable(), false);
}
}
@ -2302,7 +2305,7 @@ namespace ServerManagerTool
var configIniFile = Path.Combine(ServerProfile.GetProfileServerConfigDir(Settings), Config.Default.ServerGameUserSettingsConfigFile);
// load only this section, using the full exclusion list
var tempServerProfile = ServerProfile.LoadFromINIFiles(configIniFile, null, exclusions.ToArray());
var tempServerProfile = ServerProfile.LoadFromINIFiles(configIniFile, null, exclusions);
// perform a profile sync
Settings.SyncSettings(ServerProfileCategory.CustomEngineSettings, tempServerProfile);
}
@ -2693,7 +2696,7 @@ namespace ServerManagerTool
Application.Current.Dispatcher.Invoke(() => this.Cursor = Cursors.Wait);
await Task.Delay(500);
Settings.LoadServerFileAdministrators();
Settings.LoadServerFiles(true, false, false);
}
catch (Exception ex)
{
@ -2714,7 +2717,7 @@ namespace ServerManagerTool
Application.Current.Dispatcher.Invoke(() => this.Cursor = Cursors.Wait);
await Task.Delay(500);
Settings.LoadServerFileExclusive();
Settings.LoadServerFiles(false, true, false);
}
catch (Exception ex)
{
@ -2735,7 +2738,7 @@ namespace ServerManagerTool
Application.Current.Dispatcher.Invoke(() => this.Cursor = Cursors.Wait);
await Task.Delay(500);
Settings.LoadServerFileWhitelisted();
Settings.LoadServerFiles(false, false, true);
}
catch (Exception ex)
{
@ -2919,17 +2922,17 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var configAddNPCSpawnEntriesContainer = new NPCSpawnContainerList<NPCSpawnContainer>(nameof(Server.Profile.ConfigAddNPCSpawnEntriesContainer), NPCSpawnContainerType.Add);
configAddNPCSpawnEntriesContainer.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{configAddNPCSpawnEntriesContainer.IniCollectionKey}=")));
configAddNPCSpawnEntriesContainer.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{configAddNPCSpawnEntriesContainer.IniCollectionKey}=")));
Server.Profile.ConfigAddNPCSpawnEntriesContainer.AddRange(configAddNPCSpawnEntriesContainer);
Server.Profile.ConfigAddNPCSpawnEntriesContainer.IsEnabled |= configAddNPCSpawnEntriesContainer.IsEnabled;
var configSubtractNPCSpawnEntriesContainer = new NPCSpawnContainerList<NPCSpawnContainer>(nameof(Server.Profile.ConfigSubtractNPCSpawnEntriesContainer), NPCSpawnContainerType.Subtract);
configSubtractNPCSpawnEntriesContainer.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{configSubtractNPCSpawnEntriesContainer.IniCollectionKey}=")));
configSubtractNPCSpawnEntriesContainer.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{configSubtractNPCSpawnEntriesContainer.IniCollectionKey}=")));
Server.Profile.ConfigSubtractNPCSpawnEntriesContainer.AddRange(configSubtractNPCSpawnEntriesContainer);
Server.Profile.ConfigSubtractNPCSpawnEntriesContainer.IsEnabled |= configSubtractNPCSpawnEntriesContainer.IsEnabled;
var configOverrideNPCSpawnEntriesContainer = new NPCSpawnContainerList<NPCSpawnContainer>(nameof(Server.Profile.ConfigOverrideNPCSpawnEntriesContainer), NPCSpawnContainerType.Override);
configOverrideNPCSpawnEntriesContainer.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{configOverrideNPCSpawnEntriesContainer.IniCollectionKey}=")));
configOverrideNPCSpawnEntriesContainer.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{configOverrideNPCSpawnEntriesContainer.IniCollectionKey}=")));
Server.Profile.ConfigOverrideNPCSpawnEntriesContainer.AddRange(configOverrideNPCSpawnEntriesContainer);
Server.Profile.ConfigOverrideNPCSpawnEntriesContainer.IsEnabled |= configOverrideNPCSpawnEntriesContainer.IsEnabled;
}
@ -2966,7 +2969,8 @@ namespace ServerManagerTool
{
Settings.NPCSpawnSettings.RenderToModel();
var iniValues = Settings.ConfigAddNPCSpawnEntriesContainer.ToIniValues().ToList();
var iniValues = new List<string>();
iniValues.AddRange(Settings.ConfigAddNPCSpawnEntriesContainer.ToIniValues());
iniValues.AddRange(Settings.ConfigSubtractNPCSpawnEntriesContainer.ToIniValues());
iniValues.AddRange(Settings.ConfigOverrideNPCSpawnEntriesContainer.ToIniValues());
var iniValue = string.Join("\r\n", iniValues);
@ -3123,7 +3127,7 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var configOverrideSupplyCrateItems = new SupplyCrateOverrideList(nameof(Server.Profile.ConfigOverrideSupplyCrateItems));
configOverrideSupplyCrateItems.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{configOverrideSupplyCrateItems.IniCollectionKey}=")));
configOverrideSupplyCrateItems.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{configOverrideSupplyCrateItems.IniCollectionKey}=")));
Server.Profile.ConfigOverrideSupplyCrateItems.AddRange(configOverrideSupplyCrateItems);
Server.Profile.ConfigOverrideSupplyCrateItems.IsEnabled |= configOverrideSupplyCrateItems.IsEnabled;
}
@ -3133,7 +3137,7 @@ namespace ServerManagerTool
RefreshBaseSupplyCrateList();
RefreshBasePrimalItemList();
if (errors.Length > 0)
if (errors.Any())
{
var error = $"The following errors have been found:\r\n\r\n{string.Join("\r\n", errors)}";
@ -3199,7 +3203,8 @@ namespace ServerManagerTool
{
Settings.ConfigOverrideSupplyCrateItems.RenderToModel();
var iniValues = Settings.ConfigOverrideSupplyCrateItems.ToIniValues().ToList();
var iniValues = new List<string>();
iniValues.AddRange(Settings.ConfigOverrideSupplyCrateItems.ToIniValues());
var iniValue = string.Join("\r\n", iniValues);
var window = new CommandLineWindow(iniValue);
@ -3265,7 +3270,7 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var configOverrideItemMaxQuantity = new AggregateIniValueList<StackSizeOverride>(nameof(Server.Profile.ConfigOverrideItemMaxQuantity), null);
configOverrideItemMaxQuantity.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{configOverrideItemMaxQuantity.IniCollectionKey}=")));
configOverrideItemMaxQuantity.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{configOverrideItemMaxQuantity.IniCollectionKey}=")));
Server.Profile.ConfigOverrideItemMaxQuantity.AddRange(configOverrideItemMaxQuantity);
Server.Profile.ConfigOverrideItemMaxQuantity.IsEnabled |= configOverrideItemMaxQuantity.IsEnabled;
}
@ -3274,7 +3279,7 @@ namespace ServerManagerTool
RefreshBasePrimalItemList();
if (errors.Length > 0)
if (errors.Any())
{
var error = $"The following errors have been found:\r\n\r\n{string.Join("\r\n", errors)}";
@ -3301,7 +3306,8 @@ namespace ServerManagerTool
{
Settings.ConfigOverrideItemMaxQuantity.RenderToModel();
var iniValues = Settings.ConfigOverrideItemMaxQuantity.ToIniValues().ToList();
var iniValues = new List<string>();
iniValues.AddRange(Settings.ConfigOverrideItemMaxQuantity.ToIniValues());
var iniValue = string.Join("\r\n", iniValues);
var window = new CommandLineWindow(iniValue);
@ -3365,7 +3371,7 @@ namespace ServerManagerTool
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
var preventTransferForClassNames = new AggregateIniValueList<PreventTransferOverride>(nameof(Server.Profile.PreventTransferForClassNames), null);
preventTransferForClassNames.FromIniValues(section.KeysToStringArray().Where(s => s.StartsWith($"{preventTransferForClassNames.IniCollectionKey}=")));
preventTransferForClassNames.FromIniValues(section.KeysToStringEnumerable().Where(s => s.StartsWith($"{preventTransferForClassNames.IniCollectionKey}=")));
Server.Profile.PreventTransferForClassNames.AddRange(preventTransferForClassNames);
Server.Profile.PreventTransferForClassNames.IsEnabled |= preventTransferForClassNames.IsEnabled;
}
@ -3374,7 +3380,7 @@ namespace ServerManagerTool
RefreshBaseDinoList();
if (errors.Length > 0)
if (errors.Any())
{
var error = $"The following errors have been found:\r\n\r\n{string.Join("\r\n", errors)}";
@ -3401,7 +3407,8 @@ namespace ServerManagerTool
{
Settings.PreventTransferForClassNames.RenderToModel();
var iniValues = Settings.PreventTransferForClassNames.ToIniValues().ToList();
var iniValues = new List<string>();
iniValues.AddRange(Settings.PreventTransferForClassNames.ToIniValues());
var iniValue = string.Join("\r\n", iniValues);
var window = new CommandLineWindow(iniValue);
@ -3442,7 +3449,7 @@ namespace ServerManagerTool
var name = _globalizer.GetResourceString($"Mod_{value}");
newList.Add(new Common.Model.ComboBoxItem(value, name));
var values = GameData.GetDinoSpawns().GroupBy(d => d.Mod).OrderBy(g => g.Key).Select(g => g.Key).ToList();
var values = GameData.GetDinoSpawns().GroupBy(d => d.Mod).OrderBy(g => g.Key).Select(g => g.Key);
foreach (var modValue in values)
{
if (string.IsNullOrWhiteSpace(modValue))
@ -3472,7 +3479,7 @@ namespace ServerManagerTool
var name = _globalizer.GetResourceString($"Mod_{value}");
newList.Add(new Common.Model.ComboBoxItem(value, name));
var values = GameData.GetEngrams().GroupBy(d => d.Mod).OrderBy(g => g.Key).Select(g => g.Key).ToList();
var values = GameData.GetEngrams().GroupBy(d => d.Mod).OrderBy(g => g.Key).Select(g => g.Key);
foreach (var modValue in values)
{
if (string.IsNullOrWhiteSpace(modValue))
@ -3502,7 +3509,7 @@ namespace ServerManagerTool
var name = _globalizer.GetResourceString($"Mod_{value}");
newList.Add(new Common.Model.ComboBoxItem(value, name));
var values = GameData.GetResourceMultipliers().GroupBy(d => d.Mod).OrderBy(g => g.Key).Select(g => g.Key).ToList();
var values = GameData.GetResourceMultipliers().GroupBy(d => d.Mod).OrderBy(g => g.Key).Select(g => g.Key);
foreach (var modValue in values)
{
if (string.IsNullOrWhiteSpace(modValue))

View file

@ -46,15 +46,15 @@ namespace ServerManagerTool.Utils
}
}
public static void AddOfficialMods(IEnumerable<string> modIds)
public static void AddOfficialMods(List<string> modIds)
{
if (OfficialMods == null)
OfficialMods = new List<string>();
if (modIds != null)
{
var modIdsToAdd = modIds.Where(m => !string.IsNullOrWhiteSpace(m) && !OfficialMods.Contains(m)).Distinct().ToList();
if (modIdsToAdd != null && modIdsToAdd.Count > 0)
var modIdsToAdd = modIds.Where(m => !string.IsNullOrWhiteSpace(m) && !OfficialMods.Contains(m)).Distinct();
if (modIdsToAdd.Any())
{
OfficialMods.AddRange(modIdsToAdd);
}
@ -170,14 +170,14 @@ namespace ServerManagerTool.Utils
return string.Empty;
// split the map string into parts, using the '/' separator.
var parts = serverMap.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).ToList();
var parts = serverMap.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
long mapModId;
if (parts.Count == 1 && long.TryParse(parts[0], out mapModId))
if (parts.Length == 1 && long.TryParse(parts[0], out mapModId))
return mapModId.ToString();
// check if any parts were returned.
if (parts.Count != 4)
if (parts.Length != 4)
return string.Empty;
// check if the first two parts match what is expected.
@ -194,12 +194,12 @@ namespace ServerManagerTool.Utils
return string.Empty;
// split the map string into parts, using the '/' separator.
var parts = serverMap.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).ToList();
var parts = serverMap.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
// check if any parts were returned.
if (parts.Count == 1)
if (parts.Length == 1)
return serverMap;
if (parts.Count != 4)
if (parts.Length != 4)
return string.Empty;
// check if the first two parts match what is expected.
@ -496,9 +496,9 @@ namespace ServerManagerTool.Utils
return new List<string>();
// remove all null, empty, duplicate and Official mod ids.
var newModIdList = modIdList.Where(m => !string.IsNullOrWhiteSpace(m) && !IsOfficialMod(m)).Distinct().ToList();
var newModIdList = modIdList.Where(m => !string.IsNullOrWhiteSpace(m) && !IsOfficialMod(m)).Distinct();
return newModIdList;
return newModIdList.ToList();
}
public static void WriteModFile(string fileName, string modId, Dictionary<string, string> metaInformation, List<string> mapNames)

View file

@ -5,7 +5,30 @@
<title>Ark Server Manager Version Feed</title>
<subtitle>This is the Ark Server Manager release version feed.</subtitle>
<link href="http://arkservermanager.freeforums.net/" />
<updated>2021-12-15T00:00:00Z</updated>
<updated>2021-12-16T00:00:00Z</updated>
<entry>
<id>urn:uuid:3E33DCB2-ECFE-4489-B1A4-56F5D386F9DC</id>
<title>1.1.413 (1.1.413.1)</title>
<summary>1.1.413.1</summary>
<link href="" />
<updated>2021-12-16T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Made changes to the code to help improve performance.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:18276A38-2C71-4BB8-9A83-96D5EBFE9C87</id>

View file

@ -5,102 +5,21 @@
<title>Ark Server Manager Version Feed</title>
<subtitle>This is the Ark Server Manager beta version feed.</subtitle>
<link href="http://arkservermanager.freeforums.net/" />
<updated>2021-12-15T00:00:00Z</updated>
<updated>2021-12-16T00:00:00Z</updated>
<entry>
<id>urn:uuid:202642C9-3B71-4B90-8A43-EFA1C5272C81</id>
<title>1.1.412 (1.1.412.4)</title>
<summary>1.1.412.4</summary>
<id>urn:uuid:3E33DCB2-ECFE-4489-B1A4-56F5D386F9DC</id>
<title>1.1.413 (1.1.413.1)</title>
<summary>1.1.413.1</summary>
<link href="" />
<updated>2021-12-15T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<br/>
<ul>
<li>Fixed a bug when starting the server manager and it tries to download steamcmd, but fails as steamcmd is unavailable for download.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:B7DE873D-4FC3-4A7B-A531-3146B4D8639A</id>
<title>1.1.412 (1.1.412.3)</title>
<summary>1.1.412.3</summary>
<link href="" />
<updated>2021-12-15T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<br/>
<ul>
<li>Added additional validation when setting directories in the global setting, to ensure they are rooted correctly.</li>
</ul>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>zh-CN Translation file updated.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:B2056A54-0063-43A9-8E8E-8AD411FFC377</id>
<title>1.1.412 (1.1.412.2)</title>
<summary>1.1.412.2</summary>
<link href="" />
<updated>2021-12-15T00:00:00Z</updated>
<updated>2021-12-16T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Added coloring to the setting grids for the Lost Island DLC engrams, creatures and resources.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:18276A38-2C71-4BB8-9A83-96D5EBFE9C87</id>
<title>1.1.412 (1.1.412.1)</title>
<summary>1.1.412.1</summary>
<link href="" />
<updated>2021-12-15T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<br/>
<ul>
<li>Fixed a bug with the Server Shutdown when the CheckForOnlinePlayers option not selected.</li>
<li>Fixed a bug when the backup path was a root directory that caused a 'Invalid URI: A Dos path must be rooted' crash.</li>
</ul>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>fr-FR Translation file updated.</li>
<li>Added LostIsland to official mods in the SurvivalEvolved gamedata file.</li>
<li>Made changes to the code to help improve performance.</li>
</ul>
</p>
</div>

View file

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
@ -18,29 +19,35 @@ namespace ArkData
/// <returns>The async task context containing the resulting container.</returns>
public static async Task<DataContainer> CreateAsync(string playerFileFolder, string tribeFileFolder)
{
var playerFiles = new string[0];
var tribeFiles = new string[0];
IEnumerable<string> playerFiles = null;
IEnumerable<string> tribeFiles = null;
if (Directory.Exists(playerFileFolder))
{
playerFiles = Directory.GetFiles(playerFileFolder).Where(f => Path.GetFileNameWithoutExtension(f).StartsWith(DataFileDetails.PlayerFilePrefix)
&& Path.GetFileNameWithoutExtension(f).EndsWith(DataFileDetails.PlayerFileSuffix)
&& Path.GetExtension(f).Equals(DataFileDetails.PlayerFileExtension)).ToArray();
&& Path.GetExtension(f).Equals(DataFileDetails.PlayerFileExtension));
}
if (Directory.Exists(tribeFileFolder))
{
tribeFiles = Directory.GetFiles(tribeFileFolder).Where(f => Path.GetFileNameWithoutExtension(f).StartsWith(DataFileDetails.TribeFilePrefix)
&& Path.GetFileNameWithoutExtension(f).EndsWith(DataFileDetails.TribeFileSuffix)
&& Path.GetExtension(f).Equals(DataFileDetails.TribeFileExtension)).ToArray();
&& Path.GetExtension(f).Equals(DataFileDetails.TribeFileExtension));
}
var container = new DataContainer();
foreach (var file in playerFiles)
container.Players.Add(await Parser.ParsePlayerAsync(file));
if (playerFiles != null)
{
foreach (var file in playerFiles)
container.Players.Add(await Parser.ParsePlayerAsync(file));
}
foreach (var file in tribeFiles)
container.Tribes.Add(await Parser.ParseTribeAsync(file));
if (tribeFiles != null)
{
foreach (var file in tribeFiles)
container.Tribes.Add(await Parser.ParseTribeAsync(file));
}
container.LinkPlayerTribe();
@ -58,14 +65,14 @@ namespace ArkData
// need to make multiple calls of 100 steam id's.
var lastSteamUpdateUtc = DateTime.UtcNow;
var startIndex = 0;
var playerSteamIds = Players.Where(p => p.LastPlatformUpdateUtc.AddMinutes(steamUpdateInterval) < DateTime.UtcNow).Select(p => p.PlayerId).ToArray();
var playerSteamIds = Players.Where(p => p.LastPlatformUpdateUtc.AddMinutes(steamUpdateInterval) < DateTime.UtcNow).Select(p => p.PlayerId);
while (true)
{
// check if the start index has exceeded the Players list count.
if (startIndex >= playerSteamIds.Length) break;
if (startIndex >= playerSteamIds.Count()) break;
// get the number of steam ids to read.
int steamIdsCount = System.Math.Min(MAX_STEAM_IDS, playerSteamIds.Length - startIndex);
int steamIdsCount = Math.Min(MAX_STEAM_IDS, playerSteamIds.Count() - startIndex);
// get a comma delimited list of the steam ids to process
var builder = string.Join(",", playerSteamIds, startIndex, steamIdsCount);

View file

@ -45,7 +45,7 @@ namespace ArkData
{
try
{
var online = Enumerable.OfType<PlayerInfo>(new SSQL().Players(new IPEndPoint(IPAddress.Parse(ipString), port))).ToList();
var online = Enumerable.OfType<PlayerInfo>(new SSQL().Players(new IPEndPoint(IPAddress.Parse(ipString), port)));
for (var i = 0; i < Players.Count; i++)
{

View file

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
@ -16,29 +17,35 @@ namespace ArkData
/// </summary>
public static DataContainer Create(string playerFileFolder, string tribeFileFolder)
{
var playerFiles = new string[0];
var tribeFiles = new string[0];
IEnumerable<string> playerFiles = null;
IEnumerable<string> tribeFiles = null;
if (Directory.Exists(playerFileFolder))
{
playerFiles = Directory.GetFiles(playerFileFolder).Where(f => Path.GetFileNameWithoutExtension(f).StartsWith(DataFileDetails.PlayerFilePrefix)
&& Path.GetFileNameWithoutExtension(f).EndsWith(DataFileDetails.PlayerFileSuffix)
&& Path.GetExtension(f).Equals(DataFileDetails.PlayerFileExtension)).ToArray();
&& Path.GetExtension(f).Equals(DataFileDetails.PlayerFileExtension));
}
if (Directory.Exists(tribeFileFolder))
{
tribeFiles = Directory.GetFiles(tribeFileFolder).Where(f => Path.GetFileNameWithoutExtension(f).StartsWith(DataFileDetails.TribeFilePrefix)
&& Path.GetFileNameWithoutExtension(f).EndsWith(DataFileDetails.TribeFileSuffix)
&& Path.GetExtension(f).Equals(DataFileDetails.TribeFileExtension)).ToArray();
&& Path.GetExtension(f).Equals(DataFileDetails.TribeFileExtension));
}
var container = new DataContainer();
foreach (var file in playerFiles)
container.Players.Add(Parser.ParsePlayer(file));
if (playerFiles != null)
{
foreach (var file in playerFiles)
container.Players.Add(Parser.ParsePlayer(file));
}
foreach (var file in tribeFiles)
container.Tribes.Add(Parser.ParseTribe(file));
if (tribeFiles != null)
{
foreach (var file in tribeFiles)
container.Tribes.Add(Parser.ParseTribe(file));
}
container.LinkPlayerTribe();
@ -56,14 +63,14 @@ namespace ArkData
// need to make multiple calls of 100 steam id's.
var lastSteamUpdateUtc = DateTime.UtcNow;
var startIndex = 0;
var playerSteamIds = Players.Where(p => p.LastPlatformUpdateUtc.AddMinutes(steamUpdateInterval) < DateTime.UtcNow).Select(p => p.PlayerId).ToArray();
var playerSteamIds = Players.Where(p => p.LastPlatformUpdateUtc.AddMinutes(steamUpdateInterval) < DateTime.UtcNow).Select(p => p.PlayerId);
while (true)
{
// check if the start index has exceeded the Players list count.
if (startIndex >= playerSteamIds.Length) break;
if (startIndex >= playerSteamIds.Count()) break;
// get the number of steam ids to read.
int steamIdsCount = System.Math.Min(MAX_STEAM_IDS, playerSteamIds.Length - startIndex);
int steamIdsCount = Math.Min(MAX_STEAM_IDS, playerSteamIds.Count() - startIndex);
// get a comma delimited list of the steam ids to process
var builder = string.Join(",", playerSteamIds, startIndex, steamIdsCount);

View file

@ -18,7 +18,7 @@ namespace ArkData
return -1;
}
public static int[] Locate(this byte[] self, byte[] candidate)
public static IEnumerable<int> Locate(this byte[] self, byte[] candidate)
{
if (IsEmptyLocate(self, candidate, 0))
return Empty;
@ -29,7 +29,7 @@ namespace ArkData
list.Add(position);
if (list.Count != 0)
return list.ToArray();
return list;
return Empty;
}

View file

@ -456,8 +456,8 @@ namespace ServerManagerTool.Lib
// BH - commented out until Funcom fix the Online player status column in the world save database
//var gameFile = GetServerWorldFile();
//var playerCount = DataContainer.GetOnlinePlayerCount(gameFile);
var playerInfo = gameServer?.GetPlayers()?.Where(p => !string.IsNullOrWhiteSpace(p.Name?.Trim())).ToList();
var playerCount = playerInfo?.Count ?? -1;
var playerInfo = gameServer?.GetPlayers()?.Where(p => !string.IsNullOrWhiteSpace(p.Name?.Trim()));
var playerCount = playerInfo?.Count() ?? -1;
// check if anyone is logged into the server
if (playerCount <= 0)
@ -1790,7 +1790,7 @@ namespace ServerManagerTool.Lib
comment.AppendLine($"Profile Name: {_profile.ProfileName}");
comment.AppendLine($"Process: {ServerProcess}");
ZipUtils.ZipFiles(backupFile, files.ToArray(), comment.ToString(), false);
ZipUtils.ZipFiles(backupFile, files, comment.ToString(), false);
LogProfileMessage($"Backup file created - {backupFile}");
}
@ -1910,7 +1910,7 @@ namespace ServerManagerTool.Lib
ZipUtils.ZipAFile(backupFile, worldFileName, worldBackupFile, comment.ToString());
if (files.Count > 0)
ZipUtils.UpdateFiles(backupFile, files.ToArray(), null, false, "");
ZipUtils.UpdateFiles(backupFile, files, null, false, "");
LogProfileMessage($"Backed up world files - {saveFolder}");
LogProfileMessage($"Backup file created - {backupFile}");
@ -2851,7 +2851,7 @@ namespace ServerManagerTool.Lib
if (ExitCode == EXITCODE_NORMALEXIT)
{
// get the profile associated with the branch
var profiles = _profiles.Keys.Where(p => p.EnableAutoUpdate && p.BranchName.Equals(branch.BranchName, StringComparison.OrdinalIgnoreCase)).ToArray();
var profiles = _profiles.Keys.Where(p => p.EnableAutoUpdate && p.BranchName.Equals(branch.BranchName, StringComparison.OrdinalIgnoreCase));
var profileExitCodes = new ConcurrentDictionary<ServerProfileSnapshot, int>();
if (Config.Default.AutoUpdate_ParallelUpdate)
@ -3102,7 +3102,7 @@ namespace ServerManagerTool.Lib
if (exitCode == EXITCODE_NORMALEXIT)
{
var branches = _profiles.Keys.Where(p => p.EnableAutoUpdate).Select(p => BranchSnapshot.Create(p)).Distinct(new BranchSnapshotComparer()).ToArray();
var branches = _profiles.Keys.Where(p => p.EnableAutoUpdate).Select(p => BranchSnapshot.Create(p)).Distinct(new BranchSnapshotComparer());
var exitCodes = new ConcurrentDictionary<BranchSnapshot, int>();
// update the server cache for each branch

View file

@ -212,7 +212,7 @@ namespace ServerManagerTool.Lib
return;
// remove any players that do not have a player record.
var droppedPlayers = this._players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null).ToArray();
var droppedPlayers = this._players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null);
foreach (var droppedPlayer in droppedPlayers)
{
_players.TryRemove(droppedPlayer.PlayerId, out PlayerInfo player);

View file

@ -688,8 +688,7 @@ namespace ServerManagerTool.Lib
{
InstallDirectory = folder;
LoadServerFileBlacklisted();
LoadServerFileWhitelisted();
LoadServerFiles(true, true);
SetupServerFilesWatcher();
}
@ -759,8 +758,7 @@ namespace ServerManagerTool.Lib
internal static ServerProfile FromDefaults()
{
var settings = new ServerProfile();
settings.LoadServerFileBlacklisted();
settings.LoadServerFileWhitelisted();
settings.LoadServerFiles(true, true);
settings.SetupServerFilesWatcher();
return settings;
}
@ -794,11 +792,9 @@ namespace ServerManagerTool.Lib
}
}
private static Enum[] GetExclusions()
private static IEnumerable<Enum> GetExclusions()
{
var exclusions = new List<Enum>();
return exclusions.ToArray();
return new List<Enum>();
}
public string GetLauncherFile() => Path.Combine(GetProfileServerConfigDir(), Config.Default.LauncherFile);
@ -887,7 +883,7 @@ namespace ServerManagerTool.Lib
return profile;
}
public static ServerProfile LoadFromConfigFiles(string file, ServerProfile profile, Enum[] exclusions = null)
public static ServerProfile LoadFromConfigFiles(string file, ServerProfile profile, IEnumerable<Enum> exclusions = null)
{
if (string.IsNullOrWhiteSpace(file) || !File.Exists(file))
return null;
@ -949,8 +945,7 @@ namespace ServerManagerTool.Lib
profile = LoadFromConfigFiles(serverConfigFile, profile);
}
profile.LoadServerFileBlacklisted();
profile.LoadServerFileWhitelisted();
profile.LoadServerFiles(true, true);
profile.SetupServerFilesWatcher();
profile._lastSaveLocation = file;
@ -1111,7 +1106,7 @@ namespace ServerManagerTool.Lib
SaveConfigFile(serverConfigDir);
}
public void SaveConfigFile(string configDir, Enum[] exclusions = null)
public void SaveConfigFile(string configDir, IEnumerable<Enum> exclusions = null)
{
if (exclusions == null)
exclusions = GetExclusions();
@ -1536,14 +1531,19 @@ namespace ServerManagerTool.Lib
#region Server Files
private void ServerFilesWatcher_Changed(object sender, FileSystemEventArgs e)
{
var blacklistFile = false;
var whitelistFile = false;
if (e.Name.Equals(Config.Default.ServerBlacklistFile, StringComparison.OrdinalIgnoreCase))
{
TaskUtils.RunOnUIThreadAsync(() => LoadServerFileBlacklisted()).DoNotWait();
blacklistFile = true;
}
if (e.Name.Equals(Config.Default.ServerWhitelistFile, StringComparison.OrdinalIgnoreCase))
{
TaskUtils.RunOnUIThreadAsync(() => LoadServerFileWhitelisted()).DoNotWait();
whitelistFile = true;
}
TaskUtils.RunOnUIThreadAsync(() => LoadServerFiles(blacklistFile, whitelistFile)).DoNotWait();
}
private void ServerFilesWatcher_Error(object sender, ErrorEventArgs e)
@ -1589,58 +1589,58 @@ namespace ServerManagerTool.Lib
_serverFilesWatcher.EnableRaisingEvents = true;
}
public void LoadServerFileBlacklisted()
public void LoadServerFiles(bool blacklistFile, bool whitelistFile)
{
try
{
var list = this.ServerFilesBlacklisted ?? new PlayerUserList();
var list1 = this.ServerFilesBlacklisted ?? new PlayerUserList();
var list2 = this.ServerFilesWhitelisted ?? new PlayerUserList();
var file = Path.Combine(InstallDirectory, Config.Default.SavedFilesRelativePath, Config.Default.ServerBlacklistFile);
if (File.Exists(file))
var allSteamIds = new List<string>();
string[] blacklistSteamIds = null;
string[] whitelistSteamIds = null;
if (blacklistFile)
{
var steamIds = File.ReadAllLines(file);
var steamUsers = SteamUtils.GetSteamUserDetails(steamIds.ToList());
list = PlayerUserList.GetList(steamUsers, steamIds);
var file = Path.Combine(InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ServerBlacklistFile);
if (File.Exists(file))
{
blacklistSteamIds = File.ReadAllLines(file);
allSteamIds.AddRange(blacklistSteamIds);
}
}
this.ServerFilesBlacklisted = list;
}
catch (IOException)
{
// do nothing
if (whitelistFile)
{
var file = Path.Combine(InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ServerWhitelistFile);
if (File.Exists(file))
{
whitelistSteamIds = File.ReadAllLines(file);
allSteamIds.AddRange(whitelistSteamIds);
}
}
// remove all duplicates
allSteamIds = allSteamIds.Distinct().ToList();
// fetch the details of all steam users in the list
var steamUsers = SteamUtils.GetSteamUserDetails(allSteamIds);
if (blacklistFile && blacklistSteamIds != null)
{
list1 = PlayerUserList.GetList(steamUsers, blacklistSteamIds);
}
if (whitelistFile && whitelistSteamIds != null)
{
list2 = PlayerUserList.GetList(steamUsers, whitelistSteamIds);
}
this.ServerFilesBlacklisted = list1;
this.ServerFilesWhitelisted = list2;
}
catch (Exception ex)
{
this.ServerFilesBlacklisted = new PlayerUserList();
MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_ServerFilesLoadErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
public void LoadServerFileWhitelisted()
{
try
{
var list = this.ServerFilesWhitelisted ?? new PlayerUserList();
var file = Path.Combine(InstallDirectory, Config.Default.SavedFilesRelativePath, Config.Default.ServerWhitelistFile);
if (File.Exists(file))
{
var steamIds = File.ReadAllLines(file);
var steamUsers = SteamUtils.GetSteamUserDetails(steamIds.ToList());
list = PlayerUserList.GetList(steamUsers, steamIds);
}
this.ServerFilesWhitelisted = list;
}
catch (IOException)
{
// do nothing
}
catch (Exception ex)
{
this.ServerFilesWhitelisted = new PlayerUserList();
MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_ServerFilesLoadErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
@ -1654,7 +1654,7 @@ namespace ServerManagerTool.Lib
Directory.CreateDirectory(folder);
var file = Path.Combine(folder, Config.Default.ServerBlacklistFile);
File.WriteAllLines(file, this.ServerFilesBlacklisted.ToArray());
File.WriteAllLines(file, this.ServerFilesBlacklisted.ToEnumerable());
}
catch (Exception ex)
{
@ -1671,7 +1671,7 @@ namespace ServerManagerTool.Lib
Directory.CreateDirectory(folder);
var file = Path.Combine(folder, Config.Default.ServerWhitelistFile);
File.WriteAllLines(file, this.ServerFilesWhitelisted.ToArray());
File.WriteAllLines(file, this.ServerFilesWhitelisted.ToEnumerable());
}
catch (Exception ex)
{

View file

@ -450,7 +450,7 @@ namespace ServerManagerTool.Lib
return new List<string>();
// remove any players that do not have a player record.
var droppedPlayers = this._players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null).ToArray();
var droppedPlayers = this._players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null);
foreach (var droppedPlayer in droppedPlayers)
{
_players.TryRemove(droppedPlayer.PlayerId, out PlayerInfo player);

View file

@ -720,7 +720,7 @@ namespace ServerManagerTool
var zipFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), this.Settings.ProfileID + ".zip");
if (File.Exists(zipFile)) File.Delete(zipFile);
ZipUtils.ZipFiles(zipFile, files.ToArray(), comment.ToString());
ZipUtils.ZipFiles(zipFile, files, comment.ToString());
foreach (var kvp in obfuscateFiles)
{
ZipUtils.ZipAFile(zipFile, kvp.Key, kvp.Value);
@ -1130,7 +1130,7 @@ namespace ServerManagerTool
Application.Current.Dispatcher.Invoke(() => this.Cursor = Cursors.Wait);
await Task.Delay(500);
Settings.LoadServerFileBlacklisted();
Settings.LoadServerFiles(true, false);
}
catch (Exception ex)
{
@ -1151,7 +1151,7 @@ namespace ServerManagerTool
Application.Current.Dispatcher.Invoke(() => this.Cursor = Cursors.Wait);
await Task.Delay(500);
Settings.LoadServerFileWhitelisted();
Settings.LoadServerFiles(false, true);
}
catch (Exception ex)
{

View file

@ -86,7 +86,7 @@ namespace ServerManagerTool.Utils
Directory.CreateDirectory(modRootFolder);
// get the a list of the mod file into include in the mod file
var modFileItems = modIdList.Select(m => $"{m}.pak").ToArray();
var modFileItems = modIdList.Select(m => $"{m}.pak");
// create the mod file.
File.WriteAllLines(modListFile, modFileItems);
}

View file

@ -5,7 +5,30 @@
<title>Conan Server Manager Version Feed</title>
<subtitle>This is the Conan Server Manager release version feed.</subtitle>
<link href="http://servermanagers.freeforums.net/" />
<updated>2021-12-15T00:00:00Z</updated>
<updated>2021-12-16T00:00:00Z</updated>
<entry>
<id>urn:uuid:19B09A66-43F2-4D5F-AF33-5C77D7EA9A6B</id>
<title>1.1.58 (1.1.58.1)</title>
<summary>1.1.58.1</summary>
<link href="" />
<updated>2021-12-16T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Made changes to the code to help improve performance.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:6383E79A-C31F-462B-9730-B26B28DC5EFF</id>

View file

@ -5,68 +5,21 @@
<title>Conan Server Manager Version Feed</title>
<subtitle>This is the Conan Server Manager beta version feed.</subtitle>
<link href="http://servermanagers.freeforums.net/" />
<updated>2021-12-15T00:00:00Z</updated>
<updated>2021-12-16T00:00:00Z</updated>
<entry>
<id>urn:uuid:28487F4A-4D0F-4344-A19E-EBD71D230180</id>
<title>1.1.57 (1.1.57.3)</title>
<summary>1.1.57.3</summary>
<id>urn:uuid:19B09A66-43F2-4D5F-AF33-5C77D7EA9A6B</id>
<title>1.1.58 (1.1.58.1)</title>
<summary>1.1.58.1</summary>
<link href="" />
<updated>2021-12-15T00:00:00Z</updated>
<updated>2021-12-16T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Fixed a bug when starting the server manager and it tries to download steamcmd, but fails as steamcmd is unavailable for download.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:6383E79A-C31F-462B-9730-B26B28DC5EFF</id>
<title>1.1.57 (1.1.57.2)</title>
<summary>1.1.57.2</summary>
<link href="" />
<updated>2021-12-15T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<br/>
<ul>
<li>Added additional validation when setting directories in the global setting, to ensure they are rooted correctly.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:6383E79A-C31F-462B-9730-B26B28DC5EFF</id>
<title>1.1.57 (1.1.57.1)</title>
<summary>1.1.57.1</summary>
<link href="" />
<updated>2021-12-15T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<br/>
<ul>
<li>Fixed a bug with the Server Shutdown when the CheckForOnlinePlayers option not selected.</li>
<li>Fixed a bug when the backup path was a root directory that caused a 'Invalid URI: A Dos path must be rooted' crash.</li>
<li>Made changes to the code to help improve performance.</li>
</ul>
</p>
</div>

View file

@ -50,14 +50,7 @@ namespace QueryMaster
//consecutive rcon command replies start with an empty packet
if (BitConverter.ToInt32(recvData[i], 4) == (int)PacketId.Empty)
continue;
//if (recvData[i].Length - BitConverter.ToInt32(recvData[i], 0) == 4)
//{
str.Append(RconUtil.ProcessPacket(recvData[i]).Body);
//}
//else
//{
// str.Append(RconUtil.ProcessPacket(recvData[i]).Body + Util.BytesToString(recvData[++i].Take(recvData[i].Length - 2).ToArray()));
//}
}
}
catch (Exception e)

View file

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace QueryMaster
{

View file

@ -1,10 +1,12 @@
namespace ServerManagerTool.Common.Interfaces
using System.Collections.Generic;
namespace ServerManagerTool.Common.Interfaces
{
public interface IIniSectionCollection
{
IIniValuesCollection[] Sections { get; }
void Add(string sectionName, string[] values);
void Add(string sectionName, IEnumerable<string> values);
void Update();
}

View file

@ -13,7 +13,7 @@ namespace ServerManagerTool.Common.Lib
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
var customAttributes = member.CustomAttributes?.ToArray() ?? new CustomAttributeData[0];
var customAttributes = member.CustomAttributes ?? new CustomAttributeData[0];
if (customAttributes.Any(a => a.AttributeType == typeof(System.Configuration.UserScopedSettingAttribute)))
{
property.ShouldSerialize = instance => { return property.PropertyType.IsValueType || property.PropertyType == typeof(string); };

View file

@ -171,16 +171,15 @@ namespace ServerManagerTool.Common.Model
kvPropertyValue = kvPropertyValue.Substring(0, kvPropertyValue.Length - 1);
}
var collection = property.GetValue(this) as IIniValuesCollection;
if (collection != null)
if (property.GetValue(this) is IIniValuesCollection collection)
{
var values = SplitCollectionValues(kvPropertyValue, DELIMITER);
values = values.Where(v => !string.IsNullOrWhiteSpace(v)).ToArray();
var values = SplitCollectionValues(kvPropertyValue, DELIMITER)
.Where(v => !string.IsNullOrWhiteSpace(v));
if (attr?.ListValueWithinBrackets ?? false)
{
values = values.Select(v => v.Substring(1)).ToArray();
values = values.Select(v => v.Substring(0, v.Length - 1)).ToArray();
values = values.Select(v => v.Substring(1));
values = values.Select(v => v.Substring(0, v.Length - 1));
}
collection.FromIniValues(values);
}
@ -267,7 +266,7 @@ namespace ServerManagerTool.Common.Model
return result.ToString();
}
protected string[] SplitCollectionValues(string valueString, char delimiter)
protected IEnumerable<string> SplitCollectionValues(string valueString, char delimiter)
{
if (string.IsNullOrWhiteSpace(valueString))
return new string[0];
@ -307,7 +306,7 @@ namespace ServerManagerTool.Common.Model
result.Add(tempString.Substring(startIndex));
return result.ToArray();
return result;
}
public void Update(AggregateIniValue other)

View file

@ -59,17 +59,16 @@ namespace ServerManagerTool.Common.Model
public virtual void FromIniValues(IEnumerable<string> iniValues)
{
var items = iniValues?.Select(AggregateIniValue.FromINIValue<T>).ToArray();
var items = iniValues?.Select(AggregateIniValue.FromINIValue<T>);
Clear();
AddRange(items);
IsEnabled = (Count != 0);
IsEnabled = (Count > 0);
// Add any default values which were missing
if (_resetFunc != null)
{
var defaultItemsToAdd = _resetFunc().Where(r => !this.Any(v => v.IsEquivalent(r))).ToArray();
AddRange(defaultItemsToAdd);
AddRange(_resetFunc().Where(r => !this.Any(v => v.IsEquivalent(r))));
}
Sort(AggregateIniValue.SortKeySelector);

View file

@ -1,5 +1,6 @@
using ServerManagerTool.Common.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ServerManagerTool.Common.Model
@ -14,12 +15,12 @@ namespace ServerManagerTool.Common.Model
}
}
public void Add(string sectionName, string[] values)
public void Add(string sectionName, IEnumerable<string> values)
{
Add(sectionName, values, true);
}
public void Add(string sectionName, string[] values, bool clearExisting)
public void Add(string sectionName, IEnumerable<string> values, bool clearExisting)
{
var section = this.Items.FirstOrDefault(s => s.SectionName.Equals(sectionName, StringComparison.OrdinalIgnoreCase) && !s.IsDeleted);
if (section == null)

View file

@ -98,8 +98,7 @@ namespace ServerManagerTool.Common.Model
// Add any default values which were missing
if (this.ResetFunc != null)
{
var defaultItemsToAdd = this.ResetFunc().Where(r => !this.Any(v => this.EquivalencyFunc(v, r))).ToArray();
this.AddRange(defaultItemsToAdd);
this.AddRange(this.ResetFunc().Where(r => !this.Any(v => this.EquivalencyFunc(v, r))));
this.Sort(this.SortKeySelectorFunc);
}
}

View file

@ -1,4 +1,5 @@
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.Serialization;
@ -22,7 +23,7 @@ namespace ServerManagerTool.Common.Model
}
}
public static PlayerUserList GetList(SteamUserDetailResponse response, string[] ids)
public static PlayerUserList GetList(SteamUserDetailResponse response, IEnumerable<string> ids)
{
var result = new PlayerUserList();
if (ids != null)
@ -68,16 +69,15 @@ namespace ServerManagerTool.Common.Model
public void Remove(string steamId)
{
var items = this.Where(i => i.PlayerId.Equals(steamId, System.StringComparison.OrdinalIgnoreCase)).ToArray();
foreach (var item in items)
foreach (var item in this.Where(i => i.PlayerId.Equals(steamId, System.StringComparison.OrdinalIgnoreCase)))
{
this.Remove(item);
}
}
public string[] ToArray()
public IEnumerable<string> ToEnumerable()
{
return this.Select(i => i.PlayerId).ToArray();
return this.Select(i => i.PlayerId);
}
public string ToDelimitedString(string delimiter)

View file

@ -18,7 +18,7 @@ namespace ServerManagerTool.Common.Model
var tableValue = value as VdfTable;
if (tableValue != null && tableValue.Count > 0)
{
var betaKeyItems = tableValue.Where(v => v.Name.Equals("betakey", StringComparison.OrdinalIgnoreCase)).ToArray();
var betaKeyItems = tableValue.Where(v => v.Name.Equals("betakey", StringComparison.OrdinalIgnoreCase));
foreach (var item in betaKeyItems)
{
tableValue.Remove(item);

View file

@ -32,29 +32,38 @@ namespace ServerManagerTool.Common.Serialization
get;
}
public void Deserialize(object obj, Enum[] exclusions)
public void Deserialize(object obj, IEnumerable<Enum> exclusions)
{
var iniFiles = new Dictionary<string, IniFile>();
var fields = obj.GetType().GetProperties().Where(f => f.IsDefined(typeof(BaseIniFileEntryAttribute), false));
var fields = obj.GetType()
.GetProperties()
.Where(f => f.IsDefined(typeof(BaseIniFileEntryAttribute), false));
if (exclusions == null)
{
exclusions = new Enum[0];
}
foreach (var field in fields)
{
var attributes = field.GetCustomAttributes(typeof(BaseIniFileEntryAttribute), false);
foreach (var attr in attributes.OfType<BaseIniFileEntryAttribute>())
var attributes = field
.GetCustomAttributes(typeof(BaseIniFileEntryAttribute), false)
.OfType<BaseIniFileEntryAttribute>()
.Where(a => !exclusions.Contains(a.Category));
foreach (var attr in attributes)
{
if (exclusions.Contains(attr.Category))
{
continue;
}
try
{
if (attr.IsCustom)
{
// this code is to handle custom sections
var collection = field.GetValue(obj) as IIniSectionCollection;
if (collection != null)
if (field.GetValue(obj) is IIniSectionCollection collection)
{
ReadFile(iniFiles, attr.File);
@ -77,61 +86,76 @@ namespace ServerManagerTool.Common.Serialization
}
else
{
var iniValue = ReadValue(iniFiles, attr.File, attr.Section, keyName);
var fieldType = field.PropertyType;
var collection = field.GetValue(obj) as IIniValuesCollection;
if (collection != null)
if (field.GetValue(obj) is IIniValuesCollection collection)
{
var section = ReadSection(iniFiles, attr.File, attr.Section);
var filteredSection = collection.IsArray
? section.Where(s => s.StartsWith(collection.IniCollectionKey + "["))
var filteredSection = collection.IsArray
? section.Where(s => s.StartsWith(collection.IniCollectionKey + "["))
: section.Where(s => s.StartsWith(collection.IniCollectionKey + "="));
collection.FromIniValues(filteredSection);
}
else if (fieldType == typeof(string))
{
var stringValue = iniValue;
if (attr.QuotedString == QuotedStringType.True)
{
// remove the leading and trailing quotes, if any
if (stringValue.StartsWith("\""))
stringValue = stringValue.Substring(1);
if (stringValue.EndsWith("\""))
stringValue = stringValue.Substring(0, stringValue.Length - 1);
}
else if (attr.QuotedString == QuotedStringType.Remove)
{
// remove the leading and trailing quotes, if any
if (stringValue.StartsWith("\""))
stringValue = stringValue.Substring(1);
if (stringValue.EndsWith("\""))
stringValue = stringValue.Substring(0, stringValue.Length - 1);
}
if (attr.Multiline)
{
stringValue = stringValue.Replace(attr.MultilineSeparator, Environment.NewLine);
}
field.SetValue(obj, stringValue);
}
else
{
if (string.IsNullOrWhiteSpace(iniValue))
var iniValue = ReadValue(iniFiles, attr.File, attr.Section, keyName);
var fieldType = field.PropertyType;
if (fieldType == typeof(string))
{
// Skip non-string values which are not found
continue;
var stringValue = iniValue;
if (attr.QuotedString == QuotedStringType.True)
{
// remove the leading and trailing quotes, if any
if (stringValue.StartsWith("\""))
{
stringValue = stringValue.Substring(1);
}
if (stringValue.EndsWith("\""))
{
stringValue = stringValue.Substring(0, stringValue.Length - 1);
}
}
else if (attr.QuotedString == QuotedStringType.Remove)
{
// remove the leading and trailing quotes, if any
if (stringValue.StartsWith("\""))
{
stringValue = stringValue.Substring(1);
}
if (stringValue.EndsWith("\""))
{
stringValue = stringValue.Substring(0, stringValue.Length - 1);
}
}
if (attr.Multiline)
{
stringValue = stringValue.Replace(attr.MultilineSeparator, Environment.NewLine);
}
field.SetValue(obj, stringValue);
}
else
{
if (string.IsNullOrWhiteSpace(iniValue))
{
// Skip non-string values which are not found
continue;
}
// Update the ConditionedOn flag, if this field has one.
if (!string.IsNullOrWhiteSpace(attr.ConditionedOn))
{
var conditionField = obj.GetType().GetProperty(attr.ConditionedOn);
conditionField.SetValue(obj, true);
}
var valueSet = StringUtils.SetPropertyValue(iniValue, obj, field, attr);
if (!valueSet)
{
throw new ArgumentException($"Unexpected field type {fieldType} for INI key {keyName} in section {attr.Section}.");
}
}
// Update the ConditionedOn flag, if this field has one.
if (!string.IsNullOrWhiteSpace(attr.ConditionedOn))
{
var conditionField = obj.GetType().GetProperty(attr.ConditionedOn);
conditionField.SetValue(obj, true);
}
var valueSet = StringUtils.SetPropertyValue(iniValue, obj, field, attr);
if (!valueSet)
throw new ArgumentException($"Unexpected field type {fieldType} for INI key {keyName} in section {attr.Section}.");
}
}
}
@ -144,29 +168,33 @@ namespace ServerManagerTool.Common.Serialization
}
}
public void Serialize(object obj, Enum[] exclusions)
public void Serialize(object obj, IEnumerable<Enum> exclusions)
{
var iniFiles = new Dictionary<string, IniFile>();
var fields = obj.GetType().GetProperties().Where(f => f.IsDefined(typeof(BaseIniFileEntryAttribute), false));
var fields = obj.GetType()
.GetProperties()
.Where(f => f.IsDefined(typeof(BaseIniFileEntryAttribute), false));
if (exclusions == null)
{
exclusions = new Enum[0];
}
foreach (var field in fields)
{
var attributes = field.GetCustomAttributes(typeof(BaseIniFileEntryAttribute), false).OfType<BaseIniFileEntryAttribute>();
var attributes = field
.GetCustomAttributes(typeof(BaseIniFileEntryAttribute), false)
.OfType<BaseIniFileEntryAttribute>()
.Where(a => !exclusions.Contains(a.Category));
foreach (var attr in attributes)
{
if (exclusions.Contains(attr.Category))
continue;
try
{
if (attr.IsCustom)
{
// this code is to handle custom sections
var collection = field.GetValue(obj) as IIniSectionCollection;
if (collection != null)
if (field.GetValue(obj) is IIniSectionCollection collection)
{
collection.Update();
@ -177,7 +205,7 @@ namespace ServerManagerTool.Common.Serialization
if (section.IsEnabled)
{
WriteSection(iniFiles, attr.File, section.IniCollectionKey, section.ToIniValues().ToArray());
WriteSection(iniFiles, attr.File, section.IniCollectionKey, section.ToIniValues());
}
}
}
@ -200,8 +228,7 @@ namespace ServerManagerTool.Common.Serialization
{
var section = ReadSection(iniFiles, attr.File, attr.Section);
var filteredSection = section
.Where(s => !s.StartsWith(collection.IniCollectionKey + (collection.IsArray ? "[" : "=")))
.ToArray();
.Where(s => !s.StartsWith(collection.IniCollectionKey + (collection.IsArray ? "[" : "=")));
WriteSection(iniFiles, attr.File, attr.Section, filteredSection);
}
@ -286,7 +313,7 @@ namespace ServerManagerTool.Common.Serialization
result = result.Concat(collection.ToIniValues());
}
WriteSection(iniFiles, attr.File, attr.Section, result?.ToArray());
WriteSection(iniFiles, attr.File, attr.Section, result);
}
}
else
@ -353,74 +380,94 @@ namespace ServerManagerTool.Common.Serialization
SaveFiles(iniFiles);
}
public string[] ReadSection(Enum iniFile, Enum section)
public IEnumerable<string> ReadSection(Enum iniFile, Enum section)
{
return ReadSection(iniFile, SectionNames[section]);
}
public string[] ReadSection(Enum iniFile, string sectionName)
public IEnumerable<string> ReadSection(Enum iniFile, string sectionName)
{
var file = Path.Combine(this.BasePath, FileNames[iniFile]);
return IniFileUtils.ReadSection(file, sectionName);
}
public void WriteSection(Enum iniFile, Enum section, string[] values)
public void WriteSection(Enum iniFile, Enum section, IEnumerable<string> values)
{
WriteSection(iniFile, SectionNames[section], values);
}
public void WriteSection(Enum iniFile, string sectionName, string[] values)
public void WriteSection(Enum iniFile, string sectionName, IEnumerable<string> values)
{
var file = Path.Combine(this.BasePath, FileNames[iniFile]);
var result = IniFileUtils.WriteSection(file, sectionName, values);
IniFileUtils.WriteSection(file, sectionName, values);
}
private string[] ReadCustomSectionNames(Dictionary<string, IniFile> iniFiles, Enum iniFile)
private IEnumerable<string> ReadCustomSectionNames(Dictionary<string, IniFile> iniFiles, Enum iniFile)
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
return new string[0];
{
ReadFile(iniFiles, iniFile);
return iniFiles[FileNames[iniFile]].Sections.Select(s => s.SectionName).Where(s => !SectionNames.ContainsValue(s)).ToArray();
if (!iniFiles.ContainsKey(FileNames[iniFile]))
{
return new string[0];
}
}
return iniFiles[FileNames[iniFile]].Sections.Select(s => s.SectionName).Where(s => !SectionNames.ContainsValue(s));
}
private string[] ReadSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, Enum section)
private IEnumerable<string> ReadSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, Enum section)
{
return ReadSection(iniFiles, iniFile, SectionNames[section]);
}
private string[] ReadSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, string sectionName)
private IEnumerable<string> ReadSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, string sectionName)
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
return new string[0];
{
ReadFile(iniFiles, iniFile);
return iniFiles[FileNames[iniFile]].GetSection(sectionName)?.KeysToStringArray() ?? new string[0];
if (!iniFiles.ContainsKey(FileNames[iniFile]))
{
return new string[0];
}
}
return iniFiles[FileNames[iniFile]].GetSection(sectionName)?.KeysToStringEnumerable() ?? new string[0];
}
private string ReadValue(Dictionary<string, IniFile> iniFiles, Enum iniFile, Enum section, string keyName)
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
return string.Empty;
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
{
return string.Empty;
}
}
return iniFiles[FileNames[iniFile]].GetKey(SectionNames[section], keyName)?.KeyValue ?? string.Empty;
}
private void WriteSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, Enum section, string[] values)
private void WriteSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, Enum section, IEnumerable<string> values)
{
WriteSection(iniFiles, iniFile, SectionNames[section], values);
}
private void WriteSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, string sectionName, string[] values)
private void WriteSection(Dictionary<string, IniFile> iniFiles, Enum iniFile, string sectionName, IEnumerable<string> values)
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
return;
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
{
return;
}
}
iniFiles[FileNames[iniFile]].WriteSection(sectionName, values);
}
@ -432,10 +479,15 @@ namespace ServerManagerTool.Common.Serialization
private void WriteValue(Dictionary<string, IniFile> iniFiles, Enum iniFile, string sectionName, string keyName, string keyValue)
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
return;
{
ReadFile(iniFiles, iniFile);
if (!iniFiles.ContainsKey(FileNames[iniFile]))
{
return;
}
}
iniFiles[FileNames[iniFile]].WriteKey(sectionName, keyName, keyValue);
}
@ -454,7 +506,7 @@ namespace ServerManagerTool.Common.Serialization
foreach (var iniFile in iniFiles)
{
var file = Path.Combine(this.BasePath, iniFile.Key);
var result = IniFileUtils.SaveToFile(file, iniFile.Value);
IniFileUtils.SaveToFile(file, iniFile.Value);
}
}
}

View file

@ -68,7 +68,7 @@ namespace ServerManagerTool.Common.Serialization
Sections.Remove(section);
}
public bool WriteSection(string sectionName, string[] keysValuePairs)
public bool WriteSection(string sectionName, IEnumerable<string> keysValuePairs)
{
if (sectionName == null)
return false;
@ -186,7 +186,7 @@ namespace ServerManagerTool.Common.Serialization
{
result.AppendLine($"[{section.SectionName}]");
foreach (var keyString in section.KeysToStringArray())
foreach (var keyString in section.KeysToStringEnumerable())
{
result.AppendLine(keyString);
}

View file

@ -41,9 +41,9 @@ namespace ServerManagerTool.Common.Serialization
return Keys?.FirstOrDefault(s => s.KeyName.Equals(keyName, StringComparison.OrdinalIgnoreCase));
}
public string[] KeysToStringArray()
public IEnumerable<string> KeysToStringEnumerable()
{
return Keys.Select(k => k.ToString()).ToArray();
return Keys.Select(k => k.ToString());
}
public void RemoveKey(string keyName)

View file

@ -1,5 +1,6 @@
using ServerManagerTool.Common.Serialization;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
@ -13,13 +14,13 @@ namespace ServerManagerTool.Common.Utils
/// <param name="file">The name of the initialization file.</param>
/// <param name="sectionName">The name of the section in the initialization file.</param>
/// <returns>A string array containing the key name and value pairs associated with the named section.</returns>
public static string[] ReadSection(string file, string sectionName)
public static IEnumerable<string> ReadSection(string file, string sectionName)
{
if (sectionName == null)
return new string[0];
var iniFile = ReadFromFile(file);
return iniFile?.GetSection(sectionName)?.KeysToStringArray() ?? new string[0];
return iniFile?.GetSection(sectionName)?.KeysToStringEnumerable() ?? new string[0];
}
/// <summary>
@ -46,7 +47,7 @@ namespace ServerManagerTool.Common.Utils
/// <param name="sectionName">The name of the section in which data is written.</param>
/// <param name="keysValuePairs">An array of key names and associated values that are to be written to the named section.</param>
/// <returns>True if the function succeeds; otherwise False.</returns>
public static bool WriteSection(string file, string sectionName, string[] keysValuePairs)
public static bool WriteSection(string file, string sectionName, IEnumerable<string> keysValuePairs)
{
if (sectionName == null)
return false;
@ -85,10 +86,14 @@ namespace ServerManagerTool.Common.Utils
public static IniFile ReadFromFile(string file)
{
if (string.IsNullOrWhiteSpace(file))
{
return null;
}
if (!File.Exists(file))
{
return new IniFile();
}
var iniFile = new IniFile();
@ -96,18 +101,24 @@ namespace ServerManagerTool.Common.Utils
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var line = reader.ReadLine().Trim();
if (string.IsNullOrWhiteSpace(line) || line.StartsWith(";") || line.StartsWith("#"))
{
continue;
}
var sectionName = Regex.Match(line, @"(?<=^\[).*(?=\]$)").Value.Trim();
var sectionName = string.Empty;
if (line.StartsWith("[") && line.EndsWith("]"))
{
sectionName = Regex.Match(line, @"(?<=^\[).*(?=\]$)").Value.Trim();
}
var section = iniFile.AddSection(sectionName);
if (section != null)
continue;
iniFile.AddKey(line);
if (section is null)
{
iniFile.AddKey(line);
}
}
reader.Close();
@ -155,7 +166,7 @@ namespace ServerManagerTool.Common.Utils
{
writer.WriteLine($"[{section.SectionName}]");
foreach (var keyString in section.KeysToStringArray())
foreach (var keyString in section.KeysToStringEnumerable())
{
writer.WriteLine(keyString);
}

View file

@ -285,7 +285,7 @@ namespace ServerManagerTool.Common.Utils
}
}
public static BigInteger[] GetProcessorAffinityList()
public static IEnumerable<BigInteger> GetProcessorAffinityList()
{
var processorCount = ProcessorCount;
var results = new List<BigInteger>(processorCount + 1);
@ -295,7 +295,7 @@ namespace ServerManagerTool.Common.Utils
{
results.Add((BigInteger)Math.Pow(2, index));
}
return results.ToArray();
return results;
}
public static string[] GetProcessPriorityList()

View file

@ -49,7 +49,7 @@ namespace ServerManagerTool.Common.Utils
try
{
var filesToDelete = new DirectoryInfo(backupPath).GetFiles($"{settingsFileName}_*{settingsFileExt}").Where(f => f.LastWriteTimeUtc.AddDays(7) < DateTime.UtcNow).ToArray();
var filesToDelete = new DirectoryInfo(backupPath).GetFiles($"{settingsFileName}_*{settingsFileExt}").Where(f => f.LastWriteTimeUtc.AddDays(7) < DateTime.UtcNow);
foreach (var fileToDelete in filesToDelete)
{
try

View file

@ -1,5 +1,6 @@
using Ionic.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@ -68,11 +69,11 @@ namespace ServerManagerTool.Common.Utils
}
}
public static void UpdateFiles(string zipFile, string[] filesToZip, string comment = "", bool preserveDirHierarchy = true, string directoryPathInArchive = "")
public static void UpdateFiles(string zipFile, IEnumerable<string> filesToZip, string comment = "", bool preserveDirHierarchy = true, string directoryPathInArchive = "")
{
if (string.IsNullOrWhiteSpace(zipFile))
throw new ArgumentNullException(nameof(zipFile));
if (filesToZip == null || filesToZip.Length == 0)
if (!filesToZip.Any())
return;
if (!File.Exists(zipFile))
@ -160,11 +161,11 @@ namespace ServerManagerTool.Common.Utils
}
}
public static void ZipFiles(string zipFile, string[] filesToZip, string comment = "", bool preserveDirHierarchy = true, string directoryPathInArchive = "")
public static void ZipFiles(string zipFile, IEnumerable<string> filesToZip, string comment = "", bool preserveDirHierarchy = true, string directoryPathInArchive = "")
{
if (string.IsNullOrWhiteSpace(zipFile))
throw new ArgumentNullException(nameof(zipFile));
if (filesToZip == null || filesToZip.Length == 0)
if (!filesToZip.Any())
throw new ArgumentNullException(nameof(filesToZip));
using (var zip = new ZipFile(zipFile))

View file

@ -277,7 +277,7 @@ namespace ServerManagerTool.Updater
var processes = ProcessUtils.GetProcesses(process.ProcessName, executablePath);
// check if there is more than one instance of the application running
if (processes.Length != 1)
if (processes.Count() != 1)
throw new Exception("The application to be updated has more than one instance running.");
// get the command line of the process

View file

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
@ -83,7 +84,7 @@ namespace ServerManagerTool.Updater
return Process.GetProcessById(processId);
}
public static Process[] GetProcesses(string processName, string executablePath)
public static IEnumerable<Process> GetProcesses(string processName, string executablePath)
{
var runningProcesses = Process.GetProcessesByName(processName).ToList();
@ -95,7 +96,7 @@ namespace ServerManagerTool.Updater
runningProcesses.RemoveAt(i);
}
return runningProcesses.ToArray();
return runningProcesses;
}
public static bool IsAlreadyRunning()