private async Task HandleFiles(GameServerConfiguration gsc, IFormFile modsetFile, IFormFile missionFile) { if (missionFile != null) { gsc.ServerMission = _service.UploadMissionFile(missionFile, gsc.GameServer); } if (modsetFile != null) { var modset = new Modset(); var errors = await _service.ParseArma3Modset(modset, modsetFile); if (!string.IsNullOrEmpty(errors)) { ModelState.AddModelError("ModsetID", errors); return; } await GetOrCreateModset(gsc, modset); } if (gsc.ModsetID != null) { var actualModset = await _context.Modsets.FindAsync(gsc.ModsetID.Value); var errors = _service.ValidateModsetOnServer(actualModset, gsc.GameServer); if (!string.IsNullOrEmpty(errors)) { ModelState.AddModelError("ModsetID", errors); return; } } }
public static Modset CopyModset(Modset modset) { return(new Modset { LastUpdatedAt = modset.LastUpdatedAt, Mods = modset.Mods.ToHashSet(), Dlcs = modset.Dlcs.ToHashSet(), Name = modset.Name, WebId = modset.WebId }); }
public async Task <IActionResult> Create([Bind("Label")] Modset modset, IFormFile data) { await _service.ParseArma3Modset(modset, data); if (ModelState.IsValid) { modset.GameType = GameServerType.Arma3; modset.AccessToken = GameServerService.GenerateToken(); modset.Label = modset.Label ?? modset.Name; _context.Add(modset); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View(modset)); }
internal string ValidateModsetOnServer(Modset actualModset, GameServer server) { var config = GetConfig(server); using (var client = GetSftpClient(config.Server)) { client.ConnectionInfo.Timeout = TimeSpan.FromMilliseconds(1000); client.Connect(); var analyze = AnalyseModsetFile(config, XDocument.Parse(actualModset.DefinitionFile), client); client.Disconnect(); if (analyze.Any(m => !m.IsOK)) { return(ToErrorMessage(analyze)); } return(null); } }
public static Modset CreateTestModsetWithModsOfOneType( Fixture fixture, ModType modType, int modsNumber = 5) { var modset = new Modset { Mods = new HashSet <IMod>() }; for (var i = 0; i < modsNumber; i++) { modset.Mods.Add(ModHelpers.CreateTestMod(fixture, modType)); } return(modset); }
public async Task <IActionResult> Edit(int id, [Bind("ModsetID,Label")] Modset modset, IFormFile data) { if (id != modset.ModsetID) { return(NotFound()); } if (ModelState.IsValid) { try { var previous = await _context.Modsets.AsNoTracking().FirstOrDefaultAsync(m => m.ModsetID == id); modset.AccessToken = previous.AccessToken; if (data == null) { modset.DefinitionFile = previous.DefinitionFile; modset.Count = previous.Count; modset.ConfigurationFile = previous.ConfigurationFile; modset.LastUpdate = previous.LastUpdate; modset.Name = previous.Name; } else { await _service.ParseArma3Modset(modset, data); } _context.Update(modset); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ModsetExists(modset.ModsetID)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } return(View(modset)); }
public void RequiredMods_ModsAndDlcs_Matches() { var modsList = ModHelpers.CreateModsList(_fixture); var dlcsList = DlcHelpers.CreateDlcsList(_fixture); var expectedCombinedList = modsList .Where(x => x.Type == ModType.Required) .Concat(dlcsList) .ToList(); var modset = new Modset { Mods = modsList.Cast <IMod>().ToHashSet(), Dlcs = dlcsList.ToHashSet() }; modset.RequiredMods.Should().BeEquivalentTo(expectedCombinedList); }
internal async Task <string> ParseArma3Modset(Modset modset, IFormFile data) { using (var reader = new StreamReader(data.OpenReadStream(), Encoding.UTF8)) { modset.DefinitionFile = await reader.ReadToEndAsync(); } modset.GameType = GameServerType.Arma3; modset.LastUpdate = DateTime.Now; var doc = XDocument.Parse(modset.DefinitionFile); modset.Count = doc.Descendants("tr").Attributes("data-type").Where(a => a.Value == "ModContainer").Count(); modset.Name = doc.Descendants("meta").Where(m => m.Attribute("name").Value == "arma:PresetName").Select(m => m.Attribute("content").Value).FirstOrDefault(); var analyze = AnalyseModsetFile(null, doc, null); if (!analyze.Any(m => m.IsOK)) { return(ToErrorMessage(analyze)); } modset.ConfigurationFile = string.Join(";", analyze.Select(m => "@" + m.Id)); return(null); }
private async Task GetOrCreateModset(GameServerConfiguration gsc, Modset modset) { var existing = await _context.Modsets.FirstOrDefaultAsync(m => m.Name == modset.Name && m.ConfigurationFile == modset.ConfigurationFile); if (existing != null) { gsc.Modset = existing; gsc.ModsetID = existing.ModsetID; } else { modset.GameType = GameServerType.Arma3; modset.AccessToken = GameServerService.GenerateToken(); modset.Label = modset.Name; _context.Add(modset); await _context.SaveChangesAsync(); gsc.Modset = modset; gsc.ModsetID = modset.ModsetID; } }
public static Modset CreateTestModset( Fixture fixture, string?modsDirectory = null, int eachModTypeNumber = 5) { var modset = new Modset { Mods = new HashSet <IMod>(), Dlcs = new HashSet <Dlc>(), LastUpdatedAt = fixture.Create <DateTime>(), Name = fixture.Create <string>(), WebId = fixture.Create <string>() }; for (var i = 0; i < eachModTypeNumber; i++) { modset.Mods.Add(ModHelpers.CreateTestMod(fixture, ModType.ServerSide, modsDirectory)); modset.Mods.Add(ModHelpers.CreateTestMod(fixture, ModType.ClientSide, modsDirectory)); modset.Mods.Add(ModHelpers.CreateTestMod(fixture, ModType.Optional, modsDirectory)); modset.Mods.Add(ModHelpers.CreateTestMod(fixture, ModType.Required, modsDirectory)); } return(modset); }