From 9b97ec236b3523ad802acda67ff9185a9e5e163e Mon Sep 17 00:00:00 2001 From: NovaFox161 Date: Thu, 5 Aug 2021 09:43:15 -0400 Subject: [PATCH] Convert !time to slash command, /time [calNumber] respectively --- .../message/CalendarMessageFormatter.java | 32 ----- .../client/module/command/TimeCommand.java | 119 ------------------ .../discal/client/DisCalClient.kt | 1 - .../discal/client/commands/TimeCommand.kt | 33 +++++ .../discal/client/message/Responder.kt | 22 +++- .../client/message/embed/CalendarEmbed.kt | 34 +++++ core/src/main/resources/commands/time.json | 13 ++ 7 files changed, 100 insertions(+), 154 deletions(-) delete mode 100644 client/src/main/java/org/dreamexposure/discal/client/module/command/TimeCommand.java create mode 100644 client/src/main/kotlin/org/dreamexposure/discal/client/commands/TimeCommand.kt create mode 100644 core/src/main/resources/commands/time.json diff --git a/client/src/main/java/org/dreamexposure/discal/client/message/CalendarMessageFormatter.java b/client/src/main/java/org/dreamexposure/discal/client/message/CalendarMessageFormatter.java index 5bd1bae4..359dc2a7 100644 --- a/client/src/main/java/org/dreamexposure/discal/client/message/CalendarMessageFormatter.java +++ b/client/src/main/java/org/dreamexposure/discal/client/message/CalendarMessageFormatter.java @@ -22,11 +22,6 @@ public class CalendarMessageFormatter { return BotSettings.BASE_URL.get() + "/embed/" + guildId.asString() + "/calendar/1"; } - @Deprecated - public static String getCalendarLink(final Snowflake guildId, final int calNumber) { - return BotSettings.BASE_URL.get() + "/embed/" + guildId.asString() + "/calendar/" + calNumber; - } - @Deprecated public static Mono getCalendarLinkEmbed(final Calendar cal, final GuildSettings settings) { return DisCalClient.getClient().getGuildById(settings.getGuildID()).map(g -> { @@ -55,33 +50,6 @@ public class CalendarMessageFormatter { }); } - @Deprecated - public static Mono getCalendarLinkEmbed(final Calendar cal, final int calNum, final GuildSettings settings) { - return DisCalClient.getClient().getGuildById(settings.getGuildID()).map(g -> { - var builder = EmbedCreateSpec.builder(); - - if (settings.getBranded()) - builder.author(g.getName(), BotSettings.BASE_URL.get(), - g.getIconUrl(Image.Format.PNG).orElse(GlobalVal.getIconUrl())); - else - builder.author("DisCal", BotSettings.BASE_URL.get(), GlobalVal.getIconUrl()); - - builder.title(Messages.getMessage("Embed.Calendar.Link.Title", settings)); - - if (cal.getSummary() != null) - builder.addField(Messages.getMessage("Embed.Calendar.Link.Summary", settings), cal.getSummary(), true); - - if (cal.getDescription() != null) - builder.addField(Messages.getMessage("Embed.Calendar.Link.Description", settings), cal.getDescription(), true); - - builder.addField(Messages.getMessage("Embed.Calendar.Link.TimeZone", settings), cal.getTimeZone(), false); - builder.url(CalendarMessageFormatter.getCalendarLink(settings.getGuildID(), calNum)); - builder.footer(Messages.getMessage("Embed.Calendar.Link.CalendarId", "%id%", cal.getId(), settings), null); - builder.color(GlobalVal.getDiscalColor()); - - return builder.build(); - }); - } public static Mono getPreCalendarEmbed(final PreCalendar calendar, final GuildSettings settings) { return DisCalClient.getClient().getGuildById(settings.getGuildID()).map(g -> { diff --git a/client/src/main/java/org/dreamexposure/discal/client/module/command/TimeCommand.java b/client/src/main/java/org/dreamexposure/discal/client/module/command/TimeCommand.java deleted file mode 100644 index 1e3a454a..00000000 --- a/client/src/main/java/org/dreamexposure/discal/client/module/command/TimeCommand.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.dreamexposure.discal.client.module.command; - -import discord4j.core.event.domain.message.MessageCreateEvent; -import discord4j.core.spec.EmbedCreateSpec; -import discord4j.rest.util.Image; -import org.dreamexposure.discal.client.message.CalendarMessageFormatter; -import org.dreamexposure.discal.client.message.Messages; -import org.dreamexposure.discal.core.database.DatabaseManager; -import org.dreamexposure.discal.core.object.BotSettings; -import org.dreamexposure.discal.core.object.GuildSettings; -import org.dreamexposure.discal.core.object.command.CommandInfo; -import org.dreamexposure.discal.core.utils.GlobalVal; -import org.dreamexposure.discal.core.wrapper.google.CalendarWrapper; -import reactor.core.publisher.Mono; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; - -/** - * Created by Nova Fox on 6/16/17. - * Website: www.cloudcraftgaming.com - * For Project: DisCal - */ -public class TimeCommand implements Command { - - /** - * Gets the command this Object is responsible for. - * - * @return The command this Object is responsible for. - */ - @Override - public String getCommand() { - return "time"; - } - - /** - * Gets the short aliases of the command this object is responsible for. - *
- * This will return an empty ArrayList if none are present - * - * @return The aliases of the command. - */ - @Override - public ArrayList getAliases() { - return new ArrayList<>(); - } - - /** - * Gets the info on the command (not sub command) to be used in help menus. - * - * @return The command info. - */ - @Override - public CommandInfo getCommandInfo() { - return new CommandInfo( - "time", - "Displays the current time for the calendar in its respective TimeZone.", - "!time" - ); - } - - /** - * Issues the command this Object is responsible for. - * - * @param args The command arguments. - * @param event The event received. - * @param settings The guild settings. - * @return {@code true} if successful, else {@code false}. - */ - @Override - public Mono issueCommand(final String[] args, final MessageCreateEvent event, final GuildSettings settings) { - return this.calendarTime(event, settings); - } - - //TODO: Support multiple calendars - private Mono calendarTime(final MessageCreateEvent event, final GuildSettings settings) { - return DatabaseManager.INSTANCE.getMainCalendar(settings.getGuildID()) - .flatMap(calData -> CalendarWrapper.INSTANCE.getCalendar(calData).flatMap(cal -> { - final LocalDateTime ldt = LocalDateTime.now(ZoneId.of(cal.getTimeZone())); - - DateTimeFormatter fmt; - if (settings.getTwelveHour()) fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss a"); - else fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); - - - final String correctTime = fmt.format(ldt); - - return event.getGuild().map(guild -> { - var builder = EmbedCreateSpec.builder(); - if (settings.getBranded()) { - builder.author(guild.getName(), BotSettings.BASE_URL.get(), - guild.getIconUrl(Image.Format.PNG).orElse(GlobalVal.getIconUrl())); - } else { - builder.author("DisCal", BotSettings.BASE_URL.get(), - GlobalVal.getIconUrl()); - } - - builder.title(Messages.getMessage("Embed.Time.Title", settings)); - - builder.addField(Messages.getMessage("Embed.Time.Time", settings), correctTime, false); - - builder.addField(Messages.getMessage("Embed.Time.TimeZone", settings), cal.getTimeZone(), false); - - builder.footer(Messages.getMessage("Embed.Time.Footer", settings), null); - builder.url(CalendarMessageFormatter.getCalendarLink(settings.getGuildID(), - calData.getCalendarNumber())); - - builder.color(GlobalVal.getDiscalColor()); - - return builder.build(); - }).flatMap(embed -> Messages.sendMessage(embed, event)); - })) - .switchIfEmpty(Messages.sendMessage( - Messages.getMessage("Creator.Calendar.NoCalendar", settings), event)) - .then(); - } -} diff --git a/client/src/main/kotlin/org/dreamexposure/discal/client/DisCalClient.kt b/client/src/main/kotlin/org/dreamexposure/discal/client/DisCalClient.kt index 3ba8bfe8..89ddd441 100644 --- a/client/src/main/kotlin/org/dreamexposure/discal/client/DisCalClient.kt +++ b/client/src/main/kotlin/org/dreamexposure/discal/client/DisCalClient.kt @@ -66,7 +66,6 @@ class DisCalClient { CommandExecutor.registerCommand(DisCalCommand()) CommandExecutor.registerCommand(CalendarCommand()) CommandExecutor.registerCommand(AddCalendarCommand()) - CommandExecutor.registerCommand(TimeCommand()) CommandExecutor.registerCommand(EventListCommand()) CommandExecutor.registerCommand(EventCommand()) CommandExecutor.registerCommand(RsvpCommand()) diff --git a/client/src/main/kotlin/org/dreamexposure/discal/client/commands/TimeCommand.kt b/client/src/main/kotlin/org/dreamexposure/discal/client/commands/TimeCommand.kt new file mode 100644 index 00000000..331957a1 --- /dev/null +++ b/client/src/main/kotlin/org/dreamexposure/discal/client/commands/TimeCommand.kt @@ -0,0 +1,33 @@ +package org.dreamexposure.discal.client.commands + +import discord4j.core.`object`.command.ApplicationCommandInteractionOptionValue +import discord4j.core.event.domain.interaction.SlashCommandEvent +import org.dreamexposure.discal.client.message.Responder +import org.dreamexposure.discal.client.message.embed.CalendarEmbed +import org.dreamexposure.discal.core.`object`.GuildSettings +import org.springframework.stereotype.Component +import reactor.core.publisher.Mono + +@Component +class TimeCommand : SlashCommand { + override val name = "time" + override val ephemeral = true + + override fun handle(event: SlashCommandEvent, settings: GuildSettings): Mono { + return Mono.justOrEmpty(event.getOption("number")) + .flatMap { Mono.justOrEmpty(it.value) } + .map(ApplicationCommandInteractionOptionValue::asLong) + .map(Long::toInt) + .defaultIfEmpty(1) + .flatMap { calNumber -> + event.interaction.guild.flatMap { guild -> + CalendarEmbed.getTimeEmbed(guild, settings, calNumber).flatMap { + Responder.followupEphemeral(event, it) + } + }.switchIfEmpty( + //TODO: i18n + Responder.followupEphemeral(event, "Calendar not found. Perhaps you should create a new one?") + ) + }.then() + } +} diff --git a/client/src/main/kotlin/org/dreamexposure/discal/client/message/Responder.kt b/client/src/main/kotlin/org/dreamexposure/discal/client/message/Responder.kt index 8391e387..e0629e6d 100644 --- a/client/src/main/kotlin/org/dreamexposure/discal/client/message/Responder.kt +++ b/client/src/main/kotlin/org/dreamexposure/discal/client/message/Responder.kt @@ -24,8 +24,26 @@ object Responder { return sendFollowup(event, spec) } + fun followupEphemeral(event: InteractionCreateEvent, embed: EmbedCreateSpec): Mono { + val spec = WebhookExecuteRequest.builder() + .addEmbed(embed.asRequest()) + .build() - private fun sendFollowup(event: InteractionCreateEvent, request: WebhookExecuteRequest): Mono { - return event.interactionResponse.createFollowupMessage(MultipartRequest.ofRequest(request)) + return sendFollowupEphemeral(event, spec) } + + fun followupEphemeral(event: InteractionCreateEvent, message: String): Mono { + val spec = WebhookExecuteRequest.builder() + .content(message) + .build() + + return sendFollowupEphemeral(event, spec) + } + + + private fun sendFollowup(event: InteractionCreateEvent, request: WebhookExecuteRequest) = + event.interactionResponse.createFollowupMessage(MultipartRequest.ofRequest(request)) + + private fun sendFollowupEphemeral(event: InteractionCreateEvent, request: WebhookExecuteRequest) = + event.interactionResponse.createFollowupMessageEphemeral(MultipartRequest.ofRequest(request)) } diff --git a/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/CalendarEmbed.kt b/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/CalendarEmbed.kt index 8475c781..14399805 100644 --- a/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/CalendarEmbed.kt +++ b/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/CalendarEmbed.kt @@ -10,6 +10,8 @@ import org.dreamexposure.discal.core.extensions.discord4j.getCalendar import org.dreamexposure.discal.core.utils.GlobalVal.discalColor import org.dreamexposure.discal.core.utils.GlobalVal.iconUrl import reactor.core.publisher.Mono +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter object CalendarEmbed { fun getLinkCalEmbed(guild: Guild, settings: GuildSettings, calNumber: Int): Mono { @@ -33,4 +35,36 @@ object CalendarEmbed { builder.build() } } + + fun getTimeEmbed(guild: Guild, settings: GuildSettings, calNumber: Int): Mono { + return guild.getCalendar(calNumber).map { cal -> + val ldt = LocalDateTime.now(cal.timezone) + + val fmt: DateTimeFormatter = + if (settings.twelveHour) + DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss a") + else + DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss") + + + val correctTime = fmt.format(ldt) + + val builder = EmbedCreateSpec.builder() + + if (settings.branded) + builder.author(guild.name, BotSettings.BASE_URL.get(), guild.getIconUrl(Image.Format.PNG).orElse(iconUrl)) + else + builder.author("DisCal", BotSettings.BASE_URL.get(), iconUrl) + + builder.title(Messages.getMessage("Embed.Time.Title", settings)) + builder.addField(Messages.getMessage("Embed.Time.Time", settings), correctTime, false) + builder.addField(Messages.getMessage("Embed.Time.TimeZone", settings), cal.zoneName, false) + builder.footer(Messages.getMessage("Embed.Time.Footer", settings), null) + builder.url(cal.link) + + builder.color(discalColor) + + builder.build() + } + } } diff --git a/core/src/main/resources/commands/time.json b/core/src/main/resources/commands/time.json new file mode 100644 index 00000000..5f09f32c --- /dev/null +++ b/core/src/main/resources/commands/time.json @@ -0,0 +1,13 @@ +{ + "name": "time", + "description": "Displays the current time as seen by the calendar's timezone", + "options": [ + { + "name": "number", + "type": 4, + "description": "The number of the calendar you wish to use (default 1)", + "required": false + } + ], + "default_permissions": true +}