Пример #1
0
        /// <inheritdoc/>
        public async Task <ResourceQueryHelperResult <StatsInfoResult> > QueryResource(StatsInfoRequest query)
        {
            var result = new ResourceQueryHelperResult <StatsInfoResult>();

            using var context = _contextFactory.CreateContext(enableTracking: false);

            // we need to get the ratings separately because there's not explicit FK
            var ratings = await context.Set <EFClientRatingHistory>()
                          .Where(_ratingHistory => _ratingHistory.ClientId == query.ClientId)
                          .SelectMany(_ratingHistory => _ratingHistory.Ratings.Where(_rating => _rating.ServerId != null && _rating.Newest)
                                      .Select(_rating => new
            {
                _rating.ServerId,
                _rating.Ranking,
                _rating.When
            }))
                          .ToListAsync();

            var iqStats = context.Set <EFClientStatistics>()
                          .Where(_stats => _stats.ClientId == query.ClientId)
                          .Select(_stats => new StatsInfoResult
            {
                Name               = _stats.Client.CurrentAlias.Name,
                ServerId           = _stats.ServerId,
                Kills              = _stats.Kills,
                Deaths             = _stats.Deaths,
                Performance        = Math.Round((_stats.EloRating + _stats.Skill) / 2.0, 2),
                ScorePerMinute     = _stats.SPM,
                LastPlayed         = _stats.Client.LastConnection,
                TotalSecondsPlayed = _stats.TimePlayed,
                ServerGame         = _stats.Server.GameName.ToString(),
                ServerName         = _stats.Server.HostName,
            });

            var queryResults = await iqStats.ToListAsync();

            // add the rating query's results to the full query
            foreach (var eachResult in queryResults)
            {
                var rating = ratings.FirstOrDefault(_rating => _rating.ServerId == eachResult.ServerId);
                eachResult.Ranking    = rating?.Ranking ?? 0;
                eachResult.LastPlayed = rating?.When ?? eachResult.LastPlayed;
            }

            result.Results = queryResults;
            result.RetrievedResultCount = queryResults.Count;
            result.TotalResultCount     = result.RetrievedResultCount;

            return(result);
        }
Пример #2
0
        public async Task Test_StatsController_ClientStats_NotFound()
        {
            var queryResult = new ResourceQueryHelperResult <StatsInfoResult>()
            {
                Results = new List <StatsInfoResult>()
            };

            A.CallTo(() => fakeStatsQueryHelper.QueryResource(A <StatsInfoRequest> .Ignored))
            .Returns(Task.FromResult(queryResult));

            var result = await statsController.ClientStats(1);

            Assert.IsInstanceOf <NotFoundResult>(result);
        }
Пример #3
0
        /// <summary>
        /// find clients matching the given query
        /// </summary>
        /// <param name="query">query filters</param>
        /// <returns></returns>
        public async Task <ResourceQueryHelperResult <FindClientResult> > QueryResource(FindClientRequest query)
        {
            var result = new ResourceQueryHelperResult <FindClientResult>();

            await using var context = _contextFactory.CreateContext(enableTracking: false);

            IQueryable <Data.Models.Client.EFClient> iqClients = null;

            if (!string.IsNullOrEmpty(query.Xuid))
            {
                var networkId = query.Xuid.ConvertGuidToLong(System.Globalization.NumberStyles.HexNumber);
                iqClients = context.Clients.Where(_client => _client.NetworkId == networkId);
            }

            else if (!string.IsNullOrEmpty(query.Name))
            {
                iqClients = context.Clients
                            .Where(_client =>
                                   EF.Functions.Like(_client.CurrentAlias.Name.ToLower(), $"%{query.Name.ToLower()}%"));
            }

            if (query.Direction == SortDirection.Ascending)
            {
                iqClients = iqClients.OrderBy(_client => _client.LastConnection);
            }

            else
            {
                iqClients = iqClients.OrderByDescending(_client => _client.LastConnection);
            }

            var queryResults = await iqClients
                               .Select(_client => new FindClientResult
            {
                ClientId = _client.ClientId,
                Xuid     = _client.NetworkId.ToString("X"),
                Name     = _client.CurrentAlias.Name
            })
                               .Skip(query.Offset)
                               .Take(query.Count)
                               .ToListAsync();

            result.TotalResultCount = await iqClients.CountAsync();

            result.Results = queryResults;
            result.RetrievedResultCount = queryResults.Count;

            return(result);
        }
Пример #4
0
        public async Task Test_StatsController_ClientStats_Happy()
        {
            var client = ClientGenerators.CreateBasicClient(null);

            var query = new StatsInfoRequest
            {
                ClientId = client.ClientId
            };

            var queryResult = new ResourceQueryHelperResult <StatsInfoResult>()
            {
                Results = new[]
                {
                    new StatsInfoResult
                    {
                        Deaths             = 1,
                        Kills              = 1,
                        LastPlayed         = DateTime.Now,
                        Performance        = 100,
                        Ranking            = 10,
                        ScorePerMinute     = 500,
                        ServerGame         = "IW4",
                        ServerId           = 123,
                        ServerName         = "IW4Host",
                        TotalSecondsPlayed = 100
                    }
                },
                TotalResultCount     = 1,
                RetrievedResultCount = 1
            };

            A.CallTo(() => fakeStatsQueryHelper.QueryResource(A <StatsInfoRequest> .Ignored))
            .Returns(Task.FromResult(queryResult));

            var result = await statsController.ClientStats(query.ClientId.Value);

            Assert.IsInstanceOf <OkObjectResult>(result);

            var viewResult = (result as OkObjectResult).Value as IEnumerable <StatsInfoResult>;

            Assert.NotNull(viewResult);
            Assert.AreEqual(queryResult.Results, viewResult);
        }
Пример #5
0
        /// <inheritdoc/>
        public async Task <ResourceQueryHelperResult <MessageResponse> > QueryResource(ChatSearchQuery query)
        {
            if (query == null)
            {
                throw new ArgumentException("Query must be specified");
            }

            var result = new ResourceQueryHelperResult <MessageResponse>();

            await using var context = _contextFactory.CreateContext(enableTracking: false);

            if (serverCache == null)
            {
                serverCache = await context.Set <EFServer>().ToListAsync();
            }

            if (int.TryParse(query.ServerId, out int serverId))
            {
                query.ServerId = serverCache.FirstOrDefault(_server => _server.ServerId == serverId)?.EndPoint ?? query.ServerId;
            }

            var iqMessages = context.Set <EFClientMessage>()
                             .Where(_message => _message.TimeSent >= query.SentAfter)
                             .Where(_message => _message.TimeSent < query.SentBefore);

            if (query.ClientId != null)
            {
                iqMessages = iqMessages.Where(_message => _message.ClientId == query.ClientId.Value);
            }

            if (query.ServerId != null)
            {
                iqMessages = iqMessages.Where(_message => _message.Server.EndPoint == query.ServerId);
            }

            if (!string.IsNullOrEmpty(query.MessageContains))
            {
                iqMessages = iqMessages.Where(_message => EF.Functions.Like(_message.Message.ToLower(), $"%{query.MessageContains.ToLower()}%"));
            }

            var iqResponse = iqMessages
                             .Select(_message => new MessageResponse
            {
                ClientId   = _message.ClientId,
                ClientName = query.IsProfileMeta ? "" : _message.Client.CurrentAlias.Name,
                ServerId   = _message.ServerId,
                When       = _message.TimeSent,
                Message    = _message.Message,
                ServerName = query.IsProfileMeta ? "" : _message.Server.HostName,
                GameName   = _message.Server.GameName == null ? Server.Game.IW4 : (Server.Game)_message.Server.GameName.Value,
                SentIngame = _message.SentIngame
            });

            if (query.Direction == SharedLibraryCore.Dtos.SortDirection.Descending)
            {
                iqResponse = iqResponse.OrderByDescending(_message => _message.When);
            }

            else
            {
                iqResponse = iqResponse.OrderBy(_message => _message.When);
            }

            var resultList = await iqResponse
                             .Skip(query.Offset)
                             .Take(query.Count)
                             .ToListAsync();

            foreach (var message in resultList)
            {
                message.IsHidden = serverCache.Any(server => server.ServerId == message.ServerId && server.IsPasswordProtected);

                if (!message.Message.IsQuickMessage())
                {
                    continue;
                }

                try
                {
                    var quickMessages = _defaultSettings
                                        .QuickMessages
                                        .First(_qm => _qm.Game == message.GameName);
                    message.Message        = quickMessages.Messages[message.Message.Substring(1)];
                    message.IsQuickMessage = true;
                }
                catch
                {
                    message.Message = message.Message.Substring(1);
                }
            }

            result.TotalResultCount = await iqResponse.CountAsync();

            result.Results = resultList;
            result.RetrievedResultCount = resultList.Count;

            return(result);
        }