Example #1
0
        public async Task <Nation> GetRecruitableNationAsync(EventId id, bool isAPI)
        {
            bool   found  = false;
            Nation result = null;

            do
            {
                var nation = await NationManager.GetNationByStatusNameAsync("pending");

                if (nation != null)
                {
                    found = await IsNationRecruitableAsync(nation, id);

                    if (found)
                    {
                        result = nation;
                    }
                    else
                    {
                        if (IsReceivingRecruitableNations && !isAPI)
                        {
                            currentRNStatus.SkippedCount++;
                        }
                    }
                }
                else
                {
                    _logger.LogCritical(id, "Picked nation was null !");
                    break;
                }
            } while (!found);
            return(result);
        }
Example #2
0
        private async Task <bool> IsNationRecruitableAsync(Nation nation, EventId id)
        {
            if (nation != null)
            {
                var criteriaFit = await DoesNationFitCriteriaAsync(nation.Name);

                if (criteriaFit)
                {
                    var apiResponse = await WouldReceiveTelegramAsync(nation, id);

                    if (apiResponse == 0)
                    {
                        _logger.LogDebug(id, LogMessageBuilder.Build(id, $"{nation.Name} - No receive."));
                    }
                    else if (apiResponse == 1)
                    {
                        return(true);
                    }
                    else
                    {
                        _logger.LogWarning(id, LogMessageBuilder.Build(id, $"Recruitable nation check: {nation.Name} failed."));
                        await NationManager.SetNationStatusToAsync(nation, "failed");

                        return(false);
                    }
                }
                else
                {
                    _logger.LogDebug(id, LogMessageBuilder.Build(id, $"{nation.Name} does not fit criteria and is therefore skipped."));
                }
            }
            await NationManager.SetNationStatusToAsync(nation, "skipped");

            return(false);
        }
Example #3
0
        public async IAsyncEnumerable <Nation> GetRecruitableNationsAsync(int number, bool isAPI, EventId id)
        {
            _logger.LogInformation(id, LogMessageBuilder.Build(id, $"{number} recruitable nations requested"));
            var pendingCount = NationManager.GetNationCountByStatusName("pending");

            _logger.LogInformation(id, LogMessageBuilder.Build(id, $"Pending: {pendingCount}"));
            if (number > pendingCount)
            {
                number = pendingCount;
            }
            for (int i = 0; i < number; i++)
            {
                if (currentRNStatus != null && currentRNStatus.CurrentCount > currentRNStatus.FinalCount)
                {
                    break;
                }
                if (IsReceivingRecruitableNations && !isAPI)
                {
                    currentRNStatus.CurrentCount++;
                }
                var nation = await GetRecruitableNationAsync(id, isAPI);

                if (nation == null)
                {
                    break;
                }
                yield return(nation);
            }
        }
Example #4
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."));
            }
        }
Example #5
0
 private void RStatDbUpdate()
 {
     ApiSent    = NationManager.GetNationsByStatusName("send").Count;
     ApiPending = NationManager.GetNationsByStatusName("pending").Count;
     ApiSkipped = NationManager.GetNationsByStatusName("skipped").Count;
     ApiFailed  = NationManager.GetNationsByStatusName("failed").Count;
 }
Example #6
0
        public CustomerController()
        {
            _customerMan = new CustomerManager();

            _nationMan = new NationManager();

            _stateMan = new StateManager();
        }
Example #7
0
        public VendorController()
        {
            _vendorMan = new VendorManager();

            _nationMan = new NationManager();

            _stateMan = new StateManager();
        }
 public void UpdateMyPlayer(int viewID)
 {
     photonView.RPC("SendPlayerRPC", PhotonTargets.All,
                    LocalPlayer.pp,
                    viewID,
                    NationManager.myNation,
                    TanksData.FindTankData(NationManager.ReturnStartTank(NationManager.myNation)).maxHp,
                    NationManager.ReturnStartTank(NationManager.myNation),
                    true); //Player gracza wysyłamy jeśli target ma go na liście graczy
 }
Example #9
0
        private async Task EnsurePoolFilledAsync()
        {
            var           id = LogEventIdProvider.GetEventIdByType(LoggingEvent.EnsurePoolFilled);
            List <REGION> regionsToRecruitFrom = await GetRegionToRecruitFromAsync(id);

            while (IsRecruiting)
            {
                bool fillingUp    = false;
                int  counter      = 0;
                int  pendingCount = NationManager.GetNationCountByStatusName("pending");
                while (pendingCount < _config.MinimumRecruitmentPoolSize)
                {
                    if (!fillingUp)
                    {
                        fillingUp = true;
                        _logger.LogInformation(id, LogMessageBuilder.Build(id, $"Filling up pending pool now from {pendingCount} to {_config.MinimumRecruitmentPoolSize}"));
                    }
                    PoolStatus = "Filling up with random nations";
                    var    regionId = _rnd.Next(regionsToRecruitFrom.Count);
                    var    region   = regionsToRecruitFrom.ElementAt(regionId);
                    string nationName;
                    do
                    {
                        var nationId = _rnd.Next(region.NATIONNAMES.Count);
                        nationName = region.NATIONNAMES.ElementAt(nationId);
                    }while (await NationManager.IsNationPendingSkippedSendOrFailedAsync(nationName) || await IsNationRecruitableAsync(new Nation()
                    {
                        Name = nationName, StatusTime = DateTime.UtcNow
                    }, id));
                    var nation = await NationManager.GetNationAsync(nationName);

                    if (nation != null)
                    {
                        await NationManager.SetNationStatusToAsync(nation, "pending");
                    }
                    else
                    {
                        await NationManager.AddUnknownNationsAsPendingAsync(new List <string>() { nationName }, true);
                    }
                    counter++;
                    pendingCount = NationManager.GetNationCountByStatusName("pending");
                    _logger.LogDebug(id, LogMessageBuilder.Build(id, $"Added nation '{nationName}' to pending. Now at {pendingCount} from minimum {_config.MinimumRecruitmentPoolSize}."));
                }
                if (fillingUp)
                {
                    _logger.LogInformation(id, LogMessageBuilder.Build(id, $"Filled up pending pool to minimum. (Added {counter} nations to pending.)"));
                    PoolStatus = "Waiting for new nations";
                }

                await Task.Delay(1800000); //30 min
            }
        }
        public async Task <List <Nation> > GetRecruitableNationsAsync(int number, bool isAPI)
        {
            List <Nation> returnNations = new List <Nation>();
            var           id            = LogEventIdProvider.GetEventIdByType(LoggingEvent.GetRecruitableNations);

            try
            {
                _logger.LogDebug(id, LogMessageBuilder.Build(id, $"{number} recruitable nations requested"));
                List <Nation> pendingNations = new List <Nation>();
                if (pendingNations.Count == 0)
                {
                    pendingNations = NationManager.GetNationsByStatusName("pending");
                }
                while (returnNations.Count < number)
                {
                    var picked = pendingNations.Take(1);
                    var nation = picked.Count() > 0 ? picked.ToArray()[0] : null;
                    if (nation != null)
                    {
                        if (await IsNationRecruitableAsync(nation, id))
                        {
                            returnNations.Add(nation);
                            if (IsReceivingRecruitableNations && !isAPI)
                            {
                                currentRNStatus.CurrentCount++;
                            }
                        }
                        pendingNations.Remove(nation);
                        returnNations = returnNations.Distinct().ToList();
                    }
                    else
                    {
                        if (pendingNations.Count == 0)
                        {
                            _logger.LogCritical(id, "No more nations in pending pool !");
                            return(returnNations);
                        }
                        else
                        {
                            _logger.LogCritical(id, "Picked nation was null !");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(id, ex, LogMessageBuilder.Build(id, "An error occured."));
            }
            return(returnNations);
        }
        private async Task <bool> IsNationRecruitableAsync(Nation nation, EventId id)
        {
            if (nation != null)
            {
                var result = await IsNationRecruitableAsync(nation.Name, id);

                if (!result)
                {
                    await NationManager.SetNationStatusToAsync(nation, "skipped");
                }
                return(result);
            }
            return(false);
        }
Example #12
0
        private async Task AddNationToPendingAsync(EventId id, List <string> nationNames, bool isSourceDumps)
        {
            List <string> nationsToAdd = new List <string>();

            foreach (var res in nationNames)
            {
                if (await DoesNationFitCriteriaAsync(res))
                {
                    nationsToAdd.Add(res);
                }
            }
            var counter = await NationManager.AddUnknownNationsAsPendingAsync(nationsToAdd, isSourceDumps);

            if (counter > 0)
            {
                _logger.LogInformation(id, LogMessageBuilder.Build(id, $"{counter} nations added to pending"));
            }
        }
        public JsonResult Get_Nations_By_Customer_Id(int customer_Id)
        {
            List <NationInfo> Nations = new List <NationInfo>();

            NationManager nMan = new NationManager();

            PaginationInfo pager = new PaginationInfo();

            pager.IsPagingRequired = false;

            try
            {
                Nations = nMan.Get_Nations_By_Customer_Id(customer_Id, ref pager);
            }
            catch (Exception ex)
            {
                Logger.Error("Enquiry Controller - Get_Nations_By_Customer_Id " + ex.ToString());
            }

            return(Json(Nations, JsonRequestBehavior.AllowGet));
        }
        public async Task RunAsync()
        {
            _logger.LogInformation($"--- DiscordBotService started ---");
            NationManager.Initialize(_config);
            UserManager.Initialize(_config);
            DiscordClient  = new DiscordSocketClient();
            commandService = new CommandService(new CommandServiceConfig
            {
                SeparatorChar         = _config.SeperatorChar,
                DefaultRunMode        = RunMode.Async,
                CaseSensitiveCommands = false
            });
            SetUpDiscordEvents();
            await commandService.AddModulesAsync(Assembly.GetEntryAssembly(), Program.ServiceProvider);

            await DiscordClient.LoginAsync(TokenType.Bot, _config.DiscordBotLoginToken);

            await DiscordClient.StartAsync();

            IsRunning = true;
        }
 public UserController(
     IUserService user,
     IAdressesService adressesService,
     IPostalcodeService postalcodeService,
     ITeamService teamService,
     INationService nationService,
     IPlayerSkillService playskillService,
     IPlayerService playerService,
     IStadiumService stadiumService,
     ICoachService coachService,
     ICoachSkillService coachSkillService)
 {
     _usermanager        = (UserManager)user;
     _adressmanager      = (AdressManager)adressesService;
     _postalcodeManager  = (PostalcodeManager)postalcodeService;
     _teamManager        = (TeamManager)teamService;
     _nationManager      = (NationManager)nationService;
     _playerskillManager = (PlayerSkillManager)playskillService;
     _playerManager      = (PlayerManager)playerService;
     _stadiumManager     = (StadiumManager)stadiumService;
     _coachManager       = (CoachManager)coachService;
     _coachSkillManager  = (CoachSkillManager)coachSkillService;
 }
Example #16
0
        /// <summary>
        /// Saving new Team to database
        /// </summary>
        /// <param name="user"></param>
        /// <param name="teamManager"></param>
        /// <param name="stadiumManager"></param>
        /// <param name="playerManager"></param>
        /// <param name="playerSkillManager"></param>
        /// <param name="nationManager"></param>
        /// <param name="coachManager"></param>
        /// <param name="coachSkillManager"></param>
        /// <returns></returns>
        public static Team CreateFinishedTeam(
            User user,
            TeamManager teamManager,
            StadiumManager stadiumManager,
            PlayerManager playerManager,
            PlayerSkillManager playerSkillManager,
            NationManager nationManager
            // CoachManager coachManager,
            //CoachSkillManager coachSkillManager

            )
        {
            Team team = CreateTeam(user);

            // coachSkillManager.Add(team.Coach.CoachSkill);
            //coachSkillManager.Save();
            //  coachManager.Add(team.Coach);
            //coachManager.Save();

            stadiumManager.Add(team.Stadium);
            stadiumManager.Save();
            teamManager.Add(team);
            teamManager.Save();
            team.Players = PlayerMethod.CreatePlayers().ToList();
            foreach (Player player in team.Players)
            {
                nationManager.Add(player.Nation);
                nationManager.Save();
                playerSkillManager.Add(player.PlayerSkill);
                playerSkillManager.Save();
                playerManager.Add(player);
                playerManager.Save();
            }
            teamManager.Save();
            return(team);
        }
Example #17
0
 public NationController(INationService nation)
 {
     _nationManager = (NationManager)nation;
 }
Example #18
0
        private async Task RecruitAsync()
        {
            List <Nation> pendingNations = new List <Nation>();

            while (IsRecruiting && _config.EnableRecruitment)
            {
                try
                {
                    if (pendingNations.Count == 0)
                    {
                        if (NationManager.GetNationCountByStatusName("pending") == 0)
                        {
                            _logger.LogWarning("Delaying API recruitment for 15 minutes due to lack of recruitable nations");
                            RecruitmentStatus = "Throttled: lack of nations";
                            await Task.Delay(900000);
                        }
                        pendingNations = NationManager.GetNationsByStatusName("reserved_api");
                        if (pendingNations.Count < 10)
                        {
                            var numberToRequest = 10 - pendingNations.Count;
                            await foreach (var resNation in GetRecruitableNationsAsync(numberToRequest, true, _defaulEventId))
                            {
                                pendingNations.Add(resNation);
                            }
                            if (pendingNations.Count < numberToRequest)
                            {
                                RecruitmentStatus = "Throttled: lack of of nations";
                                _logger.LogWarning("Didn't received enough recruitable nations");
                            }
                            else
                            {
                                RecruitmentStatus = "Fully operational";
                            }
                            foreach (var pendingNation in pendingNations)
                            {
                                await NationManager.SetNationStatusToAsync(pendingNation, "reserved_api");
                            }
                        }
                    }
                    var picked = pendingNations.Take(1);
                    var nation = picked.Count() > 0 ? picked.ToArray()[0] : null;
                    if (nation != null)
                    {
                        if (await _apiService.IsNationStatesApiActionReadyAsync(NationStatesApiRequestType.SendRecruitmentTelegram, true))
                        {
                            if (await IsNationRecruitableAsync(nation, _defaulEventId))
                            {
                                if (await _apiService.SendRecruitmentTelegramAsync(nation.Name))
                                {
                                    await NationManager.SetNationStatusToAsync(nation, "send");

                                    _logger.LogInformation(_defaulEventId, LogMessageBuilder.Build(_defaulEventId, $"Telegram to {nation.Name} queued successfully."));
                                }
                                else
                                {
                                    _logger.LogWarning(_defaulEventId, LogMessageBuilder.Build(_defaulEventId, $"Sending of a Telegram to {nation.Name} failed."));
                                    await NationManager.SetNationStatusToAsync(nation, "failed");
                                }
                            }
                            pendingNations.Remove(nation);
                        }
                    }
                    else
                    {
                        _logger.LogCritical(_defaulEventId, LogMessageBuilder.Build(_defaulEventId, "No nation to recruit found."));
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError(_defaulEventId, ex, LogMessageBuilder.Build(_defaulEventId, "An error occured."));
                }
                await Task.Delay(60000);
            }
            if (!_config.EnableRecruitment)
            {
                _logger.LogWarning(_defaulEventId, "Recruitment disabled.");
            }
        }
        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));
            }
        }
        public async Task DoGetRecruitableNationsAsync([Remainder, Summary("Number of nations to be returned")] int number)
        {
            //await ReplyAsync("The /rn command needed to be disabled because of major issues with the manual recruitment system. Drehtisch will fix those issue asap. Sorry :(");
            Console.ResetColor();
            var           id            = LogEventIdProvider.GetEventIdByType(LoggingEvent.RNCommand);
            List <Nation> returnNations = new List <Nation>();

            try
            {
                if (await _permManager.IsAllowedAsync(PermissionType.ManageRecruitment, Context.User))
                {
                    if (!_recruitmentService.IsReceivingRecruitableNations)
                    {
                        try
                        {
                            if (number <= 120)
                            {
                                var currentRN = new RNStatus
                                {
                                    IssuedBy              = Context.User.Username,
                                    FinalCount            = number,
                                    StartedAt             = DateTimeOffset.UtcNow,
                                    AvgTimePerFoundNation = TimeSpan.FromSeconds(2)
                                };
                                var channel = await Context.User.GetOrCreateDMChannelAsync();

                                _recruitmentService.StartReceiveRecruitableNations(currentRN);
                                await ReplyAsync($"{_actionQueued}{Environment.NewLine}{Environment.NewLine}You can request the status of this command using /rns. Finish expected in approx. (mm:ss): {currentRN.ExpectedIn():mm\\:ss}");

                                StringBuilder builder = new StringBuilder();
                                var           counter = 0;
                                await foreach (var nation in _recruitmentService.GetRecruitableNationsAsync(number, false, id))
                                {
                                    counter++;
                                    builder.Append($"{nation.Name}, ");
                                    if (counter % 8 == 0)
                                    {
                                        await channel.SendMessageAsync(builder.ToString());

                                        builder.Clear();
                                        _logger.LogInformation(id, LogMessageBuilder.Build(id, $"Dispatched {counter}/{number} nations to {Context.User.Username}"));
                                    }
                                    await NationManager.SetNationStatusToAsync(nation, "reserved_manual");
                                }
                                if (builder.Length > 0)
                                {
                                    await channel.SendMessageAsync(builder.ToString());

                                    _logger.LogInformation(id, LogMessageBuilder.Build(id, $"Dispatched {counter}/{number} nations to {Context.User.Username}"));
                                }
                                if (counter < number)
                                {
                                    await ReplyAsync($"Something went wrong didn't received as much nations as requested.");
                                }
                            }
                            else
                            {
                                await ReplyAsync($"{number} exceeds the maximum of 120 Nations (15 Telegrams a 8 recipients) to be returned.");
                            }
                        }
                        finally
                        {
                            _recruitmentService.StopReceiveRecruitableNations();
                        }
                    }
                    else
                    {
                        await ReplyAsync($"There is already a /rn command running. Try again later.");
                    }
                }
                else
                {
                    await ReplyAsync(AppSettings._permissionDeniedResponse);
                }
            }
            catch (Exception ex)
            {
                _logger.LogCritical(id, ex, LogMessageBuilder.Build(id, "A critical error occured"));
                await ReplyAsync($"Something went wrong. Sorry :( ");
            }
        }
Example #21
0
        public async Task DoGetRecruitableNations([Remainder, Summary("Number of nations to be returned")] int number)
        {
            var           id            = LogEventIdProvider.GetEventIdByType(LoggingEvent.RNCommand);
            List <Nation> returnNations = new List <Nation>();

            try
            {
                if (await _permManager.IsAllowedAsync(PermissionType.ManageRecruitment, Context.User))
                {
                    if (!_recruitmentService.IsReceivingRecruitableNations)
                    {
                        if (number <= 120)
                        {
                            var currentRN = new RNStatus
                            {
                                IssuedBy              = Context.User.Username,
                                FinalCount            = number,
                                StartedAt             = DateTimeOffset.UtcNow,
                                AvgTimePerFoundNation = TimeSpan.FromSeconds(2)
                            };
                            _recruitmentService.StartReceiveRecruitableNations(currentRN);
                            await ReplyAsync($"{actionQueued}{Environment.NewLine}{Environment.NewLine}You can request the status of this command using /rns. Finish expected in approx. (mm:ss): {currentRN.ExpectedIn().ToString(@"mm\:ss")}");

                            _logger.LogInformation(id, LogMessageBuilder.Build(id, $"{number} recruitable nations requested."));
                            returnNations = await _recruitmentService.GetRecruitableNationsAsync(number, false);

                            foreach (var nation in returnNations)
                            {
                                await NationManager.SetNationStatusToAsync(nation, "reserved_manual");
                            }
                            StringBuilder builder = new StringBuilder();
                            builder.AppendLine("-----");
                            var firstReplyStart = $"<@{Context.User.Id}> Your action just finished.{Environment.NewLine}Changed status of {returnNations.Count} nations from 'pending' to 'reserved_manual'.{Environment.NewLine}Recruitable Nations are (each segment for 1 telegram):{Environment.NewLine}";
                            int replyCount      = (number / 40) + (number % 40 != 0 ? 1 : 0);

                            int currentReply = 1;
                            for (int i = 1; i <= returnNations.Count; i++)
                            {
                                var nation = returnNations[i - 1];
                                if (i % 8 == 0)
                                {
                                    builder.AppendLine($"{nation.Name}");
                                    builder.AppendLine("-----");
                                }
                                else
                                {
                                    builder.Append($"{nation.Name}, ");
                                }
                                if (i % 40 == 0)
                                {
                                    if (i / 40 == 1)
                                    {
                                        await ReplyAsync($"{firstReplyStart} Reply {currentReply}/{replyCount}{Environment.NewLine}{builder.ToString()}");
                                    }
                                    else
                                    {
                                        await ReplyAsync($"Reply {currentReply}/{replyCount}{Environment.NewLine}{builder.ToString()}");
                                    }
                                    builder.Clear();
                                    currentReply++;
                                }
                            }
                            if (returnNations.Count < 40)
                            {
                                await ReplyAsync($"{firstReplyStart}{builder.ToString()}");
                            }
                            else
                            {
                                if (number % 40 != 0)
                                {
                                    await ReplyAsync($"Reply {currentReply}/{replyCount}{Environment.NewLine}{builder.ToString()}");
                                }
                            }
                            if (returnNations.Count < number)
                            {
                                await ReplyAsync($"{Environment.NewLine}- - - - -{Environment.NewLine}WARNING: No more nations in pending nations pool.");
                            }
                        }
                        else
                        {
                            await ReplyAsync($"{number} exceeds the maximum of 120 Nations (15 Telegrams a 8 recipients) to be returned.");
                        }
                    }
                    else
                    {
                        await ReplyAsync($"There is already a /rn command running. Try again later.");
                    }
                }
                else
                {
                    await ReplyAsync(AppSettings.PERMISSION_DENIED_RESPONSE);
                }
            }
            catch (Exception ex)
            {
                _logger.LogCritical(id, ex, LogMessageBuilder.Build(id, "An critical error occured"));
                await ReplyAsync($"Something went wrong :( ");

                foreach (var nation in returnNations)
                {
                    await NationManager.SetNationStatusToAsync(nation, "pending");
                }
            }
            finally
            {
                _recruitmentService.StopReceiveRecruitableNations();
            }
        }