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;
                }
            }
        }
Пример #2
0
 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
     });
 }
Пример #3
0
        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));
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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));
        }
Пример #7
0
        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);
        }
Пример #8
0
        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;
            }
        }
Пример #10
0
        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);
        }