예제 #1
0
        private WarViewModel BuildWarViewModel(CurrentWar currentWar, WarPlanModel warPlan)
        {
            var memberName = Queries.RetrieveMemberName(User.Identity.GetUserName());

            return(new WarViewModel {
                CurrentWar = currentWar, WarPlan = warPlan, MemberName = memberName
            });
        }
예제 #2
0
        public async Task DisplayWarInfoAsync()
        {
            WarInformation     clanCurrentWar;
            WarClanInformation friendlyClan;
            WarClanInformation opponentClan;

            if (_clanInformation.StoredClan == null)
            {
                await ReplyAsync("No clan selected");

                return;
            }

            if (_clanInformation.StoredClanCurrentWar == null)
            {
                if (_clanInformation.StoredClanCurrentLeagueWar == null)
                {
                    await Context.Channel.SendMessageAsync("Clan " + _clanInformation.StoredClan.Name + " is not currently at war.");

                    return;
                }
                else
                {
                    ClanWarLeagueWar currentLeagueWar = _clanInformation.StoredClanCurrentLeagueWar;

                    friendlyClan = new WarClanInformation(currentLeagueWar.Clan, currentLeagueWar.Clan.BadgeUrls, currentLeagueWar.Clan.ClanLevel,
                                                          currentLeagueWar.Clan.Attacks, currentLeagueWar.Clan.Stars, currentLeagueWar.Clan.DestructionPercentage, currentLeagueWar.Clan.Members);

                    opponentClan = new WarClanInformation(currentLeagueWar.Opponent, currentLeagueWar.Opponent.BadgeUrls, currentLeagueWar.Opponent.ClanLevel, currentLeagueWar.Opponent.Attacks,
                                                          currentLeagueWar.Opponent.Stars, currentLeagueWar.Opponent.DestructionPercentage, currentLeagueWar.Opponent.Members);

                    clanCurrentWar = new WarInformation(currentLeagueWar, friendlyClan, opponentClan);
                }
            }
            else
            {
                CurrentWar currentWar = _clanInformation.StoredClanCurrentWar;

                friendlyClan = new WarClanInformation(currentWar.Clan, currentWar.Clan.BadgeUrls, currentWar.Clan.ClanLevel,
                                                      currentWar.Clan.Attacks, currentWar.Clan.Stars, currentWar.Clan.DestructionPercentage, currentWar.Clan.Members);

                opponentClan = new WarClanInformation(currentWar.Opponent, currentWar.Opponent.BadgeUrls, currentWar.Opponent.ClanLevel, currentWar.Opponent.Attacks,
                                                      currentWar.Opponent.Stars, currentWar.Opponent.DestructionPercentage, currentWar.Opponent.Members);

                clanCurrentWar = new WarInformation(currentWar, friendlyClan, opponentClan);
            }

            await Context.Channel.SendMessageAsync("", false, clanCurrentWar.BuildWarDescription());
        }
예제 #3
0
        public async Task SearchClanAsync([Remainder] string clan_tag)
        {
            Clan selectedClan = null;

            try
            {
                selectedClan = await _clashClient.Clans.GetAsync(clan_tag);
            }
            catch (ClashOfClansException ex)
            {
                Console.WriteLine(ex.Error);
            }

            if (selectedClan == null)
            {
                await ReplyAsync($"Clan with tag {clan_tag} could not be found");

                return;
            }

            await Context.Channel.SendMessageAsync("Processing info about clan " + selectedClan.Name + "...");

            _clanInformation.StoredClan = selectedClan;
            EmbedBuilder embedBuilder = _clanInformation.CreateClanDescription();

            CurrentWarLeagueGroup currentWarLeagueGroup = null;

            try
            {
                currentWarLeagueGroup = await _clashClient.Clans.GetCurrentWarLeagueGroupAsync(selectedClan.Tag);
            }
            catch (ClashOfClansException ex)
            {
                Console.WriteLine(ex.Error);
            }
            if (currentWarLeagueGroup != null)
            {
                // Clan in league
                _clanInformation.StoredClanCurrentLeagueWar = await GetClanCurrentLeagueWar(selectedClan, currentWarLeagueGroup);

                if (_clanInformation.StoredClanCurrentLeagueWar != null)
                {
                    // Clan in ongoing league war
                    _clanInformation.StoredClanLeagueOpponent = _clanInformation.StoredClanCurrentLeagueWar.Opponent;

                    embedBuilder.Description += "\n In league war against " + _clanInformation.StoredClanCurrentLeagueWar.Opponent.Name;
                }
            }
            else
            {
                CurrentWar selectedClanCurrentWar = null;
                try
                {
                    selectedClanCurrentWar = await _clashClient.Clans.GetCurrentWarAsync(selectedClan.Tag);
                } catch (ClashOfClansException ex)
                {
                    Console.WriteLine(ex.Error);
                }
                if (selectedClanCurrentWar != null)
                {
                    // Clan in normal war
                    _clanInformation.StoredClanCurrentWar = selectedClanCurrentWar;
                    _clanInformation.StoredClanOpponent   = selectedClanCurrentWar.Opponent;

                    embedBuilder.Description += "\n At war with: " + _clanInformation.StoredClanOpponent.Name;
                }
            }
            await Context.Channel.SendMessageAsync("", false, embedBuilder.Build());
        }
예제 #4
0
        private async Task WarEndedAsync(SocketTextChannel channel, IList <GuildMember> guildMembers, CurrentWar currentWar)
        {
            var inDiscord = guildMembers.Where(guildMember =>
                                               guildMember.Tags.Any(tag => currentWar.Clan.Members.Any(x =>
                                                                                                       string.Equals(x.Tag, tag, StringComparison.InvariantCultureIgnoreCase)))).ToArray();

            foreach (var member in inDiscord)
            {
                member.TotalWars++;
            }

            var missedAttacks = currentWar.Clan.Members.Where(x => x.Attacks.Count == 0).ToArray();

            inDiscord = guildMembers.Where(guildMember =>
                                           guildMember.Tags.Any(tag => missedAttacks.Any(x => x.Tag == tag))).ToArray();

            foreach (var member in inDiscord)
            {
                member.MissedAttacks++;
            }

            _database.UpdateGuild();

            var opponents = currentWar.Opponent.Members.ToDictionary(x => x.Tag, x => x);

            var notMirrored = currentWar.Clan.Members.Where(x =>
                                                            x.Attacks.All(y => opponents[y.DefenderTag].MapPosition != x.MapPosition)).ToArray();

            var names = string.Join('\n',
                                    inDiscord.Select(x => $"{_client.GetUser(x.Id)?.Mention ?? "{User Not Found}"}"));

            var builder = new EmbedBuilder
            {
                Title = "War Breakdown",
                Color = new Color(0x21a9ff)
            }
            .AddField("Missed Attacks", string.IsNullOrWhiteSpace(names) ? "None :D" : names);

            if (notMirrored.Length > 0)
            {
                builder.AddField("Didn't Attack Mirror",
                                 string.Join('\n', notMirrored.Select(x => $"{x.Name}")));
            }

            await channel.SendMessageAsync(string.Join(' ',
                                                       inDiscord.Select(x => $"{_client.GetUser(x.Id)?.Mention ?? "{User Not Found}"}")),
                                           embed : builder.Build());
        }
예제 #5
0
        private async Task NeedToAttackAsync(ISocketMessageChannel channel, IEnumerable <GuildMember> guildMembers, CurrentWar currentWar)
        {
            var needToAttack = currentWar.Clan.Members.Where(x => x.Attacks.Count < 2).ToArray();

            var inDiscord = guildMembers.Where(guildMember =>
                                               guildMember.Tags.Any(tag => needToAttack.Any(x => x.Tag == tag))).ToArray();

            var mentions = string.Join('\n',
                                       inDiscord.Select(x =>
                                                        $"{_client.GetUser(x.Id)?.Mention ?? "{User Not Found}"} you need to attack!"));

            await channel.SendMessageAsync($"War ends in one hour!\n{mentions}");
        }
예제 #6
0
        private async Task <IRole> WarMatchAsync(SocketTextChannel channel, Guild guild, SocketGuild discordGuild, CurrentWar currentWar)
        {
            var result = await Utilites.CalculateWarWinnerAsync(_clash, ClanTag);

            switch (result)
            {
            case LottoDraw lottoDraw:
                var highSync = _start.GetSync();

                if (!highSync.HasValue)
                {
                    await channel.SendMessageAsync(
                        $"```css\nIt's a draw but I don't know what sync it is :(\n{result.WarLogComparison}```");

                    break;
                }

                var highTagIsClanTag = lottoDraw.HighSyncWinnerTag == lottoDraw.ClanTag;
                var sync             = highSync == true ? "high" : "low";
                var win = highSync == true ? highTagIsClanTag ? "wins" : "loses" : highTagIsClanTag ? "loses" : "wins";

                _isWin = highSync == true && highTagIsClanTag;

                await channel.SendMessageAsync(
                    $"```css\nIt is a {sync}-sync war and Reddit Rise {win}!\n{result.WarLogComparison}```");

                break;

            case LottoFailed lottoFailed:
                await channel.SendMessageAsync(lottoFailed.Reason);

                _maintenanceCts.Cancel(true);
                _maintenanceCts.Dispose();
                _maintenanceCts = new CancellationTokenSource();
                break;

            case LottoResult lottoResult:
                var lottoWinner = lottoResult.ClanWin
                        ? $"{lottoResult.ClanName}"
                        : $"{lottoResult.OpponentName}";

                await channel.SendMessageAsync(
                    $"```css\nIt is {lottoWinner}'s win!\n{result.WarLogComparison}```");

                break;
            }

            var warRole = await discordGuild.CreateRoleAsync("InWar");

            await warRole.ModifyAsync(x => x.Mentionable = true);

            var inWar        = currentWar.Clan.Members;
            var guildMembers = guild.GuildMembers;
            var inDiscord    = guildMembers.Where(guildMember =>
                                                  guildMember.Tags.Any(tag => inWar.Any(x => x.Tag == tag))).ToArray();

            foreach (var found in inDiscord.Select(x => discordGuild.GetUser(x.Id)).Where(y => !(y is null)).ToArray())
            {
                if (found.Roles.Any(x => x.Id != guild.NoNotifsRoleId))
                {
                    _ = found.AddRoleAsync(warRole);
                }
            }

            return(warRole);
        }