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()); }
/// <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); } }
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.")); } }
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); }
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); } }
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, }); }
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)); } }