예제 #1
0
        public async Task <IActionResult> AppendMatchStats([FromBody] MatchStatsBody matchStats)
        {
            try
            {
                await service.AppendMatchStats(GetApiUserIdentityContainer(), matchStats);

                return(Ok());
            }
            catch (Exception)
            {
                return(Error(new ErrorResult
                {
                    Classification = ErrorClassification.InternalError,
                    Message = "Failed saving match statistics"
                }));
            }
        }
예제 #2
0
        private async Task <List <UpdatedMatchPlayer> > GetMatchPlayersToUpdate(MatchStatsBody matchStats)
        {
            // Find existing match players
            var updatedMatchPlayers =
                await(from mp in this.dbContext.MatchPlayer
                      join ps in matchStats.Players
                      on mp.SteamId equals ps.SteamId
                      where mp.MatchId == matchStats.MatchId
                      select new UpdatedMatchPlayer {
                Model = mp, Body = ps
            })
                .ToListAsync();

            // Find new match players (non existing)
            var newMatchPlayers = matchStats.Players
                                  .Except(updatedMatchPlayers.Select(ump => ump.Body))
                                  .Select(ps => new UpdatedMatchPlayer
            {
                Model = new MatchPlayerModel
                {
                    MatchId = matchStats.MatchId,
                    Name    = ps.GetBase64DecodedName(),
                    SteamId = ps.SteamId
                },
                Body = ps
            }).ToList();

            if (newMatchPlayers.Count > 0)
            {
                // Insert new match players to the DB
                await this.dbContext.MatchPlayer.AddRangeAsync(newMatchPlayers.Select(nmp => nmp.Model));

                // Save the new match players to the DB
                await this.dbContext.SaveChangesAsync();

                // Add the list of new match players to the list of updated match players
                updatedMatchPlayers.AddRange(newMatchPlayers);
            }

            return(updatedMatchPlayers);
        }
예제 #3
0
        public async Task AppendMatchStats(GameServerIdentityContainer apiUserIdentity, MatchStatsBody matchStats)
        {
            await this.dbContext.ValidateGameServerIdentity(apiUserIdentity);

            await this.dbContext.ValidateMatchNotEnded(matchStats.MatchId);

            if (matchStats.Players == null || matchStats.Players.Length == 0)
            {
                return;
            }

            try
            {
                using (var dbTransaction = await this.dbContext.Database.BeginTransactionAsync())
                {
                    var updatedMatchPlayers = await GetMatchPlayersToUpdate(matchStats);

                    foreach (var updatedMatchPlayer in updatedMatchPlayers)
                    {
                        await AppendMatchPlayerWeaponTargets(updatedMatchPlayer);
                    }

                    await this.dbContext.SaveChangesAsync();

                    dbTransaction.Commit();
                }
            }
            catch (Exception e)
            {
                throw new DataException("Failed appending match statistics.");
            }
        }