Ejemplo n.º 1
0
        public async Task <ServerStatusAllViewModel> Get()
        {
            var demoMode = IsDemoMode() ? new DemoMode() : null;

            var anonymize = _config.AnonymizeWebApiData;
            var user      = WebApiHelper.GetUser(Request, _config);

            if (anonymize)
            {
                var serverContext = _contextManager.Servers.FirstOrDefault();
                var player        = serverContext?.Players.Where(x =>
                                                                 x.Tribe != null &&
                                                                 x.Tribe.Creatures.Any(y => y.IsBaby) &&
                                                                 x.Tribe.Structures.OfType <ArkStructureCropPlot>().Any() &&
                                                                 x.Tribe.Structures.OfType <ArkStructureElectricGenerator>().Any()
                                                                 ).OrderByDescending(x => x.Creatures.Length).FirstOrDefault();

                if (player == null)
                {
                    user = null;
                }
                else
                {
                    user.Name    = player.Name;
                    user.SteamId = player.SteamId;
                    user.Roles   = _config.AccessControl.SelectMany(x => x.Value.Values)
                                   .SelectMany(x => x)
                                   .Distinct(StringComparer.OrdinalIgnoreCase)
                                   .OrderBy(x => x)
                                   .ToArray();
                }
            }

            var result = new ServerStatusAllViewModel {
                User = user, AccessControl = BuildViewModelForAccessControl(_config)
            };

            foreach (var context in _contextManager.Servers)
            {
                var serverContext = _contextManager.GetServer(context.Config.Key);
                var status        = serverContext.Steam.GetServerStatusCached();
                //if (status == null || status.Item1 == null || status.Item2 == null)
                //{
                //    //Server status is currently unavailable
                //}
                //else
                //{
                var info        = status?.Item1;
                var rules       = status?.Item2;
                var playerinfos = status?.Item3;

                var m                  = info != null ? new Regex(@"^(?<name>.+?)\s+-\s+\(v(?<version>\d+\.\d+)\)?$", RegexOptions.IgnoreCase | RegexOptions.Singleline).Match(info.Name) : null;
                var name               = m?.Success == true ? m.Groups["name"].Value : (info?.Name ?? context.Config.Key);
                var version            = m?.Success == true ? m.Groups["version"] : null;
                var currentTime        = rules?.FirstOrDefault(x => x.Name == "DayTime_s")?.Value;
                var tamedDinosCount    = context.TamedCreatures?.Count();
                var uploadedDinosCount = context.CloudCreatures?.Count();
                var wildDinosCount     = context.WildCreatures?.Count();
                //var tamedDinosMax = 6000; //todo: remove hardcoded value
                var structuresCount = context.Structures?.Count();
                var totalPlayers    = context.Players?.Count();
                var totalTribes     = context.Tribes?.Count();
                var serverStarted   = _serverService.GetServerStartTime(context.Config.Key);

                var nextUpdate       = context.ApproxTimeUntilNextUpdate;
                var nextUpdateTmp    = nextUpdate?.ToStringCustom();
                var nextUpdateString = (nextUpdate.HasValue ? (!string.IsNullOrWhiteSpace(nextUpdateTmp) ? $"~{nextUpdateTmp}" : "waiting for new update ...") : null);
                var lastUpdate       = context.LastUpdate;
                var lastUpdateString = lastUpdate.ToStringWithRelativeDay();

                var anonymizedServer = anonymize ? _anonymizeData.GetServer(context.Config.Key) : null;
                var sr = new ServerStatusViewModel
                {
                    Key                = anonymizedServer?.Key ?? context.Config.Key,
                    Name               = anonymizedServer?.Name ?? name,
                    Address            = anonymizedServer?.Address ?? context.Config.DisplayAddress ?? info?.Address,
                    Version            = version?.ToString(),
                    OnlinePlayerCount  = info?.Players ?? 0,
                    OnlinePlayerMax    = info?.MaxPlayers ?? 0,
                    MapName            = info?.Map,
                    InGameTime         = currentTime,
                    TamedCreatureCount = tamedDinosCount ?? 0,
                    CloudCreatureCount = uploadedDinosCount ?? 0,
                    WildCreatureCount  = wildDinosCount ?? 0,
                    StructureCount     = structuresCount ?? 0,
                    PlayerCount        = totalPlayers ?? 0,
                    TribeCount         = totalTribes ?? 0,
                    LastUpdate         = lastUpdateString,
                    NextUpdate         = nextUpdateString,
                    ServerStarted      = serverStarted
                };

                if (HasFeatureAccess("home", "online"))
                {
                    var onlineplayers = playerinfos?.Where(x => !string.IsNullOrEmpty(x.Name)).ToArray() ?? new PlayerInfo[] { };
                    if (anonymize)
                    {
                        int n = 0;
                        foreach (var player in context.Players.OrderByDescending(x => x.LastActiveTime).Take(onlineplayers.Length))
                        {
                            sr.OnlinePlayers.Add(new OnlinePlayerViewModel
                            {
                                SteamName         = player.Name,
                                CharacterName     = player.CharacterName,
                                TribeName         = player.Tribe?.Name,
                                DiscordName       = null,
                                TimeOnline        = onlineplayers[n].Time.ToStringCustom(),
                                TimeOnlineSeconds = (int)Math.Round(onlineplayers[n].Time.TotalSeconds)
                            });

                            n++;
                        }
                    }
                    else
                    {
                        using (var db = _databaseContextFactory.Create())
                        {
                            // Names of online players (steam does not provide ids)
                            var onlineplayerNames = onlineplayers.Select(x => x.Name).ToArray();

                            // Get the player data for each name (null when no matching name or when multiple players share the same name)
                            var onlineplayerData = context.Players != null ? (from k in onlineplayerNames join p in context.Players on k equals p.Name into grp select grp.Count() == 1 ? grp.ElementAt(0) : null).ToArray() : new ArkPlayer[] { };

                            // Parse all steam ids
                            var parsedSteamIds = onlineplayerData.Select(x => { long steamId; return(x?.SteamId != null ? long.TryParse(x.SteamId, out steamId) ? steamId : (long?)null : null); }).ToArray();

                            // Get the player data for each name
                            var databaseUsers = (from k in parsedSteamIds join u in db.Users on k equals u?.SteamId into grp select grp.FirstOrDefault()).ToArray();

                            // Get the discord users
                            var discordUsers = databaseUsers.Select(x => x != null ? _discordManager.GetDiscordUserNameById((ulong)x.DiscordId) : null).ToArray();

                            int n = 0;
                            foreach (var player in onlineplayers)
                            {
                                var extra          = onlineplayerData.Length > n ? new { player = onlineplayerData[n], user = databaseUsers[n], discordName = discordUsers[n] } : null;
                                var demoPlayerName = demoMode?.GetPlayerName();

                                sr.OnlinePlayers.Add(new OnlinePlayerViewModel
                                {
                                    SteamName         = demoPlayerName ?? player.Name,
                                    CharacterName     = demoPlayerName ?? extra?.player?.CharacterName,
                                    TribeName         = demoMode?.GetTribeName() ?? extra?.player?.Tribe?.Name,
                                    DiscordName       = demoMode != null ? null : extra?.discordName,
                                    TimeOnline        = player.Time.ToStringCustom(),
                                    TimeOnlineSeconds = (int)Math.Round(player.Time.TotalSeconds)
                                });

                                n++;
                            }
                        }
                    }
                }
                else
                {
                    sr.OnlinePlayers = null;
                }

                result.Servers.Add(sr);
                //}
            }

            foreach (var context in _contextManager.Clusters)
            {
                var cc = new ClusterStatusViewModel
                {
                    Key        = context.Config.Key,
                    ServerKeys = _contextManager.Servers
                                 .Where(x => x.Config.ClusterKey.Equals(context.Config.Key, StringComparison.OrdinalIgnoreCase))
                                 .Select(x => x.Config.Key).ToArray()
                };
                result.Clusters.Add(cc);
            }

            return(result);
        }
Ejemplo n.º 2
0
        public async Task <ServerStatusAllViewModel> Get()
        {
            var result = new ServerStatusAllViewModel();

            foreach (var context in _contextManager.Servers)
            {
                var serverContext = _contextManager.GetServer(context.Config.Key);
                var status        = serverContext.Steam.GetServerStatusCached();
                if (status == null || status.Item1 == null || status.Item2 == null)
                {
                    //Server status is currently unavailable
                }
                else
                {
                    var info        = status.Item1;
                    var rules       = status.Item2;
                    var playerinfos = status.Item3;

                    var m               = new Regex(@"^(?<name>.+?)\s+-\s+\(v(?<version>\d+\.\d+)\)$", RegexOptions.IgnoreCase | RegexOptions.Singleline).Match(info.Name);
                    var name            = m.Success ? m.Groups["name"].Value : info.Name;
                    var version         = m.Success ? m.Groups["version"] : null;
                    var currentTime     = rules.FirstOrDefault(x => x.Name == "DayTime_s")?.Value;
                    var tamedDinosCount = context.TamedCreatures?.Count();
                    //var uploadedDinosCount = _context.Cluster?.Creatures?.Count();
                    var wildDinosCount = context.WildCreatures?.Count();
                    //var tamedDinosMax = 6000; //todo: remove hardcoded value
                    var structuresCount = context.Structures?.Count();
                    var totalPlayers    = context.Players?.Count();
                    var totalTribes     = context.Tribes?.Count();

                    //server uptime
                    //DateTime? serverStarted = null;
                    //try
                    //{
                    //    serverStarted = Process.GetProcessesByName(_constants.ArkServerProcessName)?.FirstOrDefault()?.StartTime;

                    //}
                    //catch { /* ignore exceptions */ }

                    var nextUpdate       = context.ApproxTimeUntilNextUpdate;
                    var nextUpdateTmp    = nextUpdate?.ToStringCustom();
                    var nextUpdateString = (nextUpdate.HasValue ? (!string.IsNullOrWhiteSpace(nextUpdateTmp) ? $"~{nextUpdateTmp}" : "waiting for new update ...") : null);
                    var lastUpdate       = context.LastUpdate;
                    var lastUpdateString = lastUpdate.ToStringWithRelativeDay();

                    var sr = new ServerStatusViewModel
                    {
                        Key                = context.Config.Key,
                        Name               = name,
                        Address            = info.Address,
                        Version            = version.ToString(),
                        OnlinePlayerCount  = info.Players,
                        OnlinePlayerMax    = info.MaxPlayers,
                        MapName            = info.Map,
                        InGameTime         = currentTime,
                        TamedCreatureCount = tamedDinosCount ?? 0,
                        WildCreatureCount  = wildDinosCount ?? 0,
                        StructureCount     = structuresCount ?? 0,
                        PlayerCount        = totalPlayers ?? 0,
                        TribeCount         = totalTribes ?? 0,
                        LastUpdate         = lastUpdateString,
                        NextUpdate         = nextUpdateString
                    };

                    var players = playerinfos?.Where(x => !string.IsNullOrEmpty(x.Name)).ToArray() ?? new PlayerInfo[] { };
                    using (var db = _databaseContextFactory.Create())
                    {
                        Dictionary <string, Tuple <ArkPlayer, Database.Model.User, User, long?, TimeSpan, ArkTribe> > d = null;
                        if (context.Players != null)
                        {
                            var playerNames = players.Select(x => x.Name).ToArray();
                            d = context.Players.Where(x => playerNames.Contains(x.Name, StringComparer.Ordinal)).Select(x =>
                            {
                                long steamId;
                                return(new Tuple <ArkPlayer, Database.Model.User, User, long?, TimeSpan, ArkTribe>(
                                           x,
                                           null,
                                           null,
                                           long.TryParse(x.SteamId, out steamId) ? steamId : (long?)null,
                                           TimeSpan.Zero, null));
                            }).ToDictionary(x => x.Item1.Name, StringComparer.OrdinalIgnoreCase);

                            var ids      = new List <ulong>();
                            var steamIds = d.Values.Select(x => x.Item4).Where(x => x != null).ToArray();
                            foreach (var user in db.Users.Where(y => steamIds.Contains(y.SteamId)))
                            {
                                var item = d.Values.FirstOrDefault(x => x.Item4 == user.SteamId);
                                if (item == null)
                                {
                                    continue;
                                }

                                ids.Add(item.Item1.Id);

                                var discordUser         = (User)null;        //e.User?.Client?.Servers?.Select(x => x.GetUser((ulong)user.DiscordId)).FirstOrDefault();
                                var playedLastSevenDays = TimeSpan.MinValue; //TimeSpan.FromSeconds(user?.Played?.OrderByDescending(x => x.Date).Take(7).Sum(x => x.TimeInSeconds) ?? 0);

                                d[item.Item1.Name] = Tuple.Create(item.Item1, user, discordUser, item.Item4, playedLastSevenDays, item.Item1.TribeId.HasValue ? context.Tribes?.FirstOrDefault(x => x.Id == item.Item1.TribeId.Value) : null);
                            }

                            var remaining = d.Values.Where(x => !ids.Contains(x.Item1.Id)).Where(x => x.Item4 != null).Select(x => x.Item4.Value).ToArray();
                            foreach (var user in db.Played.Where(x => x.SteamId.HasValue && remaining.Contains(x.SteamId.Value))
                                     .GroupBy(x => x.SteamId)
                                     .Select(x => new { key = x.Key, items = x.OrderByDescending(y => y.Date).Take(7).ToList() })
                                     .ToArray())
                            {
                                var item = d.Values.FirstOrDefault(x => x.Item4 == user.key);
                                if (item == null)
                                {
                                    continue;
                                }

                                var playedLastSevenDays = TimeSpan.FromSeconds(user?.items?.Sum(x => x.TimeInSeconds) ?? 0);
                                d[item.Item1.Name] = Tuple.Create(item.Item1, item.Item2, item.Item3, item.Item4, playedLastSevenDays, item.Item1.TribeId.HasValue ? context.Tribes?.FirstOrDefault(x => x.Id == item.Item1.TribeId.Value) : null);
                            }
                        }

                        //var playerslist = players.Select(x => {
                        //    var extra = d.ContainsKey(x.Name) ? d[x.Name] : null;
                        //    return new
                        //    {
                        //        Steam = x.Name,
                        //        Name = extra?.Item1?.Name,
                        //        Tribe = extra?.Item1?.TribeName,
                        //        Discord = extra != null && extra.Item3 != null ? $"{extra.Item3.Name}#{extra.Item3.Discriminator}" : null,
                        //        TimeOnline = x.Time.ToStringCustom(),
                        //        PlayedLastSevenDays = extra != null && extra.Item5.TotalMinutes > 1 ? extra?.Item5.ToStringCustom() : null
                        //    };
                        //}).ToArray();

                        foreach (var player in players)
                        {
                            var extra = d?.ContainsKey(player.Name) == true ? d[player.Name] : null;
                            sr.OnlinePlayers.Add(new OnlinePlayerViewModel
                            {
                                SteamName         = player.Name,
                                CharacterName     = extra?.Item1?.Name,
                                TribeName         = extra?.Item6?.Name,
                                DiscordName       = extra != null && extra.Item3 != null ? $"{extra.Item3.Name}#{extra.Item3.Discriminator}" : null,
                                TimeOnline        = player.Time.ToStringCustom(),
                                TimeOnlineSeconds = (int)Math.Round(player.Time.TotalSeconds)
                            });
                        }
                    }

                    result.Servers.Add(sr);
                }
            }

            foreach (var context in _contextManager.Clusters)
            {
                var cc = new ClusterStatusViewModel
                {
                    Key        = context.Config.Key,
                    ServerKeys = _contextManager.Servers
                                 .Where(x => x.Config.Cluster.Equals(context.Config.Key, StringComparison.OrdinalIgnoreCase))
                                 .Select(x => x.Config.Key).ToArray()
                };
                result.Clusters.Add(cc);
            }

            return(result);
        }
Ejemplo n.º 3
0
        public async Task <ServerStatusAllViewModel> Get()
        {
            var demoMode = IsDemoMode() ? new DemoMode() : null;

            var anonymize = _config.AnonymizeWebApiData;
            var user      = WebApiHelper.GetUser(HttpContext, _config);

            if (anonymize)
            {
                var serverContext = _contextManager?.Servers?.FirstOrDefault();
                var player        = serverContext?.Players?.Where(x =>
                                                                  x.Tribe != null && x.Tribe.Creatures != null && x.Tribe.Structures != null &&
                                                                  x.Tribe.Creatures.Any(y => y.IsBaby) &&
                                                                  x.Tribe.Structures.OfType <ArkStructureCropPlot>().Any() &&
                                                                  x.Tribe.Structures.OfType <ArkStructureElectricGenerator>().Any()
                                                                  ).OrderByDescending(x => x.Creatures.Length).FirstOrDefault();

                if (player == null)
                {
                    user = null;
                }
                else
                {
                    user.Name    = player.Name;
                    user.SteamId = player.SteamId;
                    user.Roles   = _config?.WebApp?.AccessControl?.SelectMany(x => x.Value.Values)
                                   .SelectMany(x => x)
                                   .Distinct(StringComparer.OrdinalIgnoreCase)
                                   .OrderBy(x => x)
                                   .ToArray();
                }
            }

            var result = new ServerStatusAllViewModel {
                User = user, AccessControl = BuildViewModelForAccessControl(_config)
            };

            if (_contextManager == null)
            {
                return(result);
            }

            if (_contextManager.Servers != null)
            {
                foreach (var context in _contextManager.Servers)
                {
                    var serverContext = _contextManager.GetServer(context.Config.Key);

                    var tamedDinosCount    = context.TamedCreatures?.Count();
                    var uploadedDinosCount = context.CloudCreatures?.Count();
                    var wildDinosCount     = context.WildCreatures?.Count();
                    var structuresCount    = context.Structures?.Count();
                    var totalPlayers       = context.Players?.Count();
                    var totalTribes        = context.Tribes?.Count();
                    var serverStarted      = _serverService.GetServerStartTime(context.Config.Key);

                    var nextUpdate       = context.ApproxTimeUntilNextUpdate;
                    var nextUpdateTmp    = nextUpdate?.ToStringCustom();
                    var nextUpdateString = nextUpdate.HasValue ? !string.IsNullOrWhiteSpace(nextUpdateTmp) ? $"~{nextUpdateTmp}" : "waiting for new update ..." : null;
                    var lastUpdate       = context.LastUpdate;
                    var lastUpdateString = lastUpdate.ToStringWithRelativeDay();

                    var anonymizedServer      = anonymize ? _anonymizeData.GetServer(context.Config.Key) : null;
                    var serverStatusViewModel = new ServerStatusViewModel
                    {
                        Key                = anonymizedServer?.Key ?? context.Config.Key,
                        Name               = anonymizedServer?.Name ?? context.Data.ServerInfo?.ServerName,
                        Address            = anonymizedServer?.Address ?? context.Config.DisplayAddress ?? context.Data.ServerInfo?.Address,
                        Version            = context.Data.ServerInfo != null ? $"{context.Data.ServerInfo.MajorVersion}.{context.Data.ServerInfo.MinorVersion}" : null,
                        OnlinePlayerMax    = context.Data.ServerInfo?.MaxPlayers ?? 0,
                        MapName            = context.Data.ServerInfo?.MapName,
                        InGameTime         = context.Data.ServerInfo?.DayNumber.ToString(),
                        TamedCreatureCount = tamedDinosCount ?? 0,
                        CloudCreatureCount = uploadedDinosCount ?? 0,
                        WildCreatureCount  = wildDinosCount ?? 0,
                        StructureCount     = structuresCount ?? 0,
                        TribeCount         = totalTribes ?? 0,
                        LastUpdate         = lastUpdateString,
                        NextUpdate         = nextUpdateString,
                        ServerStarted      = serverStarted
                    };

                    result.Servers.Add(serverStatusViewModel);
                }
            }


            if (_contextManager.Clusters != null)
            {
                foreach (var context in _contextManager.Clusters)
                {
                    var cc = new ClusterStatusViewModel
                    {
                        Key        = context?.Config?.Key,
                        ServerKeys = _contextManager.Servers
                                     .Where(x => x.Config != null && x.Config.ClusterKey != null && x.Config.ClusterKey.Equals(context.Config.Key, StringComparison.OrdinalIgnoreCase))
                                     .Select(x => x.Config.Key).ToArray()
                    };
                    result.Clusters.Add(cc);
                }
            }

            return(result);
        }