public async Task <bool> SaveMatchToService(MatchViewModel match, Match realmatch) { realmatch.Name = match.Name; realmatch.MapId = match.MapId; realmatch.GameMode = match.GameMode; realmatch.TimeLimit = match.TimeLimit; realmatch.PlayerSlots = match.PlayerSlots; realmatch.ScoreToEnd = match.ScoreToEnd; var gotAnswer = GameModes.HasTeams.TryGetValue(realmatch.GameMode, out var hasTeams); if (gotAnswer) { if (hasTeams) { realmatch.Team0 = await _teamService.FindOne((int)match.Team0Id); realmatch.Team0.TeamSelectedSteamIdentities = (await _teamSelectedSteamIdentityService.FindAllFrom(realmatch.Team0.Id)).ToList(); realmatch.Team1 = await _teamService.FindOne((int)match.Team1Id); realmatch.Team1.TeamSelectedSteamIdentities = (await _teamSelectedSteamIdentityService.FindAllFrom(realmatch.Team1.Id)).ToList(); // Check all steam identities foreach (var team0SelectedSteamIdentity in match.MatchTeam0SelectedSteamIdentitiesStrings) { var tmp = realmatch.Team0.TeamSelectedSteamIdentities.FirstOrDefault(x => x.SteamIdentity.Id.ToString() == team0SelectedSteamIdentity); if (tmp != null) { realmatch.MatchTeam0SelectedSteamIdentities.Add(new MatchTeamSelectedSteamIdentity { matchId = realmatch.Id, SteamIdentityId = team0SelectedSteamIdentity, TeamId = 0, OverWriteRole = tmp.RoleOverwrite }); } else { return(true); } } foreach (var team1SelectedSteamIdentity in match.MatchTeam1SelectedSteamIdentitiesStrings) { var tmp = realmatch.Team1.TeamSelectedSteamIdentities.FirstOrDefault(x => x.SteamIdentity.Id.ToString() == team1SelectedSteamIdentity); if (tmp != null) { realmatch.MatchTeam1SelectedSteamIdentities.Add(new MatchTeamSelectedSteamIdentity { matchId = realmatch.Id, SteamIdentityId = team1SelectedSteamIdentity, TeamId = 1, OverWriteRole = tmp.RoleOverwrite }); } else { return(true); } } } else { foreach (var SelectedSteamIdentity in match.MatchSelectedSteamIdentitiesStrings) { var tmp = await _steamIdentityService.FindOne(SelectedSteamIdentity); if (tmp != null) { realmatch.MatchSelectedSteamIdentities.Add(new MatchSelectedSteamIdentity { matchId = realmatch.Id, SteamIdentityId = SelectedSteamIdentity }); } else { return(true); } } } //When not a server is set!!!! or server already is running a match if (match.PavlovServerId <= 0) { return(true); } realmatch.PavlovServer = await _pavlovServerService.FindOne(match.PavlovServerId); if (realmatch.PavlovServer == null) { return(true); } realmatch.Status = match.Status; } else { return(true); } //Problem if i save here the MatchID upper is not set until its an update:( var bla = await Upsert(realmatch); if (bla) { if (realmatch.MatchSelectedSteamIdentities.Count > 0) { foreach (var matchSelectedSteamIdentity in realmatch.MatchSelectedSteamIdentities) { matchSelectedSteamIdentity.matchId = realmatch.Id; } // First remove Old TeamSelected and Match selected stuff // Then write the new ones await _matchSelectedSteamIdentitiesService.RemoveFromMatch(realmatch.Id); await _matchSelectedSteamIdentitiesService.Upsert(realmatch.MatchSelectedSteamIdentities, match.Id); } if (realmatch.MatchTeam0SelectedSteamIdentities.Count > 0 || realmatch.MatchTeam1SelectedSteamIdentities.Count > 0) { await _matchSelectedTeamSteamIdentitiesService.RemoveFromMatch(realmatch.Id); foreach (var matchTeam0SelectedSteamIdentity in realmatch.MatchTeam0SelectedSteamIdentities) { matchTeam0SelectedSteamIdentity.matchId = realmatch.Id; } foreach (var matchTeam1SelectedSteamIdentity in realmatch.MatchTeam1SelectedSteamIdentities) { matchTeam1SelectedSteamIdentity.matchId = realmatch.Id; } if (realmatch.MatchTeam0SelectedSteamIdentities.Any()) { await _matchSelectedTeamSteamIdentitiesService.Upsert(realmatch.MatchTeam0SelectedSteamIdentities, match.Id, 0); } if (realmatch.MatchTeam1SelectedSteamIdentities.Any()) { await _matchSelectedTeamSteamIdentitiesService.Upsert(realmatch.MatchTeam1SelectedSteamIdentities, match.Id, 1); } } return(true); } return(false); }
public async Task <ConnectionResult> StartMatchWithAuth(RconService.AuthType authType, PavlovServer server, Match match) { var connectionInfo = RconStatic.ConnectionInfoInternal(server.SshServer, authType, out var result); using var clientSsh = new SshClient(connectionInfo); using var clientSftp = new SftpClient(connectionInfo); try { var listOfSteamIdentietiesWhichCanPlay = match.MatchTeam0SelectedSteamIdentities; listOfSteamIdentietiesWhichCanPlay.AddRange(match.MatchTeam1SelectedSteamIdentities); var list = new List <string>(); if (listOfSteamIdentietiesWhichCanPlay.Count <= 0 && match.MatchSelectedSteamIdentities.Count <= 0) { DataBaseLogger.LogToDatabaseAndResultPlusNotify("There are no team members so no match will start!", LogEventLevel.Fatal, _notifyService, result); return(result); } if (match.MatchSelectedSteamIdentities.Count > 0) { list = match.MatchSelectedSteamIdentities .Select(x => Strings.Trim(x.SteamIdentityId)).ToList(); } else if (listOfSteamIdentietiesWhichCanPlay.Count > 0) { list = listOfSteamIdentietiesWhichCanPlay.Select(x => Strings.Trim(x.SteamIdentityId)).ToList(); } list = list.Distinct().ToList(); //GetAllAdminsForTheMatch var mods = new List <string>(); //Todo what if the match is not team based? there are no mods or admins? mods = listOfSteamIdentietiesWhichCanPlay.Where(x => x.OverWriteRole == "Mod" || x.OverWriteRole == "Admin").Select(x => x.SteamIdentityId).ToList(); //Write whitelist and set server settings RconStatic.WriteFile(server.SshServer, server.ServerFolderPath + FilePaths.WhiteList, list.ToArray(), _notifyService); RconStatic.WriteFile(server.SshServer, server.ServerFolderPath + FilePaths.ModList, mods.ToArray(), _notifyService); RconStatic.WriteFile(server.SshServer, server.ServerFolderPath + FilePaths.BanList, Array.Empty <string>(), _notifyService); var oldSettings = new PavlovServerGameIni(); oldSettings.ReadFromFile(server, _notifyService); var serverSettings = new PavlovServerGameIni { bEnabled = true, ServerName = match.Name, MaxPlayers = match.PlayerSlots, bSecured = true, bCustomServer = true, bWhitelist = true, RefreshListTime = 120, LimitedAmmoType = 0, TickRate = 90, TimeLimit = match.TimeLimit, Password = "", BalanceTableURL = "", bVerboseLogging = true, bCompetitive = true, MapRotation = new List <PavlovServerGameIniMap> { new() { MapLabel = match.MapId, GameMode = match.GameMode } }, ApiKey = oldSettings.ApiKey }; var map = await _mapsService.FindOne(match.MapId.Replace("UGC", "")); serverSettings.SaveToFile(server, new[] { new ServerSelectedMap() { Map = map, GameMode = match.GameMode } }, _notifyService); await RconStatic.SystemDStart(server, _pavlovServerService); //StartWatchServiceForThisMatch match.Status = Status.StartetWaitingForPlayer; await Upsert(match); DataBaseLogger.LogToDatabaseAndResultPlusNotify("Start backgroundjob", LogEventLevel.Verbose, _notifyService); BackgroundJob.Enqueue( () => MatchInspector(match.Id)); // ChecjServerState }