From d5bbb3016c7f556b2303607355af8a37001bf166 Mon Sep 17 00:00:00 2001 From: NovaFox161 Date: Mon, 16 Aug 2021 17:07:44 -0500 Subject: [PATCH] Add code for new announcement embeds --- .../client/message/embed/AnnouncementEmbed.kt | 191 ++++++++++++++++++ .../discal/client/message/embed/EventEmbed.kt | 11 +- .../core/extensions/InstantExtension.kt | 5 + .../core/object/announcement/Announcement.kt | 1 + .../i18n/embed/announcement.properties | 49 +++++ .../resources/i18n/embed/event.properties | 4 +- 6 files changed, 252 insertions(+), 9 deletions(-) create mode 100644 client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/AnnouncementEmbed.kt create mode 100644 core/src/main/kotlin/org/dreamexposure/discal/core/extensions/InstantExtension.kt diff --git a/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/AnnouncementEmbed.kt b/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/AnnouncementEmbed.kt new file mode 100644 index 00000000..52416a8c --- /dev/null +++ b/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/AnnouncementEmbed.kt @@ -0,0 +1,191 @@ +package org.dreamexposure.discal.client.message.embed + +import discord4j.common.util.Snowflake +import discord4j.core.`object`.entity.Guild +import discord4j.core.`object`.entity.channel.GuildChannel +import discord4j.core.spec.EmbedCreateSpec +import org.dreamexposure.discal.core.`object`.announcement.Announcement +import org.dreamexposure.discal.core.entities.Event +import org.dreamexposure.discal.core.enums.announcement.AnnouncementType +import org.dreamexposure.discal.core.extensions.asDiscordTimestamp +import org.dreamexposure.discal.core.extensions.discord4j.getSettings +import org.dreamexposure.discal.core.utils.GlobalVal +import reactor.core.publisher.Mono +import reactor.function.TupleUtils + +object AnnouncementEmbed : EmbedMaker { + fun full(ann: Announcement, event: Event, guild: Guild): Mono { + return guild.getSettings().map { settings -> + val builder = defaultBuilder(guild, settings) + .color(event.color.asColor()) + .title(getMessage("announcement", "full.title", settings)) + + if (event.name.isNotEmpty()) + builder.addField(getMessage("announcement", "full.field.name", settings), event.name, false) + if (event.description.isNotEmpty()) + builder.addField(getMessage("announcement", "full.field.desc", settings), event.description, false) + + builder.addField( + getMessage("announcement", "full.field.start", settings), + event.start.asDiscordTimestamp(), + true + ) + builder.addField( + getMessage("announcement", "full.field.end", settings), + event.end.asDiscordTimestamp(), + true + ) + + builder.addField(getMessage("announcement", "full.field.location", settings), event.location, false) + + if (ann.info.isNotEmpty() || !ann.info.equals("None", true)) + builder.addField(getMessage("announcement", "full.field.info", settings), ann.info, false) + + builder.addField( + getMessage("announcement", "full.field.calendar", settings), + "${event.calendar.calendarNumber}", + true + ) + builder.addField(getMessage("announcement", "full.field.event", settings), event.eventId, true) + + if (event.image.isNotEmpty()) { + builder.image(event.image) + } + + builder.footer(getMessage("announcement", "full.footer", settings, ann.announcementId.toString()), null) + + builder.build() + } + } + + fun simple(ann: Announcement, event: Event, guild: Guild): Mono { + return guild.getSettings().map { settings -> + val builder = defaultBuilder(guild, settings) + .color(event.color.asColor()) + .title(getMessage("announcement", "simple.title", settings)) + + if (event.name.isNotEmpty()) + builder.addField(getMessage("announcement", "simple.field.name", settings), event.name, false) + if (event.description.isNotEmpty()) + builder.addField(getMessage("announcement", "simple.field.desc", settings), event.description, false) + + builder.addField( + getMessage("announcement", "simple.field.start", settings), + event.start.asDiscordTimestamp(), + true + ) + + builder.addField(getMessage("announcement", "simple.field.location", settings), event.location, false) + + if (ann.info.isNotEmpty() || !ann.info.equals("None", true)) + builder.addField(getMessage("announcement", "simple.field.info", settings), ann.info, false) + + if (event.image.isNotEmpty()) { + builder.image(event.image) + } + + builder.footer(getMessage("announcement", "simple.footer", settings, ann.announcementId.toString()), null) + + builder.build() + } + } + + fun event(ann: Announcement, event: Event, guild: Guild): Mono { + return guild.getSettings().map { settings -> + val builder = defaultBuilder(guild, settings) + .color(event.color.asColor()) + .title(getMessage("announcement", "event.title", settings)) + + if (event.name.isNotEmpty()) + builder.addField(getMessage("announcement", "event.field.name", settings), event.name, false) + if (event.description.isNotEmpty()) + builder.addField(getMessage("announcement", "event.field.desc", settings), event.description, false) + + builder.addField( + getMessage("announcement", "event.field.start", settings), + event.start.asDiscordTimestamp(), + true + ) + builder.addField( + getMessage("announcement", "event.field.end", settings), + event.end.asDiscordTimestamp(), + true + ) + builder.addField(getMessage("announcement", "event.field.location", settings), event.location, false) + + builder.addField( + getMessage("announcement", "event.field.calendar", settings), + "${event.calendar.calendarNumber}", + true + ) + builder.addField(getMessage("announcement", "event.field.event", settings), event.eventId, true) + + if (ann.info.isNotEmpty() || !ann.info.equals("None", true)) + builder.addField(getMessage("announcement", "event.field.info", settings), ann.info, false) + + if (event.image.isNotEmpty()) { + builder.image(event.image) + } + + builder.footer(getMessage("announcement", "event.footer", settings, ann.announcementId.toString()), null) + + builder.build() + } + } + + fun condensed(ann: Announcement, guild: Guild): Mono { + return guild.getSettings().map { settings -> + val builder = defaultBuilder(guild, settings) + .title(getMessage("announcement", "con.title", settings)) + .addField(getMessage("announcement", "con.field.id", settings), ann.announcementId.toString(), false) + .addField(getMessage("announcement", "con.field.time", settings), condensedTime(ann), true) + .addField(getMessage("announcement", "con.field.enabled", settings), "${ann.enabled}", true) + .footer(getMessage("announcement", "con.footer", settings, ann.type.name, ann.modifier.name), null) + + if (ann.type == AnnouncementType.COLOR) + builder.color(ann.eventColor.asColor()) + else + builder.color(GlobalVal.discalColor) + + builder.build() + } + } + + fun view(ann: Announcement, guild: Guild): Mono { + val channelMono = guild + .getChannelById(Snowflake.of(ann.announcementChannelId)) + .map(GuildChannel::getName) + + + return Mono.zip(guild.getSettings(), channelMono).map(TupleUtils.function { settings, channel -> + val builder = defaultBuilder(guild, settings) + .title(getMessage("announcement", "view.title", settings)) + .addField(getMessage("announcement", "view.field.type", settings), ann.type.name, true) + .addField(getMessage("announcement", "view.field.modifier", settings), ann.modifier.name, true) + .addField(getMessage("announcement", "view.field.channel", settings), channel, false) + .addField(getMessage("announcement", "view.field.hours", settings), "${ann.hoursBefore}", true) + .addField(getMessage("announcement", "view.field.minutes", settings), "${ann.minutesBefore}", true) + + if (ann.info.isNotEmpty() || !ann.info.equals("None", true)) { + builder.addField(getMessage("announcement", "view.field.info", settings), ann.info, false) + } + + builder.addField(getMessage("announcement", "view.field.calendar", settings), "${ann.calendarNumber}", true) + if (ann.type == AnnouncementType.RECUR || ann.type == AnnouncementType.SPECIFIC) + builder.addField(getMessage("announcement", "view.field.event", settings), ann.eventId, true) + + if (ann.type == AnnouncementType.COLOR) { + builder.color(ann.eventColor.asColor()) + builder.addField(getMessage("announcement", "view.field.color", settings), ann.eventColor.name, true) + } else + builder.color(GlobalVal.discalColor) + + builder.addField(getMessage("announcement", "view.field.id", settings), ann.announcementId.toString(), false) + .addField(getMessage("announcement", "view.field.enabled", settings), "${ann.enabled}", true) + .addField(getMessage("announcement", "view.field.publish", settings), "${ann.publish}", true) + .build() + }) + } + + private fun condensedTime(a: Announcement): String = "${a.hoursBefore}H${a.minutesBefore}m" +} diff --git a/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/EventEmbed.kt b/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/EventEmbed.kt index 23ad506e..4a735b73 100644 --- a/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/EventEmbed.kt +++ b/client/src/main/kotlin/org/dreamexposure/discal/client/message/embed/EventEmbed.kt @@ -4,7 +4,7 @@ import discord4j.core.`object`.entity.Guild import discord4j.core.spec.EmbedCreateSpec import org.dreamexposure.discal.core.`object`.GuildSettings import org.dreamexposure.discal.core.entities.Event -import java.time.Instant +import org.dreamexposure.discal.core.extensions.asDiscordTimestamp object EventEmbed : EmbedMaker { fun getFull(guild: Guild, settings: GuildSettings, event: Event): EmbedCreateSpec { @@ -18,8 +18,8 @@ object EventEmbed : EmbedMaker { if (event.description.isNotEmpty()) builder.addField(getMessage("event", "full.field.desc", settings), event.description, false) - builder.addField(getMessage("event", "full.field.start", settings), timestamp(event.start), true) - builder.addField(getMessage("event", "full.field.end", settings), timestamp(event.end), true) + builder.addField(getMessage("event", "full.field.start", settings), event.start.asDiscordTimestamp(), true) + builder.addField(getMessage("event", "full.field.end", settings), event.end.asDiscordTimestamp(), true) if (event.location.isNotEmpty()) builder.addField(getMessage("event", "full.field.location", settings), event.location, false) @@ -41,7 +41,7 @@ object EventEmbed : EmbedMaker { if (event.name.isNotEmpty()) builder.addField(getMessage("event", "con.field.name", settings), event.name, false) - builder.addField(getMessage("event", "con.field.start", settings), timestamp(event.start), true) + builder.addField(getMessage("event", "con.field.start", settings), event.start.asDiscordTimestamp(), true) if (event.location.isNotEmpty()) builder.addField(getMessage("event", "con.field.location", settings), event.location, false) @@ -51,7 +51,4 @@ object EventEmbed : EmbedMaker { return builder.build() } - - - private fun timestamp(time: Instant): String = "" } diff --git a/core/src/main/kotlin/org/dreamexposure/discal/core/extensions/InstantExtension.kt b/core/src/main/kotlin/org/dreamexposure/discal/core/extensions/InstantExtension.kt new file mode 100644 index 00000000..1baefa43 --- /dev/null +++ b/core/src/main/kotlin/org/dreamexposure/discal/core/extensions/InstantExtension.kt @@ -0,0 +1,5 @@ +package org.dreamexposure.discal.core.extensions + +import java.time.Instant + +fun Instant.asDiscordTimestamp() = "" diff --git a/core/src/main/kotlin/org/dreamexposure/discal/core/object/announcement/Announcement.kt b/core/src/main/kotlin/org/dreamexposure/discal/core/object/announcement/Announcement.kt index 5b863939..c52fde45 100644 --- a/core/src/main/kotlin/org/dreamexposure/discal/core/object/announcement/Announcement.kt +++ b/core/src/main/kotlin/org/dreamexposure/discal/core/object/announcement/Announcement.kt @@ -52,6 +52,7 @@ data class Announcement( var enabled = true + @Deprecated(message = "Info only support is dropping in favor of a guild-wide announcement-style") @SerialName("info_only") var infoOnly = false var publish = false diff --git a/core/src/main/resources/i18n/embed/announcement.properties b/core/src/main/resources/i18n/embed/announcement.properties index e69de29b..d4181952 100644 --- a/core/src/main/resources/i18n/embed/announcement.properties +++ b/core/src/main/resources/i18n/embed/announcement.properties @@ -0,0 +1,49 @@ +full.title=!~Event Announcement~! +full.field.name=Name +full.field.desc=Description +full.field.start=Start (Local) +full.field.end=End (Local) +full.field.location=Location +full.field.info=Extra Info +full.field.calendar=Calendar +full.field.event=Event ID +full.footer=Announcement ID: {0} + +simple.title=!~Event Announcement~! +simple.field.name=Name +simple.field.desc=Description +simple.field.start=Start (Local) +simple.field.location=Location +simple.field.info=Extra Info +simple.footer=ID: {0} + +event.title=!~Upcoming Event~! +event.field.name=Name +event.field.desc=Description +event.field.start=Start (Local) +event.field.end=End (Local) +event.field.location=Location +event.field.calendar=Calendar +event.field.event=Event ID +event.field.info=Extra Info +event.footer=Announcement ID: {0} + +con.title=Condensed Announcement Info +con.field.id=Announcement ID +con.field.time=Time Before +con.field.enabled=Enabled +con.footer=Type {0} | Modifier {1} + +view.title=Announcement Info +view.field.type=Type +view.field.modifier=Modifier +view.field.channel=Channel +view.field.hours=Hours +view.field.minutes=Minutes +view.field.info=Extra Info +view.field.calendar=Calendar +view.field.event=Event ID +view.field.color=Color +view.field.id=ID +view.field.enabled=Enabled +view.field.publish=Publishable diff --git a/core/src/main/resources/i18n/embed/event.properties b/core/src/main/resources/i18n/embed/event.properties index 4580ec01..b9bedb4e 100644 --- a/core/src/main/resources/i18n/embed/event.properties +++ b/core/src/main/resources/i18n/embed/event.properties @@ -1,8 +1,8 @@ full.title=Event Info full.field.name=Name full.field.desc=Description -full.field.start=Event Start (Local) -full.field.end=Event End (Local) +full.field.start=Start (Local) +full.field.end=End (Local) full.field.location=Location full.field.cal=Calendar full.footer=Event ID: {0}