Convert !time to slash command, /time [calNumber] respectively

This commit is contained in:
NovaFox161
2021-08-05 09:43:15 -04:00
parent a23ffb93e8
commit 9b97ec236b
7 changed files with 100 additions and 154 deletions

View File

@@ -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<EmbedCreateSpec> 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<EmbedCreateSpec> 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<EmbedCreateSpec> getPreCalendarEmbed(final PreCalendar calendar, final GuildSettings settings) {
return DisCalClient.getClient().getGuildById(settings.getGuildID()).map(g -> {

View File

@@ -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.
* <br>
* This will return an empty ArrayList if none are present
*
* @return The aliases of the command.
*/
@Override
public ArrayList<String> 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<Void> issueCommand(final String[] args, final MessageCreateEvent event, final GuildSettings settings) {
return this.calendarTime(event, settings);
}
//TODO: Support multiple calendars
private Mono<Void> 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();
}
}

View File

@@ -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())

View File

@@ -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<Void> {
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()
}
}

View File

@@ -24,8 +24,26 @@ object Responder {
return sendFollowup(event, spec)
}
fun followupEphemeral(event: InteractionCreateEvent, embed: EmbedCreateSpec): Mono<MessageData> {
val spec = WebhookExecuteRequest.builder()
.addEmbed(embed.asRequest())
.build()
private fun sendFollowup(event: InteractionCreateEvent, request: WebhookExecuteRequest): Mono<MessageData> {
return event.interactionResponse.createFollowupMessage(MultipartRequest.ofRequest(request))
return sendFollowupEphemeral(event, spec)
}
fun followupEphemeral(event: InteractionCreateEvent, message: String): Mono<MessageData> {
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))
}

View File

@@ -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<EmbedCreateSpec> {
@@ -33,4 +35,36 @@ object CalendarEmbed {
builder.build()
}
}
fun getTimeEmbed(guild: Guild, settings: GuildSettings, calNumber: Int): Mono<EmbedCreateSpec> {
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()
}
}
}

View File

@@ -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
}