private bool CheckAndParseReaction(SocketReaction reaction, out Emoji emoji, out PaginatedEmbed embed) { emoji = null; embed = null; // Message check if (!reaction.Message.IsSpecified || reaction.Message.Value.Author.IsUser() || reaction.Message.Value.Author.Id != DiscordClient.CurrentUser.Id) { return(false); } // Reaction check if (reaction.Emote is not Emoji _emoji) { return(false); } // Embed check if (reaction.Message.Value.Embeds.Count == 0 || !Embeds.TryGetValue(reaction.MessageId, out embed) || embed.ResponseFor.Id != reaction.UserId) { return(false); } emoji = _emoji; return(true); }
public async Task <RuntimeResult> ShowKinkOverlap(IUser otherUser) { var getUserKinksResult = await _kinks.GetUserKinksAsync(this.Context.User); if (!getUserKinksResult.IsSuccess) { return(getUserKinksResult.ToRuntimeResult()); } var userKinks = getUserKinksResult.Entity; var getOtherUserKinksResult = await _kinks.GetUserKinksAsync(otherUser); if (!getOtherUserKinksResult.IsSuccess) { return(getOtherUserKinksResult.ToRuntimeResult()); } var otherUserKinks = getOtherUserKinksResult.Entity; var overlap = userKinks.Intersect(otherUserKinks, new UserKinkOverlapEqualityComparer()).ToList(); if (!overlap.Any()) { return(RuntimeCommandResult.FromSuccess("You don't overlap anywhere.")); } var kinkOverlapPages = _kinks.BuildKinkOverlapEmbeds(this.Context.User, otherUser, overlap); var paginatedMessage = new PaginatedEmbed(_feedback, _interactivity, this.Context.User) .WithPages(kinkOverlapPages); await _interactivity.SendPrivateInteractiveMessageAsync(this.Context, _feedback, paginatedMessage); return(RuntimeCommandResult.FromSuccess()); }
public async Task GetCompleteEmoteInfoListAsync() { var fields = EmoteStats.GetAllValues(true, Context.Guild.Id, true) .Where(o => Context.Guild.Emotes.Any(x => x.ToString() == o.EmoteID)) .Select(o => new EmbedFieldBuilder().WithName(o.GetRealId()).WithValue(o.GetFormatedInfo())) .ToList(); var pages = new List <PaginatedEmbedPage>(); const int maxFieldsCount = EmbedBuilder.MaxFieldCount - 1; var pagesCount = Math.Ceiling((float)fields.Count / maxFieldsCount); for (int i = 0; i < pagesCount; i++) { var page = new PaginatedEmbedPage(null); page.AddFields(fields.Skip(i * maxFieldsCount).Take(maxFieldsCount)); pages.Add(page); } var embed = new PaginatedEmbed() { Title = "Kompletní statistika emotů", Pages = pages, ResponseFor = Context.User }; await SendPaginatedEmbedAsync(embed); }
public async Task ShowKinksByPreferenceAsync ( IUser otherUser, [OverrideTypeReader(typeof(HumanizerEnumTypeReader <KinkPreference>))] KinkPreference preference ) { var getUserKinksResult = await _kinks.GetUserKinksAsync(otherUser); if (!getUserKinksResult.IsSuccess) { await _feedback.SendErrorAsync(this.Context, getUserKinksResult.ErrorReason); return; } var userKinks = getUserKinksResult.Entity; var withPreference = userKinks.Where(k => k.Preference == preference).ToList(); if (!withPreference.Any()) { await _feedback.SendErrorAsync(this.Context, "The user doesn't have any kinks with that preference."); return; } var paginatedKinkPages = _kinks.BuildPaginatedUserKinkEmbeds(withPreference); var paginatedMessage = new PaginatedEmbed(_feedback, _interactivity, this.Context.User) .WithPages(paginatedKinkPages); await _interactivity.SendPrivateInteractiveMessageAsync(this.Context, _feedback, paginatedMessage); }
private async Task <PaginatedEmbed> CreatePaginatedEmbedAsync(List <Reminder> reminders, bool full = false) { var embed = new PaginatedEmbed() { Pages = new List <PaginatedEmbedPage>(), ResponseFor = Context.User, Title = full ? "Upozornění" : "Moje upozornění" }; var chunks = reminders.SplitInParts(EmbedBuilder.MaxFieldCount); foreach (var chunk in chunks) { var page = new PaginatedEmbedPage(null); foreach (var reminder in chunk) { var title = await CreateFieldTitleAsync(reminder, full); if (string.IsNullOrEmpty(title)) { continue; } page.AddField(title, $"ID: {reminder.RemindID}\nZpráva: {reminder.Message}\nZa: {(reminder.At - DateTime.Now).ToFullCzechTimeString()}"); } if (page.AnyField()) { embed.Pages.Add(page); } } return(embed); }
public async Task GetTodayBirthdayAsync() { using var service = GetService <BirthdayService>(); var birthdayUsers = await service.Service.GetUsersWithTodayBirthdayAsync(Context.Guild); if (birthdayUsers.Count == 0) { await ReplyAsync("Dnes nemá nikdo narozeniny."); return; } var pages = new List <PaginatedEmbedPage>(); foreach (var user in birthdayUsers) { var page = new PaginatedEmbedPage($"**{user.User.GetFullName()}**", thumbnail: user.User.GetUserAvatarUrl()); if (user.Birthday.Value.Year > 1) { page.AddField(new EmbedFieldBuilder().WithName("Věk").WithValue(user.Birthday.Value.ComputeDateAge())); } pages.Add(page); } var embed = new PaginatedEmbed() { Pages = pages, ResponseFor = Context.User, Title = "Dnes má narozeniny" }; await SendPaginatedEmbedAsync(embed); }
protected async Task SendPaginatedEmbedAsync(PaginatedEmbed embed) { if (PaginationService == null) { throw new InvalidOperationException("Paginated embed requires PaginationService"); } await PaginationService.SendPaginatedMessage(embed, async embed => await ReplyAsync(embed: embed)); }
public async Task ShowAvailablePronounFamiliesAsync() { EmbedFieldBuilder CreatePronounField(IPronounProvider pronounProvider) { var ef = new EmbedFieldBuilder(); ef.WithName(pronounProvider.Family); var value = $"{pronounProvider.GetSubjectForm()} ate {pronounProvider.GetPossessiveAdjectiveForm()} " + $"pie that {pronounProvider.GetSubjectForm()} brought with " + $"{pronounProvider.GetReflexiveForm()}."; value = value.Transform(To.SentenceCase); ef.WithValue($"*{value}*"); return(ef); } var pronounProviders = _pronouns.GetAvailablePronounProviders().ToList(); if (!pronounProviders.Any()) { await _feedback.SendErrorAsync(this.Context, "There doesn't seem to be any pronouns available."); return; } var fields = pronounProviders.Select(CreatePronounField); var description = "Each field below represents a pronoun that can be used with a character. The title of " + "each field is the pronoun family that you use when selecting the pronoun, and below it" + "is a short example of how it might be used."; var paginatedEmbedPages = PageFactory.FromFields ( fields, description: description ); var paginatedEmbed = new PaginatedEmbed(_feedback, _interactivity, this.Context.User).WithPages ( paginatedEmbedPages.Select ( p => p.WithColor(Color.DarkPurple).WithTitle("Available pronouns") ) ); await _interactivity.SendInteractiveMessageAndDeleteAsync ( this.Context.Channel, paginatedEmbed, TimeSpan.FromMinutes(5.0) ); }
public async Task ShowServersStatsAsync() { var guilds = await this.Context.Client.GetGuildsAsync(); var pages = guilds.Select(CreateGuildInfoEmbed); var paginatedMessage = new PaginatedEmbed(_feedback, _interactivity, this.Context.User).WithPages(pages); await _interactivity.SendPrivateInteractiveMessageAndDeleteAsync ( this.Context, _feedback, paginatedMessage ); }
public async Task SessionsListAsync() { var boosterSessions = Calculator.Sessions.Where(o => o.ForBooster); var otherSessions = Calculator.Sessions.Where(o => !o.ForBooster); var embed = new PaginatedEmbed() { Pages = new List<PaginatedEmbedPage>() { RenderPage(boosterSessions, true), RenderPage(otherSessions, false) }, ResponseFor = Context.User, Title = "Výpočetní sessions" }; await SendPaginatedEmbedAsync(embed); }
public async Task GetModulesAsync() { var moduleIdAttribute = typeof(ModuleIDAttribute); var unloadedModules = GetUnloadedModules(); var modulesChunk = CommandService.Modules .SplitInParts(EmbedBuilder.MaxFieldCount); var pages = new List <PaginatedEmbedPage>(); foreach (var chunk in modulesChunk) { var page = new PaginatedEmbedPage(null); foreach (var item in chunk) { var attribute = item.Attributes.FirstOrDefault(o => o.GetType() == moduleIdAttribute) as ModuleIDAttribute; var info = item.Name + (string.IsNullOrEmpty(item.Group) ? "" : $" ({item.Group})"); page.AddField(attribute.ID, info + (unloadedModules.Contains(attribute.ID) ? " - **Deaktivován**" : ""), false); } if (page.AnyField()) { pages.Add(page); } } if (pages.Count == 0) { await ReplyAsync("Nebyl nalezen žádný modul."); return; } var embed = new PaginatedEmbed() { Title = "Seznam modulů", Pages = pages, ResponseFor = Context.User, Thumbnail = Context.Client.CurrentUser.GetUserAvatarUrl() }; await SendPaginatedEmbedAsync(embed); }
public async Task TeamSearchInfoAsync() { var searches = await TeamSearchService.GetItemsAsync(Context.Channel.Id.ToString()); if (searches.Count == 0) { await ReplyAsync("Zatím nikdo nic nehledá."); return; } var pages = new List <PaginatedEmbedPage>(); var currentPage = new List <EmbedFieldBuilder>(); foreach (var search in searches) { var builder = new EmbedFieldBuilder() .WithName($"**{search.ID}** - **{search.ShortUsername}** v **{search.ChannelName}**") .WithValue($"\"{search.Message}\" [Jump]({search.MessageLink})"); currentPage.Add(builder); if (currentPage.Count == EmbedBuilder.MaxFieldCount) { pages.Add(new PaginatedEmbedPage(null, new List <EmbedFieldBuilder>(currentPage))); currentPage.Clear(); } } if (currentPage.Count != 0) { pages.Add(new PaginatedEmbedPage(null, new List <EmbedFieldBuilder>(currentPage))); } var embed = new PaginatedEmbed() { Pages = pages, ResponseFor = Context.User, Title = $"Hledání v {Context.Channel.Name}" }; await SendPaginatedEmbedAsync(embed); }
public async Task <RuntimeResult> ShowAutoroleAsync(AutoroleConfiguration autorole) { var paginatedEmbed = new PaginatedEmbed(_feedback, _interactivity, this.Context.User) { Appearance = PaginatedAppearanceOptions.Default }; var baseEmbed = paginatedEmbed.Appearance.CreateEmbedBase() .WithTitle("Autorole Configuration") .WithDescription(MentionUtils.MentionRole((ulong)autorole.DiscordRoleID)) .AddField("Requires confirmation", autorole.RequiresConfirmation, true) .AddField("Is enabled", autorole.IsEnabled, true); if (!autorole.Conditions.Any()) { baseEmbed.AddField("Conditions", "No conditions"); baseEmbed.Footer = null; await _feedback.SendEmbedAsync(this.Context.Channel, baseEmbed.Build()); return(RuntimeCommandResult.FromSuccess()); } var conditionFields = autorole.Conditions.Select ( c => new EmbedFieldBuilder() .WithName($"Condition #{autorole.Conditions.IndexOf(c)} (ID {c.ID})") .WithValue(c.GetDescriptiveUIText()) ); var pages = PageFactory.FromFields(conditionFields, pageBase: baseEmbed); paginatedEmbed.WithPages(pages); await _interactivity.SendInteractiveMessageAndDeleteAsync ( this.Context.Channel, paginatedEmbed, TimeSpan.FromMinutes(5) ); return(RuntimeCommandResult.FromSuccess()); }
private async Task PrintSearchesAsync(List <TeamSearchItem> searches, bool allChannels = false) { if (searches.Count == 0) { await ReplyAsync("Zatím nikdo nic nehledá."); return; } var pages = new List <PaginatedEmbedPage>(); var currentPage = new List <EmbedFieldBuilder>(); foreach (var search in searches) { var builder = new EmbedFieldBuilder() .WithName($"**{search.ID}** - **{search.ShortUsername}**{(allChannels ? $" v **{search.ChannelName}**" : "")}") .WithValue($"\"{search.Message}\" [Jump]({search.MessageLink})"); currentPage.Add(builder); if (currentPage.Count == 10) { pages.Add(new PaginatedEmbedPage(null, new List <EmbedFieldBuilder>(currentPage))); currentPage.Clear(); } } if (currentPage.Count != 0) { pages.Add(new PaginatedEmbedPage(null, new List <EmbedFieldBuilder>(currentPage))); } var embed = new PaginatedEmbed() { Pages = pages, ResponseFor = Context.User, Title = allChannels ? "Hledání" : $"Hledání v {Context.Channel.Name}" }; await SendPaginatedEmbedAsync(embed); }
public async Task ListItemsAsync() { using var service = GetService <AutoReplyService>(); var data = service.Service.GetList(Context.Guild); if (data.Count == 0) { await ReplyAsync("Ještě nejsou uloženy žádné odpovědi."); return; } var pages = new List <PaginatedEmbedPage>(); foreach (var item in data) { var page = new PaginatedEmbedPage($"**{item.ID} - {item.MustContains}**"); var builder = new EmbedFieldBuilder() .WithName($"Odpověď: {item.Reply}") .WithValue(string.Join("\n", new[] { $"Status: {(item.IsActive ? "Aktivní" : "Neaktivní")}", $"Metoda: {item.CompareType}", $"Počet použití: {item.CallsCount.FormatWithSpaces()}", $"Case sensitive: {(item.CaseSensitive ? "Ano" : "Ne")}", $"Kanál: {item.Channel}" })); page.AddField(builder); pages.Add(page); } var embed = new PaginatedEmbed() { Title = "Automatické odpovědi", ResponseFor = Context.User, Pages = pages }; await SendPaginatedEmbedAsync(embed); }
public async Task GetCompleteRoleListAsync() { var chunks = Context.Guild.Roles .Where(o => !o.IsEveryone) .OrderByDescending(o => o.Position) .Select(o => new EmbedFieldBuilder().WithName(o.Name).WithValue(CreateRoleInfo(o, false))) .SplitInParts(EmbedBuilder.MaxEmbedLength) .ToList(); var highestRoleWithColor = Context.Guild.Roles.FindHighestRoleWithColor(); var paginatedEmbed = new PaginatedEmbed() { Color = highestRoleWithColor?.Color ?? Color.Blue, Pages = chunks.ConvertAll(ch => new PaginatedEmbedPage(null, ch.ToList())), Thumbnail = Context.Guild.IconUrl, Title = "Informace o rolích", ResponseFor = Context.User }; await SendPaginatedEmbedAsync(paginatedEmbed); }
public async Task GetAccessListAsync(IUser user) { var guildUser = user as SocketGuildUser; await Context.Guild.SyncGuildAsync(); var textChannels = Context.Guild.TextChannels .OrderBy(o => o.Position) .Where(o => o.HaveAccess(guildUser)) .GroupBy(o => o.Category?.Name ?? "Neznámá kategorie") .Select(o => new { Category = o.Key, Channels = o.SplitInParts(30).Select(x => x.Select(t => $"<#{t.Id}>")) }); var voiceChannels = Context.Guild.VoiceChannels .OrderBy(o => o.Position) .Where(o => o.HaveAccess(guildUser)) .GroupBy(o => o.Category?.Name ?? "Neznámá kategorie") .Select(o => new { Category = o.Key, Channels = o.SplitInParts(30).Select(x => x.Select(t => $"<#{t.Id}>")) }); var finalList = textChannels.ToList(); finalList.AddRange(voiceChannels); var pages = finalList.SplitInParts(10).Select(o => { var fields = o.SelectMany(x => x.Channels.Select(t => new EmbedFieldBuilder().WithName(x.Category).WithValue(string.Join(", ", t)))).ToList(); return(new PaginatedEmbedPage(null, fields)); }); var embed = new PaginatedEmbed() { Color = guildUser.Roles.FindHighestRoleWithColor()?.Color, Pages = pages.ToList(), ResponseFor = Context.User, Thumbnail = user.GetUserAvatarUrl(), Title = $"Seznam přístupů uživatele {user.GetFullName()}" }; await SendPaginatedEmbedAsync(embed); }
public async Task ShowKinkOverlap([NotNull] IUser otherUser) { var getUserKinksResult = await _kinks.GetUserKinksAsync(this.Context.User); if (!getUserKinksResult.IsSuccess) { await _feedback.SendErrorAsync(this.Context, getUserKinksResult.ErrorReason); return; } var userKinks = getUserKinksResult.Entity; var getOtherUserKinksResult = await _kinks.GetUserKinksAsync(otherUser); if (!getOtherUserKinksResult.IsSuccess) { await _feedback.SendErrorAsync(this.Context, getOtherUserKinksResult.ErrorReason); return; } var otherUserKinks = getOtherUserKinksResult.Entity; var overlap = userKinks.Intersect(otherUserKinks, new UserKinkOverlapEqualityComparer()).ToList(); if (!overlap.Any()) { await _feedback.SendErrorAsync(this.Context, "You don't overlap anywhere."); return; } var kinkOverlapPages = _kinks.BuildKinkOverlapEmbeds(this.Context.User, otherUser, overlap); var paginatedMessage = new PaginatedEmbed(_feedback, this.Context.User).WithPages(kinkOverlapPages); await _interactivity.SendPrivateInteractiveMessageAsync(this.Context, _feedback, paginatedMessage); }
public async Task ListMethodsAsync() { var embed = new PaginatedEmbed() { Pages = new List <PaginatedEmbedPage>(), ResponseFor = Context.User, Thumbnail = Context.Client.CurrentUser.GetUserAvatarUrl(), Title = "Konfigurace metod" }; using var service = GetService <IGrillBotRepository>(); var methods = await service.Service.ConfigRepository.GetAllMethods(Context.Guild.Id, true).ToListAsync(); foreach (var group in methods.GroupBy(o => o.Group)) { var page = new PaginatedEmbedPage(null); foreach (var method in group) { var value = string.Join("\n", new[] { $"ID: **{method.ID}**", $"Počet oprávnění: **{method.Permissions.Count.FormatWithSpaces()}**", $"Počet použití: **{method.UsedCount.FormatWithSpaces()}**" }); page.AddField($"{method.Group}/{method.Command}", value); } if (page.AnyField()) { embed.Pages.Add(page); } } await SendPaginatedEmbedAsync(embed); }
public async Task SendPaginatedMessage(PaginatedEmbed embed, Func <Embed, Task <IUserMessage> > replyAsync) { var embedData = embed.RenderEmbed(); var message = await replyAsync(embedData); if (embed.Pages.Count > 1) { if (embed.Pages.Count > 2) { await message.AddReactionAsync(FirstPageEmoji); } await message.AddReactionAsync(PrevPageEmoji); await message.AddReactionAsync(NextPageEmoji); if (embed.Pages.Count > 2) { await message.AddReactionAsync(LastPageEmoji); } AddEmbed(message, embed); } }
public async Task ListUnverifyAsync() { var users = await UnverifyService.ListPersonsAsync(Context.Guild); if (users.Count == 0) { await ReplyAsync("Nikdo zatím nemá odebraný přístup."); return; } var pages = new List <PaginatedEmbedPage>(); foreach (var user in users) { var page = new PaginatedEmbedPage($"**{user.Username}**"); page.AddField(new EmbedFieldBuilder().WithName("ID").WithValue(user.ID)); page.AddField(new EmbedFieldBuilder().WithName("Do kdy").WithValue(user.EndDateTime.ToLocaleDatetime())); page.AddField(new EmbedFieldBuilder().WithName("Role").WithValue(string.Join(", ", user.Roles))); page.AddField(new EmbedFieldBuilder().WithName("Extra kanály").WithValue(user.ChannelOverrideList)); page.AddField(new EmbedFieldBuilder().WithName("Důvod").WithValue(user.Reason)); pages.Add(page); } var embed = new PaginatedEmbed() { Title = "Seznam osob s odebraným přístupem", Pages = pages, ResponseFor = Context.User, Thumbnail = Context.Client.CurrentUser.GetUserAvatarUrl() }; await SendPaginatedEmbedAsync(embed); }
public async Task SendPaginatedMessage(PaginatedEmbed embed, Func <Embed, Task <IUserMessage> > replyAsync) { var embedData = embed.RenderEmbed(); var message = await replyAsync(embedData); if (embed.Pages.Count > 1) { if (embed.Pages.Count > 2) { await message.AddReactionAsync(EmojiHelper.TrackPrevious); } await message.AddReactionAsync(EmojiHelper.ArrowBackward); await message.AddReactionAsync(EmojiHelper.ArrowForward); if (embed.Pages.Count > 2) { await message.AddReactionAsync(EmojiHelper.TrackNext); } AddEmbed(message, embed); } }
public void AddEmbed(IMessage message, PaginatedEmbed embed) { Embeds.Add(message.Id, embed); }
public async Task ListUnverifyAsync() { using var service = GetService <UnverifyService>(); var profiles = await service.Service.GetCurrentUnverifies(Context.Guild); if (profiles.Count == 0) { await ReplyAsync("Nikdo zatím nemá odebraný přístup."); return; } var pages = new List <PaginatedEmbedPage>(); foreach (var profile in profiles.Select(o => o.Profile)) { var page = new PaginatedEmbedPage($"**{profile.DestinationUser.GetFullName()}**", thumbnail: profile.DestinationUser.GetUserAvatarUrl()); page.AddField("ID", profile.DestinationUser.Id.ToString()); page.AddField("Začátek", profile.StartDateTime.ToLocaleDatetime(), true); page.AddField("Konec", profile.EndDateTime.ToLocaleDatetime(), true); page.AddField("Končí za", (profile.EndDateTime - DateTime.Now).ToFullCzechTimeString(), true); if (profile.RolesToKeep.Count > 0) { foreach (var chunk in profile.RolesToKeep.Select(o => o.Mention).SplitInParts(40)) { page.AddField("Ponechané role", string.Join(", ", chunk)); } } if (profile.RolesToRemove.Count > 0) { foreach (var chunk in profile.RolesToRemove.Select(o => o.Mention).SplitInParts(40)) { page.AddField("Odebrané role", string.Join(", ", chunk)); } } if (profile.ChannelsToKeep.Count > 0) { foreach (var chunk in profile.ChannelsToKeep.Select(o => $"<#{o.Channel.Id}>").SplitInParts(40)) { page.AddField("Ponechané kanály", string.Join(", ", chunk)); } } if (profile.ChannelsToRemove.Count > 0) { foreach (var chunk in profile.ChannelsToRemove.Select(o => $"<#{o.Channel.Id}>").SplitInParts(40)) { page.AddField("Odebrané kanály", string.Join(", ", chunk)); } } page.AddField("Důvod", profile.Reason); pages.Add(page); } var embed = new PaginatedEmbed() { Title = "Seznam osob s odebraným přístupem", Pages = pages, ResponseFor = Context.User, Thumbnail = Context.Client.CurrentUser.GetUserAvatarUrl() }; await SendPaginatedEmbedAsync(embed); }