コード例 #1
0
        private HashSet <REGION> ParseRegionsFromStream(Stream stream)
        {
            var xml = XDocument.Load(stream, LoadOptions.None);

            return(xml.Descendants("REGION").Select(m =>

                                                    new REGION
            {
                NAME = BaseApiService.ToID(m.Element("NAME").Value),
                DumpPosition = m.NodesBeforeSelf().Count(),
                NUMNATIONS = (int)m.Element("NUMNATIONS"),
                NATIONNAMES = m.Element("NATIONS").Value.Split(":").ToHashSet(),
                DELEGATE = m.Element("DELEGATE").Value,
                DELEGATEVOTES = (int)m.Element("DELEGATEVOTES"),
                DELEGATEAUTH = m.Element("DELEGATEAUTH").Value,
                FOUNDER = m.Element("FOUNDER").Value,
                FOUNDERAUTH = m.Element("FOUNDERAUTH").Value,
                POWER = m.Element("POWER").Value,
                FLAG = m.Element("FLAG").Value,
                LASTUPDATE = DateTimeOffset.FromUnixTimeSeconds((int)m.Element("LASTUPDATE")),
                OFFICERS = BuildOfficers(m),
                EMBASSIES = m.Element("EMBASSIES").Descendants("EMBASSY").Select(e => e.Value).ToList(),
                WABADGES = BuildWABadges(m)
            }).ToHashSet());
        }
コード例 #2
0
        /// <summary>
        /// Returns a List of Nations that were endorsed by a specific nation
        /// </summary>
        /// <param name="nationName">specific nation name</param>
        /// <returns>List of Nations</returns>
        public async Task <List <NATION> > GetNationsEndorsedBy(string nationName)
        {
            _logger.LogDebug(defaultEventId, GetLogMessage($"Dump Data: GetNationsEndorsedBy {nationName} requested."));
            await WaitForDataAvailabilityAsync();

            var nation = GetNationInternal(nationName);

            if (nation != null)
            {
                var region = nation.REGION;
                if (region != null)
                {
                    return(region.NATIONS.Where(n => n.ENDORSEMENTS.Contains(BaseApiService.ToID(nationName))).ToList());
                }
                else
                {
                    _logger.LogWarning(defaultEventId, GetLogMessage($"region of {nation} was null"));
                    return(null);
                }
            }
            else
            {
                _logger.LogWarning(defaultEventId, GetLogMessage($"nation {nationName} was null"));
                return(null);
            }
        }
コード例 #3
0
        public async Task UpdateRecruitmentStatsAsync()
        {
            try
            {
                _logger.LogInformation(_defaulEventId, LogMessageBuilder.Build(_defaulEventId, "Updating Recruitment Stats"));
                var today = DateTime.Today.Date;

                var sent   = NationManager.GetNationsByStatusName("send").Select(n => n.Name).ToList();
                var manual = NationManager.GetNationsByStatusName("reserved_manual").Select(n => n.Name).ToList();
                var region = await _dumpDataService.GetRegionAsync(BaseApiService.ToID(_config.NationStatesRegionName));

                var apiRecruited    = region.NATIONS.Where(n => sent.Any(s => n.NAME == s)).Select(n => n.NAME).ToList();
                var manualRecruited = region.NATIONS.Where(n => manual.Any(m => n.NAME == m)).Select(n => n.NAME).ToList();

                RStatDbUpdate();

                ApiRecruited    = apiRecruited.Count;
                ApiRatio        = Math.Round((100 * ApiRecruited / (sent.Count + ApiFailed + 0.0)), 2);
                ManualReserved  = manual.Count;
                ManualRecruited = manualRecruited.Count;
                ManualRatio     = Math.Round((100 * ManualRecruited / (manual.Count + 0.0)), 2);
                _logger.LogInformation(_defaulEventId, LogMessageBuilder.Build(_defaulEventId, "Recruitment Stats Updated"));
            }
            catch (Exception ex)
            {
                _logger.LogCritical(_defaulEventId, ex, LogMessageBuilder.Build(_defaulEventId, "A critical error occured."));
            }
        }
コード例 #4
0
        private async Task <List <REGION> > GetRegionToRecruitFromAsync(EventId id)
        {
            List <REGION> regionsToRecruitFrom = new List <REGION>();
            var           regionNames          = _config.RegionsToRecruitFrom.Split(";");

            foreach (var regionName in regionNames)
            {
                if (!string.IsNullOrWhiteSpace(regionName))
                {
                    var region = await _dumpDataService.GetRegionAsync(BaseApiService.ToID(regionName));

                    if (region != null)
                    {
                        regionsToRecruitFrom.Add(region);
                        _logger.LogInformation(id, LogMessageBuilder.Build(id, $"Region '{regionName}' added to regionsToRecruitFrom."));
                    }
                    else
                    {
                        _logger.LogWarning(id, LogMessageBuilder.Build(id, $"Region for name '{regionName}' couldn't be found in dumps."));
                    }
                }
            }

            return(regionsToRecruitFrom);
        }
コード例 #5
0
        public async Task <List <NATION> > GetNationsWhoDidNotEndorseNationAsync(string nationName)
        {
            _logger.LogDebug(_defaultEventId, GetLogMessage($"Dump Data: GetNationsWhoDidNotEndorseNation {nationName} requested."));
            await WaitForDataAvailabilityAsync();

            var nation = GetNationInternal(BaseApiService.ToID(nationName));

            if (nation != null)
            {
                if (!nation.WAMEMBER)
                {
                    throw new InvalidOperationException("Not a WA Member.");
                }
                var region = nation.REGION;
                if (region != null && region.NAME == BaseApiService.ToID(_appconf.NationStatesRegionName))
                {
                    return(region.WANATIONS.Except(region.NATIONS.Where(n => nation.ENDORSEMENTS.Contains(n.NAME))).ToList());
                }
                else if (region == null)
                {
                    _logger.LogWarning(_defaultEventId, GetLogMessage($"region of {nation} was null"));
                    return(null);
                }
                else
                {
                    throw new InvalidOperationException($"This nation does not reside in {_appconf.NationStatesRegionName}");
                }
            }
            else
            {
                _logger.LogWarning(_defaultEventId, GetLogMessage($"nation {nationName} was null"));
                return(null);
            }
        }
コード例 #6
0
 private NATION BuildNation(XElement m)
 {
     return(new NATION
     {
         NAME = BaseApiService.ToID(m.Element("NAME").Value),
         TYPE = m.Element("TYPE").Value,
         FULLNAME = m.Element("FULLNAME").Value,
         MOTTO = m.Element("MOTTO").Value,
         CATEGORY = m.Element("CATEGORY").Value,
         WAMEMBER = m.Element("UNSTATUS").Value == "WA Member",
         ENDORSEMENTS = m.Element("ENDORSEMENTS").Value.Split(",").ToList(),
         FREEDOM = BuildFreedom(m),
         REGION = GetRegionInternal(BaseApiService.ToID(m.Element("REGION").Value)),
         REGIONNAME = BaseApiService.ToID(m.Element("REGION").Value),
         POPULATION = Convert.ToDouble(m.Element("POPULATION").Value),
         TAX = Convert.ToDouble(m.Element("TAX").Value),
         ANIMAL = m.Element("ANIMAL").Value,
         CURRENCY = m.Element("CURRENCY").Value,
         DEMONYM = m.Element("DEMONYM").Value,
         DEMONYM2 = m.Element("DEMONYM2").Value,
         DEMONYM2PLURAL = m.Element("DEMONYM2PLURAL").Value,
         FLAG = m.Element("FLAG").Value,
         MAJORINDUSTRY = m.Element("MAJORINDUSTRY").Value,
         GOVTPRIORITY = m.Element("GOVTPRIORITY").Value,
         GOVT = BuildGOVT(m),
         FOUNDED = m.Element("FOUNDED").Value,
         FIRSTLOGIN = DateTimeOffset.FromUnixTimeSeconds((int)m.Element("FIRSTLOGIN")),
         LASTLOGIN = DateTimeOffset.FromUnixTimeSeconds((int)m.Element("LASTLOGIN")),
         LASTACTIVITY = m.Element("LASTACTIVITY").Value,
         INFLUENCE = m.Element("INFLUENCE").Value,
         PUBLICSECTOR = Convert.ToDouble(m.Element("PUBLICSECTOR").Value),
         DEATHS = BuildDeaths(m),
         LEADER = m.Element("LEADER").Value,
         CAPITAL = m.Element("CAPITAL").Value,
         RELIGION = m.Element("RELIGION").Value,
         FACTBOOKS = Convert.ToInt32(m.Element("FACTBOOKS").Value),
         DISPATCHES = Convert.ToInt32(m.Element("DISPATCHES").Value),
         WABADGES = BuildWABadges(m),
         CARDCATEGORY = m.Element("CARDCATEGORY").Value,
     });
 }
コード例 #7
0
        private async void UpdateRecruitmentStatsAsync()
        {
            while (IsRecruiting)
            {
                try
                {
                    _logger.LogInformation(defaulEventId, LogMessageBuilder.Build(defaulEventId, "Updating Recruitment Stats"));
                    var today = DateTime.Today.Date;

                    var sent   = NationManager.GetNationsByStatusName("send").Select(n => n.Name).ToList();
                    var manual = NationManager.GetNationsByStatusName("reserved_manual").Select(n => n.Name).ToList();
                    var region = await _dumpDataService.GetRegionAsync(BaseApiService.ToID(_config.NationStatesRegionName));

                    var apiRecruited    = region.NATIONS.Where(n => sent.Any(s => n.NAME == s)).Select(n => n.NAME).ToList();
                    var manualRecruited = region.NATIONS.Where(n => manual.Any(m => n.NAME == m)).Select(n => n.NAME).ToList();

                    RStatDbUpdate();

                    ApiRecruited    = apiRecruited.Count;
                    ApiRatio        = Math.Round((100 * ApiRecruited / (sent.Count + ApiFailed + 0.0)), 2);
                    ManualReserved  = manual.Count;
                    ManualRecruited = manualRecruited.Count;
                    ManualRatio     = Math.Round((100 * ManualRecruited / (manual.Count + 0.0)), 2);

                    await WriteRecruited(today, apiRecruited, manualRecruited.AsQueryable());

                    var rt = await GetRecruitedOn(today);

                    RecruitedTodayA = rt[0];
                    RecruitedTodayM = rt[1];

                    var ry = await GetRecruitedOn(today.AddDays(-1));

                    RecruitedYesterdayA = ry[0];
                    RecruitedYesterdayM = ry[1];

                    var lastMonday = (today - new TimeSpan((int)today.DayOfWeek, 0, 0, 0)).AddDays(1);
                    var rlw        = await GetRecruitedBetween(lastMonday - TimeSpan.FromDays(7), lastMonday);

                    RecruitedLastWeekA     = rlw[0];
                    RecruitedLastWeekM     = rlw[1];
                    RecruitedLastWeekAvgDA = Math.Round(RecruitedLastWeekA / 7.0, 2);
                    RecruitedLastWeekAvgDM = Math.Round(RecruitedLastWeekM / 7.0, 2);

                    var firstDayLastMonth = new DateTime(today.Year, today.Month, 1).AddMonths(-1);
                    var daysInLastMonth   = DateTime.DaysInMonth(firstDayLastMonth.Year, firstDayLastMonth.Month);
                    var rlm = await GetRecruitedBetween(firstDayLastMonth, firstDayLastMonth.AddMonths(1).AddDays(-1));

                    RecruitedLastMonthA     = rlm[0];
                    RecruitedLastMonthM     = rlm[1];
                    RecruitedLastMonthAvgDA = Math.Round(RecruitedLastMonthA / (daysInLastMonth + 0.0), 2);
                    RecruitedLastMonthAvgDM = Math.Round(RecruitedLastMonthM / (daysInLastMonth + 0.0), 2);
                    _logger.LogInformation(defaulEventId, LogMessageBuilder.Build(defaulEventId, "Recruitment Stats Updated"));
                }
                catch (Exception ex)
                {
                    _logger.LogCritical(defaulEventId, ex, LogMessageBuilder.Build(defaulEventId, "A critical error occured."));
                }
                await Task.Delay(TimeSpan.FromHours(4));
            }
        }