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); }; }
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()); }
public BigBrotherService(ClashClient clash, DiscordSocketClient client, WarReminderService warReminder) { _clash = clash; _client = client; _warReminder = warReminder; _warInfo = new Dictionary <string, AttackData>(50); }
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; } }; }
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); }
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 }); }