private async Task <string> GetFounderStringAsync(EventId id, string founder) { var founderName = await GetFullNationNameAsync(founder, id); var founderUrl = $"https://www.nationstates.net/nation={BaseApiService.ToID(founder)}"; var founderString = $"[{founderName}]({founderUrl})"; return(founderString); }
public async Task GetBasicStats(params string[] args) { var id = LogEventIdProvider.GetEventIdByType(LoggingEvent.GetRegionStats); try { string regionName = string.Join(" ", args); _logger.LogInformation(id, LogMessageBuilder.Build(id, $"BasicRegionStats for {regionName} requested.")); XmlDocument regionStats = await dataService.GetRegionStatsAsync(regionName, id); if (regionStats != null) { var name = regionStats.GetElementsByTagName("NAME")[0].InnerText; var numnations = regionStats.GetElementsByTagName("NUMNATIONS")[0].InnerText; var wadelegate = regionStats.GetElementsByTagName("DELEGATE")[0].InnerText; var founder = regionStats.GetElementsByTagName("FOUNDER")[0].InnerText; var founded = regionStats.GetElementsByTagName("FOUNDED")[0].InnerText; var flagUrl = regionStats.GetElementsByTagName("FLAG")[0].InnerText; var power = regionStats.GetElementsByTagName("POWER")[0].InnerText; var tags = regionStats.GetElementsByTagName("TAGS")[0].ChildNodes; var tagList = ""; for (int i = 0; i < tags.Count; i++) { tagList += BaseApiService.FromID(tags.Item(i).InnerText) + ", "; } tagList = tagList.Remove(tagList.Length - 2); var regionUrl = $"https://www.nationstates.net/region={BaseApiService.ToID(regionName)}"; var builder = new EmbedBuilder(); builder.WithThumbnailUrl(flagUrl); builder.WithTitle($"BasicStats for Region"); builder.WithDescription($"**[{name}]({regionUrl})** {Environment.NewLine}" + $"[{numnations} nations]({regionUrl}/page=list_nations) | {founded} | Power: {power}"); builder.AddField("Founder", $"[{await GetFullNationName(founder, id)}](https://www.nationstates.net/nation={BaseApiService.ToID(founder)})"); builder.AddField("Delegate", await GetDelegateNationString(wadelegate, id)); builder.WithFooter($"NationStatesApiBot {AppSettings.VERSION} by drehtisch"); builder.WithColor(new Color(_rnd.Next(0, 256), _rnd.Next(0, 256), _rnd.Next(0, 256))); await ReplyAsync(embed : builder.Build()); } else { var builder = new EmbedBuilder(); builder.WithTitle($"Something went wrong."); builder.WithDescription("Probably no such region."); await ReplyAsync(embed : builder.Build()); } } catch (Exception ex) { _logger.LogCritical(id, ex, LogMessageBuilder.Build(id, "A critical error occured.")); await ReplyAsync("Something went wrong. Sorry :("); } }
private async Task <string> GetDelegateNationString(string name, EventId eventId) { XmlDocument nationStats = await dataService.GetDelegateString(name, eventId); var fullName = nationStats.GetElementsByTagName("FULLNAME")[0].InnerText; var influence = nationStats.GetElementsByTagName("INFLUENCE")[0].InnerText; var census = nationStats.GetElementsByTagName("CENSUS")[0].ChildNodes; var influenceValue = census[0].ChildNodes[0].InnerText; var endorsements = census[1].ChildNodes[0].InnerText; return($"[{fullName}](https://www.nationstates.net/nation={BaseApiService.ToID(name)}) | {endorsements} endorsements | {influenceValue} influence ({influence})"); }
public async Task GetBasicStatsAsync(params string[] args) { var id = LogEventIdProvider.GetEventIdByType(LoggingEvent.GetNationStats); try { string nationName = string.Join(" ", args); _logger.LogInformation(id, LogMessageBuilder.Build(id, $"BasicNationStats for {nationName} requested.")); XmlDocument nationStats = await _apiDataService.GetNationStatsAsync(nationName, id); if (nationStats != null) { var demonymplural = nationStats.GetElementsByTagName("DEMONYM2PLURAL")[0].InnerText; var category = nationStats.GetElementsByTagName("CATEGORY")[0].InnerText; var flagUrl = nationStats.GetElementsByTagName("FLAG")[0].InnerText; var fullname = nationStats.GetElementsByTagName("FULLNAME")[0].InnerText; var population = nationStats.GetElementsByTagName("POPULATION")[0].InnerText; var region = nationStats.GetElementsByTagName("REGION")[0].InnerText; var founded = nationStats.GetElementsByTagName("FOUNDED")[0].InnerText; var lastActivity = nationStats.GetElementsByTagName("LASTACTIVITY")[0].InnerText; var Influence = nationStats.GetElementsByTagName("INFLUENCE")[0].InnerText; var wa = nationStats.GetElementsByTagName("UNSTATUS")[0].InnerText; var freedom = nationStats.GetElementsByTagName("FREEDOM")[0].ChildNodes; var civilStr = freedom[0].InnerText; var economyStr = freedom[1].InnerText; var politicalStr = freedom[2].InnerText; var census = nationStats.GetElementsByTagName("CENSUS")[0].ChildNodes; var civilRights = census[0].ChildNodes[0].InnerText; var economy = census[1].ChildNodes[0].InnerText; var politicalFreedom = census[2].ChildNodes[0].InnerText; var influenceValue = census[3].ChildNodes[0].InnerText; var endorsementCount = census[4].ChildNodes[0].InnerText; var residency = census[5].ChildNodes[0].InnerText; var residencyDbl = Convert.ToDouble(residency, _locale); var residencyYears = (int)(residencyDbl / 365.242199); var populationdbl = Convert.ToDouble(population); var nationUrl = $"https://www.nationstates.net/nation={BaseApiService.ToID(nationName)}"; var regionUrl = $"https://www.nationstates.net/region={BaseApiService.ToID(region)}"; var builder = new EmbedBuilder(); builder.WithThumbnailUrl(flagUrl); builder.WithTitle($"BasicStats for Nation"); builder.WithDescription($"**[{fullname}]({nationUrl})** {Environment.NewLine}" + $"{(populationdbl / 1000.0 < 1 ? populationdbl : populationdbl / 1000.0).ToString(_locale)} {(populationdbl / 1000.0 < 1 ? "million" : "billion")} {demonymplural} | " + $"Founded {founded} | " + $"Last active {lastActivity}"); builder.AddField("Region", $"[{region}]({regionUrl}) ", true); int residencyDays = (int)(residencyDbl % 365.242199); builder.AddField("Residency", $"Resident for " + $"{(residencyYears < 1 ? "" : $"{residencyYears} year" + $"{(residencyYears > 1 ? "s" : "")}")} " + $"{residencyDays} { (residencyDays != 1 ? $"days" : "day")}", true ); builder.AddField(category, $"C: {civilStr} ({civilRights}) | E: {economyStr} ({economy}) | P: {politicalStr} ({politicalFreedom})"); var waVoteString = ""; if (wa == "WA Member") { var gaVote = nationStats.GetElementsByTagName("GAVOTE")[0].InnerText; var scVote = nationStats.GetElementsByTagName("SCVOTE")[0].InnerText; if (!string.IsNullOrWhiteSpace(gaVote)) { waVoteString += $"GA Vote: {gaVote} | "; } if (!string.IsNullOrWhiteSpace(scVote)) { waVoteString += $"SC Vote: {scVote} | "; } } builder.AddField(wa, $"{waVoteString} {endorsementCount} endorsements | {influenceValue} Influence ({Influence})", true); builder.WithFooter(DiscordBotService.FooterString); builder.WithColor(new Color(_rnd.Next(0, 256), _rnd.Next(0, 256), _rnd.Next(0, 256))); await ReplyAsync(embed : builder.Build()); } else { var builder = new EmbedBuilder(); builder.WithTitle($"Something went wrong."); builder.WithDescription("Probably no such nation."); await ReplyAsync(embed : builder.Build()); } }
public async Task GetBasicStatsAsync(params string[] args) { var id = LogEventIdProvider.GetEventIdByType(LoggingEvent.GetRegionStats); try { string regionName = string.Join(" ", args); if (string.IsNullOrWhiteSpace(regionName)) { regionName = _defaultRegionName; } var mention = false; if (DumpDataService.IsUpdating) { await ReplyAsync("Currently updating region information. This may take a few minutes. You will be pinged once the information is available."); mention = true; } _logger.LogInformation(id, LogMessageBuilder.Build(id, $"BasicRegionStats for {regionName} requested.")); XmlDocument regionStats = await _dataService.GetRegionStatsAsync(regionName, id); var region = await _dumpDataService.GetRegionAsync(BaseApiService.ToID(regionName)); if (regionStats != null && region != null) { var name = regionStats.GetElementsByTagName("NAME").Item(0)?.InnerText; var numnations = regionStats.GetElementsByTagName("NUMNATIONS").Item(0)?.InnerText; var wadelegate = regionStats.GetElementsByTagName("DELEGATE").Item(0)?.InnerText; var founder = region.FOUNDER; var founded = regionStats.GetElementsByTagName("FOUNDED").Item(0)?.InnerText; var flagUrl = region.FLAG; var power = regionStats.GetElementsByTagName("POWER").Item(0)?.InnerText; var waNationCount = region.WANATIONS.Count(); var endoCount = region.WANATIONS.Sum(n => n.ENDORSEMENTS.Count); var census = regionStats.GetElementsByTagName("CENSUS").Item(0)?.ChildNodes; var regionalAvgInfluence = census.Item(0)?.ChildNodes.Item(0)?.InnerText; var regionUrl = $"https://www.nationstates.net/region={BaseApiService.ToID(regionName)}"; var builder = new EmbedBuilder { ThumbnailUrl = flagUrl, Title = name, Url = regionUrl }; if (!string.IsNullOrWhiteSpace(founder) && founder != "0") { string founderString = await GetFounderStringAsync(id, founder); builder.AddField("Founder", $"{founderString}", true); } if (!string.IsNullOrWhiteSpace(founded) && founded != "0") { builder.AddField("Founded", $"{founded}", true); } builder.AddField("Nations", $"[{numnations}]({regionUrl}/page=list_nations)", true); if (!string.IsNullOrWhiteSpace(regionalAvgInfluence) && double.TryParse(regionalAvgInfluence, NumberStyles.Number, _locale, out double avgInfluenceValue) && int.TryParse(numnations, out int numnationsValue)) { var powerValue = avgInfluenceValue * numnationsValue; var powerValueString = powerValue > 1000 ? (powerValue / 1000.0).ToString("0.000", _locale) + "k" : powerValue.ToString(_locale); builder.AddField("Regional Power", $"{power} | {powerValueString} Points", true); } else { builder.AddField("Regional Power", $"{power}", true); } var endoCountString = endoCount > 1000 ? (endoCount / 1000.0).ToString("0.000", _locale) + "k" : endoCount.ToString(_locale); builder.AddField("World Assembly*", $"{waNationCount} member{(waNationCount > 1 ? "s" : string.Empty)} | {endoCountString} endos", true); if (!string.IsNullOrWhiteSpace(wadelegate) && wadelegate != "0") { var delegatetuple = await GetDelegateNationStringAsync(wadelegate, id); builder.AddField($"WA Delegate", $"[{delegatetuple.Item1}](https://www.nationstates.net/nation={BaseApiService.ToID(wadelegate)}) | {delegatetuple.Item2}"); } builder.WithFooter(DiscordBotService.FooterString); builder.WithColor(new Color(_rnd.Next(0, 256), _rnd.Next(0, 256), _rnd.Next(0, 256))); builder.AddField("Datasource", "API, * Dump", true); builder.AddField("As of", "Just now, * " + DateTime.UtcNow.Subtract(DumpDataService.LastDumpUpdateTimeUtc).ToString("h'h 'm'm 's's'") + " ago", true); builder.AddField("Next Update in", "On demand, * " + DumpDataService.NextDumpDataUpdate.ToString("h'h 'm'm 's's'"), true); await ReplyAsync(embed : builder.Build()); } else { var builder = new EmbedBuilder(); builder.WithTitle($"Something went wrong."); builder.WithDescription("No API or No Dump data received. Probably no such region."); await ReplyAsync(embed : builder.Build()); } if (mention) { await ReplyAsync($"{Context.User.Mention}"); } } catch (Exception ex) { _logger.LogCritical(id, ex, LogMessageBuilder.Build(id, "A critical error occured.")); await ReplyAsync("Something went wrong. Sorry :("); } }