예제 #1
0
        public async Task <int> GetMapsCount(MapsFilterModel filterModel)
        {
            if (filterModel == null)
            {
                filterModel = new MapsFilterModel();
            }

            return(await _legacyContext.Maps.ApplyFilter(filterModel).CountAsync());
        }
예제 #2
0
        public async Task <List <MapDto> > GetMaps(MapsFilterModel filterModel)
        {
            if (filterModel == null)
            {
                filterModel = new MapsFilterModel();
            }

            var maps = await _legacyContext.Maps.ApplyFilter(filterModel).ToListAsync();

            var results = maps.Select(m => m.ToDto(_options.MapRedirectBaseUrl)).ToList();

            return(results);
        }
예제 #3
0
        // ReSharper disable once UnusedMember.Global
        public async Task RunMapRedirectSync([TimerTrigger("0 0 * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogDebug($"Start RunMapRedirectSync @ {DateTime.UtcNow}");

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var gamesToSync = new Dictionary <GameType, string>
            {
                { GameType.CallOfDuty4, "cod4" },
                { GameType.CallOfDuty5, "cod5" }
            };

            foreach (var game in gamesToSync)
            {
                var mapRedirectEntries = _mapRedirectRepository.GetMapEntriesForGame(game.Value);
                var mapsFilterModel    = new MapsFilterModel
                {
                    GameType = game.Key
                };
                var mapDatabaseEntries = await _mapsRepository.GetMaps(mapsFilterModel);

                log.LogDebug("Total maps retrieved from redirect for {game} is {redirectMapCount} and database is {databaseMapCount}", game, mapRedirectEntries.Count, mapDatabaseEntries.Count);

                foreach (var mapDto in mapDatabaseEntries)
                {
                    if (mapRedirectEntries.Any(mre => mre.MapName == mapDto.MapName))
                    {
                        var mapRedirectEntry = mapRedirectEntries.Single(mre => mre.MapName == mapDto.MapName);
                        var mapFiles         = mapRedirectEntry.MapFiles.Where(file => file.EndsWith(".iwd") | file.EndsWith(".ff")).ToList();

                        if (mapFiles.Count != mapDto.MapFiles.Count)
                        {
                            log.LogDebug("Map {MapName} map file count differs", mapDto.MapName);

                            mapDto.MapFiles = mapFiles.Select(mf => new MapFileDto
                            {
                                FileName = mf
                            }).ToList();

                            await _mapsRepository.UpdateMap(mapDto);
                        }
                    }
                    else
                    {
                        if (!_defaultMaps.Contains(mapDto.MapName))
                        {
                            try
                            {
                                if (mapDto.TotalVotes > 0)
                                {
                                    mapDto.MapFiles = new List <MapFileDto>();
                                    await _mapsRepository.UpdateMap(mapDto);
                                }
                                else
                                {
                                    log.LogDebug("Deleting {MapName} as it is not on the redirect", mapDto.MapName);
                                    await _mapsRepository.DeleteMap(mapDto.MapId);
                                }
                            }
                            catch (Exception ex)
                            {
                                log.LogError(ex, "Error deleting map from database");
                            }
                        }
                    }
                }

                foreach (var mapRedirectEntry in mapRedirectEntries)
                {
                    if (mapDatabaseEntries.All(mde => mde.MapName != mapRedirectEntry.MapName))
                    {
                        log.LogDebug("Map {MapName} is missing from the database", mapRedirectEntry.MapName);

                        var mapFiles = mapRedirectEntry.MapFiles.Where(file => file.EndsWith(".iwd") | file.EndsWith(".ff")).ToList();

                        var mapDto = new MapDto
                        {
                            GameType = game.Key,
                            MapName  = mapRedirectEntry.MapName,
                            MapFiles = mapFiles.Select(mf => new MapFileDto
                            {
                                FileName = mf
                            }).ToList()
                        };

                        await _mapsRepository.CreateMap(mapDto);
                    }
                }
            }

            stopWatch.Stop();
            log.LogDebug($"Stop RunMapRedirectSync @ {DateTime.UtcNow} after {stopWatch.ElapsedMilliseconds} milliseconds");
        }
예제 #4
0
        public async Task <IActionResult> GetMapListAjax(GameType?id)
        {
            var reader      = new StreamReader(Request.Body);
            var requestBody = await reader.ReadToEndAsync();

            var model = JsonConvert.DeserializeObject <DataTableAjaxPostModel>(requestBody);

            if (model == null)
            {
                return(BadRequest());
            }

            var filterModel = new MapsFilterModel();

            if (id != null)
            {
                filterModel.GameType = (GameType)id;
            }

            var recordsTotal = await _mapsRepository.GetMapsCount(filterModel);

            filterModel.FilterString = model.Search?.Value;
            var recordsFiltered = await _mapsRepository.GetMapsCount(filterModel);

            filterModel.TakeEntries = model.Length;
            filterModel.SkipEntries = model.Start;

            if (model.Order == null)
            {
                filterModel.Order = MapsFilterModel.OrderBy.MapNameAsc;
            }
            else
            {
                var orderColumn = model.Columns[model.Order.First().Column].Name;
                var searchOrder = model.Order.First().Dir;

                switch (orderColumn)
                {
                case "mapName":
                    filterModel.Order = searchOrder == "asc" ? MapsFilterModel.OrderBy.MapNameAsc : MapsFilterModel.OrderBy.MapNameDesc;
                    break;

                case "popularity":
                    filterModel.Order = searchOrder == "asc" ? MapsFilterModel.OrderBy.LikeDislikeAsc : MapsFilterModel.OrderBy.LikeDislikeDesc;
                    break;

                case "gameType":
                    filterModel.Order = searchOrder == "asc" ? MapsFilterModel.OrderBy.GameTypeAsc : MapsFilterModel.OrderBy.GameTypeDesc;
                    break;
                }
            }

            var mapDtos = await _mapsRepository.GetMaps(filterModel);

            var portalMapDtos = mapDtos.Select(m => new PortalMapDto(m)).ToList();

            return(Json(new
            {
                model.Draw,
                recordsTotal,
                recordsFiltered,
                data = portalMapDtos
            }));
        }
예제 #5
0
        public async Task <IActionResult> ServerInfo(Guid id)
        {
            var gameServer = await _gameServersRepository.GetGameServer(id);

            var gameServerStatusDto = await _gameServerStatusRepository.GetStatus(id, TimeSpan.Zero);

            var serversFilterModel = new GameServerStatusStatsFilterModel
            {
                ServerId = gameServer.ServerId,
                Cutoff   = DateTime.UtcNow.AddDays(-2),
                Order    = GameServerStatusStatsFilterModel.OrderBy.TimestampAsc
            };
            var gameServerStatusStatsDtos = await _gameServerStatusStatsRepository.GetGameServerStatusStats(serversFilterModel);

            var mapTimelineDataPoints = new List <MapTimelineDataPoint>();

            DateTime?timestamp = null;
            string   trackMap  = null;

            if (gameServerStatusStatsDtos.Any())
            {
                var lastItem = gameServerStatusStatsDtos.Last();
                foreach (var item in gameServerStatusStatsDtos.Where(gss => gss.Timestamp > DateTime.UtcNow.AddDays(-1)))
                {
                    if (trackMap == null)
                    {
                        trackMap  = item.MapName;
                        timestamp = item.Timestamp.UtcDateTime;
                    }
                    else
                    {
                        if (item == lastItem)
                        {
                            mapTimelineDataPoints.Add(new MapTimelineDataPoint
                            {
                                MapName = trackMap,
                                Start   = (DateTime)timestamp,
                                Stop    = item.Timestamp.UtcDateTime
                            });
                            continue;
                        }

                        if (trackMap == item.MapName)
                        {
                            continue;
                        }

                        mapTimelineDataPoints.Add(new MapTimelineDataPoint
                        {
                            MapName = trackMap,
                            Start   = (DateTime)timestamp,
                            Stop    = item.Timestamp.UtcDateTime
                        });

                        timestamp = item.Timestamp.UtcDateTime;
                        trackMap  = item.MapName;
                    }
                }
            }

            MapDto map = null;

            if (gameServerStatusDto != null)
            {
                map = await _mapsRepository.GetMap(gameServerStatusDto.GameType, gameServerStatusDto.Map);
            }

            var mapsFilterModel = new MapsFilterModel
            {
                GameType = gameServer.GameType,
                MapNames = gameServerStatusStatsDtos.GroupBy(m => m.MapName).Select(m => m.Key).ToList()
            };
            var maps = await _mapsRepository.GetMaps(mapsFilterModel);

            return(View(new ServerInfoViewModel
            {
                GameServer = gameServer,
                GameServerStatus = gameServerStatusDto,
                Map = map,
                Maps = maps,
                GameServerStatusStats = gameServerStatusStatsDtos,
                MapTimelineDataPoints = mapTimelineDataPoints
            }));
        }
예제 #6
0
        public static IQueryable <Data.Legacy.Models.Maps> ApplyFilter(this IQueryable <Data.Legacy.Models.Maps> maps, MapsFilterModel filterModel)
        {
            maps = maps.Include(m => m.MapFiles).Include(m => m.MapVotes).AsQueryable();

            if (filterModel.GameType != GameType.Unknown)
            {
                maps = maps.Where(m => m.GameType == filterModel.GameType).AsQueryable();
            }

            if (!string.IsNullOrWhiteSpace(filterModel.FilterString))
            {
                maps = maps.Where(m => m.MapName.Contains(filterModel.FilterString)).AsQueryable();
            }

            if (filterModel.MapNames != null)
            {
                maps = maps.Where(m => filterModel.MapNames.Contains(m.MapName)).AsQueryable();
            }

            switch (filterModel.Order)
            {
            case MapsFilterModel.OrderBy.MapNameAsc:
                maps = maps.OrderBy(m => m.MapName).AsQueryable();
                break;

            case MapsFilterModel.OrderBy.MapNameDesc:
                maps = maps.OrderByDescending(m => m.MapName).AsQueryable();
                break;

            case MapsFilterModel.OrderBy.LikeDislikeAsc:
                maps = maps.Where(m => m.MapVotes.Any()).OrderBy(m => m.MapVotes.Count(mv => mv.Like)).AsQueryable();
                break;

            case MapsFilterModel.OrderBy.LikeDislikeDesc:
                maps = maps.Where(m => m.MapVotes.Any()).OrderByDescending(m => m.MapVotes.Count(mv => mv.Like)).AsQueryable();
                break;

            case MapsFilterModel.OrderBy.GameTypeAsc:
                maps = maps.OrderBy(m => m.GameType).AsQueryable();
                break;

            case MapsFilterModel.OrderBy.GameTypeDesc:
                maps = maps.OrderByDescending(m => m.GameType).AsQueryable();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            maps = maps.Skip(filterModel.SkipEntries).AsQueryable();

            if (filterModel.TakeEntries != 0)
            {
                maps = maps.Take(filterModel.TakeEntries).AsQueryable();
            }

            return(maps);
        }