public async Task UnscheduleGuildEvent(CommandContext context) { using IBotAccessProvider provider = this.accessBuilder.Build(); InteractivityExtension interactivity = context.Client.GetInteractivity(); DiscordMessage msg = await context.RespondAsync( $":wave: Hi, {context.User.Mention}! You want to unschedule an event for your guild?"); Reaction reaction = await interactivity.AddAndWaitForYesNoReaction(msg, context.User); if (reaction != Reaction.Yes) { return; } await context.Message.DeleteAsync(); DateTimeZone memberTimeZone = this.timeZoneProvider[provider.GetUsersTimeZone(context.User.Id).TimeZoneId]; List <GuildBackgroundJob> guildEventJobs = provider.GetAllAssociatedGuildBackgroundJobs(context.Guild.Id) .Where(x => x.GuildJobType == GuildJobType.SCHEDULED_EVENT) .OrderBy(x => x.ScheduledTime) .ToList(); DiscordEmbedBuilder removeEventEmbed = new DiscordEmbedBuilder() .WithTitle("Select an event to unschedule by typing: <event number>") .WithColor(context.Member.Color); CustomResult <int> result = await context.WaitForMessageAndPaginateOnMsg( GetScheduledEventsPages(guildEventJobs.Select(x => x.WithTimeZoneConvertedTo(memberTimeZone)), interactivity, removeEventEmbed), PaginationMessageFunction.CreateWaitForMessageWithIntInRange(context.User, context.Channel, 1, guildEventJobs.Count + 1), msg : msg); if (result.TimedOut || result.Cancelled) { DiscordMessage snark = await context.RespondAsync("You never gave me a valid input. Thanks for wasting my time. :triumph:"); await Task.Delay(5000); await context.Channel.DeleteMessagesAsync(new List <DiscordMessage> { msg, snark }); return; } GuildBackgroundJob job = guildEventJobs[result.Result - 1]; msg = await msg.ModifyAsync($"{context.User.Mention}, are you sure you want to unschedule this event?", embed : null); reaction = await interactivity.AddAndWaitForYesNoReaction(msg, context.User); BackgroundJob.Delete(job.HangfireJobId); provider.DeleteGuildBackgroundJob(job); await msg.DeleteAllReactionsAsync(); await msg.ModifyAsync("Ok, I've unscheduled that event!", embed : null); }
public async Task DeleteAsync(CommandContext context) { DbResult <IEnumerable <GuildMovieNight> > getMovieNightsResult = await this.mediator.Send(new GuildMovieNights.GetAllGuildsMovieNights(context.Guild.Id)); if (!getMovieNightsResult.TryGetValue(out IEnumerable <GuildMovieNight>?guildMovieNights)) { throw new Exception("An error occured while retrieving guild movie nights"); } bool hasManageServer = context.Member.Roles.Select(x => x.CheckPermission(Permissions.ManageGuild)).Any(); if (!hasManageServer) { guildMovieNights = guildMovieNights.Where(mn => mn.HostId == context.Member.Id); } List <GuildMovieNight> movieNights = guildMovieNights.ToList(); InteractivityExtension interactivity = context.Client.GetInteractivity(); IEnumerable <Page> pages = await GetGuildMovieNightsPages(context.Guild, movieNights, interactivity, hasManageServer); CustomResult <int> result = await context.WaitForMessageAndPaginateOnMsg(pages, PaginationMessageFunction.CreateWaitForMessageWithIntInRange(context.User, context.Channel, 1, movieNights.Count + 1) ); if (result.TimedOut || result.Cancelled) { await context.RespondAsync("You never gave me a valid input. Please try again if so desired."); return; } Reaction reaction = await interactivity.AddAndWaitForYesNoReaction(await context.Channel.SendMessageAsync($"You want me to do delete movie night {result.Result}?"), context.Member); if (reaction != Reaction.Yes) { await context.Channel.SendMessageAsync("Ok!"); return; } GuildMovieNight chosen = movieNights[result.Result - 1]; RecurringJob.RemoveIfExists(chosen.MovieNightStartHangfireId); RecurringJob.RemoveIfExists(chosen.VotingStartHangfireId); RecurringJob.RemoveIfExists(chosen.VotingEndHangfireId); await this.mediator.Send(new GuildMovieNights.Delete(chosen)); await context.Channel.SendMessageAsync($"{context.Member.Mention}, I have deleted movie night {result.Result}"); }
public async Task UnsuggestAsync(CommandContext context) { DbResult <IEnumerable <GuildMovieSuggestion> > suggestionsResult = await GetSuggestionsResult(context); if (!suggestionsResult.TryGetValue(out IEnumerable <GuildMovieSuggestion>?result)) { await context.RespondAsync("Something went wrong while attempting to get the suggestions. Please contact the developer."); return; } if (!result.Any()) { await context.RespondAsync("You do not have any suggestions to delete."); return; } List <GuildMovieSuggestion> suggestions = result.ToList(); InteractivityExtension interactivity = context.Client.GetInteractivity(); IEnumerable <Page> pages = GetGuildMovieSuggestionsPages(suggestions.ToList(), interactivity); CustomResult <int> waitResult = await context.WaitForMessageAndPaginateOnMsg(pages, PaginationMessageFunction.CreateWaitForMessageWithIntInRange(context.User, context.Channel, 1, suggestions.Count + 1) ); if (waitResult.Cancelled) { await context.RespondAsync("Ok, I won't delete any suggestion. Please try again if so desired."); return; } if (waitResult.TimedOut) { await context.RespondAsync("You never gave me a valid input. Please try again if so desired."); return; } Reaction reaction = await interactivity.AddAndWaitForYesNoReaction( await context.Channel.SendMessageAsync($"You want me to do delete the suggestion `{suggestions[waitResult.Result - 1].Title}`?"), context.Member ); if (reaction != Reaction.Yes) { await context.Channel.SendMessageAsync("Ok!"); return; } GuildMovieSuggestion chosen = suggestions[waitResult.Result - 1]; await this.mediator.Send(new GuildMovieSuggestions.Delete(chosen)); await context.Channel.SendMessageAsync($"{context.Member.Mention}, I have deleted the suggestion `{suggestions[waitResult.Result - 1].Title}`"); }
private static async Task <GuildEvent> SelectPredefinedEvent(CommandContext context, IBotAccessProvider provider, DiscordMessage msg, InteractivityExtension interactivity, DiscordEmbedBuilder scheduleEmbedBase) { List <GuildEvent> guildEvents = provider.GetAllAssociatedGuildEvents(context.Guild.Id).ToList(); IEnumerable <Page> pages = GetGuildEventsPages(guildEvents, interactivity, scheduleEmbedBase); CustomResult <int> result = await context.WaitForMessageAndPaginateOnMsg(pages, PaginationMessageFunction.CreateWaitForMessageWithIntInRange(context.User, context.Channel, 1, guildEvents.Count + 1), msg : msg ); if (result.TimedOut || result.Cancelled) { DiscordMessage snark = await context.RespondAsync("You never gave me a valid input. Thanks for wasting my time. :triumph:"); await Task.Delay(5000); await context.Channel.DeleteMessagesAsync(new List <DiscordMessage> { msg, snark }); return(null); } return(guildEvents[result.Result - 1]); }