コード例 #1
0
        public WarReminderService(DiscordSocketClient client, ClashClient clash, DatabaseService database,
                                  StartTimeService start, LogService logger)
        {
            _client   = client;
            _clash    = clash;
            _database = database;
            _start    = start;
            _logger   = logger;

            _maintenanceCts   = new CancellationTokenSource();
            _noMaintenanceCts = new CancellationTokenSource();

            _warTcs = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously);

            _clash.Error += message =>
            {
                if (message.Reason != "inMaintenance")
                {
                    return(Task.CompletedTask);
                }

                if (!_maintenanceCts.IsCancellationRequested)
                {
                    _maintenanceCts.Cancel(true);
                    _maintenanceCts.Dispose();
                    _maintenanceCts = new CancellationTokenSource();
                }

                return(Task.CompletedTask);
            };
        }
コード例 #2
0
        public static async Task <string> GetOrderedMembersAsync(ClashClient clash, string clanTag)
        {
            var clanMembers = await clash.GetClanMembersAsync(clanTag);

            var currentWar = await clash.GetCurrentWarAsync(clanTag);

            if (currentWar.Clan.Members is null)
            {
                return("");
            }

            var warMembers = currentWar.Clan.Members;

            var membersByDonations = clanMembers.OrderByDescending(x => x.Donations);

            var i = 1;

            var donationList = string.Join('\n', membersByDonations.Select(x => $"{i++}: {Format.Sanitize(x.Name)} - **{x.Donations}**"));

            var sb = new StringBuilder();

            sb.AppendLine($"__**Members Ordered By Donations**__: \n{donationList}");

            if (currentWar.State == WarState.Ended)
            {
                var missedAttackers = warMembers.Where(x => x.Attacks.Count == 0);

                var missedList = string.Join('\n', missedAttackers.Select(x => Format.Sanitize(x.Name)));

                sb.AppendLine($"\n\n__**Missed Attackers**__:\n{missedList}");
            }

            return(sb.ToString());
        }
コード例 #3
0
        public BigBrotherService(ClashClient clash, DiscordSocketClient client, WarReminderService warReminder)
        {
            _clash       = clash;
            _client      = client;
            _warReminder = warReminder;

            _warInfo = new Dictionary <string, AttackData>(50);
        }
コード例 #4
0
ファイル: StartTimeService.cs プロジェクト: Sid-003/RiseBot-1
        public StartTimeService(DiscordSocketClient client, BandClient band, DatabaseService database, ClashClient clash)
        {
            _client      = client;
            _band        = band;
            _database    = database;
            _clash       = clash;
            _tokenSource = new CancellationTokenSource();

            _client.ReactionAdded += async(cache, channel, reaction) =>
            {
                if (cache.Id != _lastMessage?.Id || reaction.UserId == _client.CurrentUser.Id)
                {
                    return;
                }

                var user = await _client.GetOrFetchUserAsync(reaction.UserId);

                switch (reaction.Emote.Name)
                {
                case "✅":
                    await channel.SendMessageAsync(string.Empty, embed : new EmbedBuilder
                    {
                        Description = $"{user.Mention} can start war",
                        Color       = Color.Green
                    }
                                                   .Build());

                    break;

                case "❌":
                    await channel.SendMessageAsync(string.Empty, embed : new EmbedBuilder
                    {
                        Description = $"{user.Mention} cannot start war",
                        Color       = Color.Red
                    }
                                                   .Build());

                    break;

                case "⚠":
                    await channel.SendMessageAsync(string.Empty, embed : new EmbedBuilder
                    {
                        Description = $"{user.Mention} can maybe start war",
                        Color       = Color.Orange
                    }
                                                   .Build());

                    break;
                }
            };
        }
コード例 #5
0
ファイル: Bot.cs プロジェクト: Sid-003/RiseBot-1
        public async Task RunBotAsync()
        {
            var config = new Config("./config.json");

            var clashClient = new ClashClient(new ClashClientConfig
            {
                Token = config.ClashToken
            });

            var bandClient = new BandClient(new BandClientConfig
            {
                Token = config.BandToken
            });

            var asm = Assembly.GetEntryAssembly();

            _services = new ServiceCollection()
                        .AddSingleton(_client = new DiscordSocketClient(new DiscordSocketConfig
            {
                LogLevel            = LogSeverity.Verbose,
                AlwaysDownloadUsers = true,
                MessageCacheSize    = 100
            }))
                        .AddSingleton(_commands = new CommandService(new CommandServiceConfiguration
            {
                StringComparison = StringComparison.InvariantCultureIgnoreCase
            })
                                                  .AddTypeParsers(asm))
                        .AddSingleton(clashClient)
                        .AddSingleton(bandClient)
                        .AddSingleton <TaskQueue>()
                        .AddServices(asm.FindTypesWithAttribute <ServiceAttribute>())
                        .BuildServiceProvider();

            var tcs = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously);

            Task OnReadyAsync()
            {
                tcs.SetResult(true);
                _client.Ready -= OnReadyAsync;
                return(Task.CompletedTask);
            }

            _client.Ready += OnReadyAsync;

            _client.UserJoined += user =>
            {
                Task.Run(async() =>
                {
                    var guild  = _services.GetService <DatabaseService>().Guild;
                    var dGuild = _client.GetGuild(guild.Id);

                    var channel = dGuild.GetTextChannel(guild.WelcomeChannelId);
                    var role    = dGuild.GetRole(guild.NotVerifiedRoleId);

                    await user.AddRoleAsync(role);

                    var builder = new EmbedBuilder
                    {
                        Color        = new Color(0x11f711),
                        ThumbnailUrl = dGuild.CurrentUser.GetAvatarUrl(),
                        Title        = "Welcome to the Discord!",
                        Description  = $"{user.GetDisplayName()} welcome to Reddit Rise!\nHere are some premade, perfect FWA bases. Please click the link that corresponds to your TH.\n" +
                                       $"{Format.Url("TH12", "https://link.clashofclans.com/en?action=OpenLayout&id=TH12%3AWB%3AAAAAHQAAAAFw3gmOJJOUocokY9SNAt9V")}\n" +
                                       $"{Format.Url("TH11", "https://link.clashofclans.com/en?action=OpenLayout&id=TH11%3AWB%3AAAAAOwAAAAE4a6sCQApcIa9kDl5W1N3C")}\n" +
                                       $"{Format.Url("TH10", "https://link.clashofclans.com/en?action=OpenLayout&id=TH10%3AWB%3AAAAAFgAAAAF-L9A_pnLR3BtoRk7SZjD_")}\n" +
                                       $"{Format.Url("TH9", "https://link.clashofclans.com/en?action=OpenLayout&id=TH9%3AWB%3AAAAAHQAAAAFw3chc3wBw2ipMxGm6Mq8P")}\n" +
                                       "and if you're feeling nice post your in game player tag (e.g. #YRQ2Y0UC) so we know who you are!"
                    };

                    await channel.SendMessageAsync(user.Mention, embed: builder.Build());
                });
                return(Task.CompletedTask);
            };

            var logger = _services.GetService <LogService>();

            _client.Log += message =>
            {
                var(source, severity, lMessage, exception) = LogFactory.FromDiscord(message);
                return(logger.LogAsync(source, severity, lMessage, exception));
            };

            //TODO do this properly
            _client.UserLeft += (user) =>
            {
                var channel = _client.GetChannel(533650294509404181) as SocketTextChannel;
                return(channel.SendMessageAsync($"{user.GetDisplayName()} left"));
            };

            clashClient.Log   += message => logger.LogAsync(Source.Clash, Severity.Verbose, message);
            clashClient.Error += error => logger.LogAsync(Source.Clash, Severity.Error, error.Message);

            bandClient.Log   += message => logger.LogAsync(Source.Band, Severity.Verbose, message);
            bandClient.Error += error => logger.LogAsync(Source.Band, Severity.Error, error.Message);

            await _client.LoginAsync(TokenType.Bot, config.BotToken);

            await _client.StartAsync();

            _commands.AddModules(Assembly.GetEntryAssembly());

            await tcs.Task;

            _services.GetService <MessageService>();

            //Task.Run(() => _services.GetService<BigBrotherService>().RunServiceAsync());

#if !DEBUG
            Task.Run(() => _services.GetService <WarReminderService>().StartRemindersAsync());
            Task.Run(() => _services.GetService <WarReminderService>().StartPollingServiceAsync());
            Task.Run(() => _services.GetService <StartTimeService>().StartServiceAsync());
#endif

            await Task.Delay(-1);
        }
コード例 #6
0
        public static async Task <BaseLottoResult> CalculateWarWinnerAsync(ClashClient client, string clanTag)
        {
            var currentWar = await client.GetCurrentWarAsync(clanTag);

            if (currentWar is null)
            {
                return(new LottoFailed
                {
                    Reason = "API maintenance"
                });
            }

            if (currentWar.Size == 0)
            {
                return(new LottoFailed
                {
                    Reason = "API hasn't updated yet"
                });
            }

            clanTag = currentWar.Clan.Tag;
            var opponentTag = currentWar.Opponent.Tag;

            var opponentWarLog = (await client.GetWarLogAsync(opponentTag, 10)).Entity;

            if (opponentWarLog.Count == 0)
            {
                return(new LottoFailed
                {
                    Reason = "Opposition war log is private"
                });
            }

            var clanWarLog = (await client.GetWarLogAsync(clanTag, 10)).Entity;

            var trimmedClanLog     = TrimWarLog(clanWarLog).ToArray();
            var trimmedOpponentLog = TrimWarLog(opponentWarLog).ToArray();

            var clanTotal     = trimmedClanLog.Count(x => x.Result == WarResult.Lose);
            var opponentTotal = trimmedOpponentLog.Count(x => x.Result == WarResult.Lose);

            var comparison = BuildWarLongComparison(trimmedClanLog, trimmedOpponentLog);

            var draw = clanTotal == opponentTotal;

            if (!draw)
            {
                return(new LottoResult
                {
                    ClanName = currentWar.Clan.Name,
                    ClanTag = clanTag,
                    OpponentName = currentWar.Opponent.Name,
                    OpponentTag = opponentTag,
                    ClanWin = clanTotal > opponentTotal,
                    WarLogComparison = comparison
                });
            }

            var chars  = "#0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
            var result = 0;

            for (var i = 0; i < chars.Length; i++)
            {
                if (Array.IndexOf(chars, clanTag[i]) == Array.IndexOf(chars, opponentTag[i]))
                {
                    continue;
                }
                if (Array.IndexOf(chars, clanTag[i]) > Array.IndexOf(chars, opponentTag[i]))
                {
                    result = -1;
                    break;
                }
                result = 1;
                break;
            }

            return(new LottoDraw
            {
                ClanName = currentWar.Clan.Name,
                ClanTag = clanTag,
                OpponentName = currentWar.Opponent.Name,
                OpponentTag = opponentTag,
                HighSyncWinnerTag = result < 0 ? clanTag : opponentTag,
                WarLogComparison = comparison
            });
        }