Skip to content

Commit

Permalink
Rewrite EventCommand to using new calendar backend and patterns
Browse files Browse the repository at this point in the history
Holy shit, I'm finally almost at the finish line. Need to test this all of course, but damn, almost there.

Next commit is gonna be a crazy amount of removals, gonna feel so good
  • Loading branch information
NovaFox161 committed Dec 7, 2024
1 parent 7d470d4 commit c384e6c
Show file tree
Hide file tree
Showing 7 changed files with 663 additions and 396 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ object EventEmbed : EmbedMaker {
return builder.build()
}

@Deprecated("Prefer to use EmbedService impl")
fun pre(guild: Guild, settings: GuildSettings, event: PreEvent): EmbedCreateSpec {
val builder = defaultBuilder(guild, settings)
.title(getMessage("event", "wizard.title", settings))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@ import discord4j.common.util.Snowflake
import discord4j.core.DiscordClient
import discord4j.core.spec.EmbedCreateSpec
import kotlinx.coroutines.reactor.awaitSingle
import org.dreamexposure.discal.AnnouncementWizardState
import org.dreamexposure.discal.Application
import org.dreamexposure.discal.CalendarWizardState
import org.dreamexposure.discal.GitProperty
import org.dreamexposure.discal.*
import org.dreamexposure.discal.core.config.Config
import org.dreamexposure.discal.core.enums.event.EventColor
import org.dreamexposure.discal.core.enums.time.DiscordTimestampFormat
Expand Down Expand Up @@ -328,6 +325,109 @@ class EmbedService(
return builder.build()
}

suspend fun eventWizardEmbed(wizard: EventWizardState, settings: GuildSettings): EmbedCreateSpec {
val builder = defaultEmbedBuilder(settings)
.title(getEmbedMessage("event", "wizard.title", settings.locale))
.footer(getEmbedMessage("event", "wizard.footer", settings.locale), null)
.color(wizard.entity.color.asColor())

if (!wizard.entity.name.isNullOrBlank()) builder.addField(
getEmbedMessage("event", "wizard.field.name", settings.locale),
wizard.entity.name.toMarkdown().embedFieldSafe(),
false
) else builder.addField(
getEmbedMessage("event", "wizard.field.name", settings.locale),
getCommonMsg("embed.unset", settings.locale),
false
)

if (!wizard.entity.description.isNullOrBlank()) builder.addField(
getEmbedMessage("event", "wizard.field.desc", settings.locale),
wizard.entity.description.toMarkdown().embedFieldSafe(),
false
) else builder.addField(
getEmbedMessage("event", "wizard.field.desc", settings.locale),
getCommonMsg("embed.unset", settings.locale),
false
)

if (!wizard.entity.location.isNullOrBlank()) builder.addField(
getEmbedMessage("event", "wizard.field.location", settings.locale),
wizard.entity.location.toMarkdown().embedFieldSafe(),
false
) else builder.addField(
getEmbedMessage("event", "wizard.field.location", settings.locale),
getCommonMsg("embed.unset", settings.locale),
false
)

if (wizard.entity.start != null) builder.addField(
getEmbedMessage("event", "wizard.field.start", settings.locale),
wizard.entity.start.humanReadableFull(wizard.entity.timezone, settings.interfaceStyle.timeFormat),
true
) else builder.addField(
getEmbedMessage("event", "wizard.field.start", settings.locale),
getCommonMsg("embed.unset", settings.locale),
true
)

if (wizard.entity.end != null) builder.addField(
getEmbedMessage("event", "wizard.field.end", settings.locale),
wizard.entity.end.humanReadableFull(wizard.entity.timezone, settings.interfaceStyle.timeFormat),
true
) else builder.addField(
getEmbedMessage("event", "wizard.field.end", settings.locale),
getCommonMsg("embed.unset", settings.locale),
true
)

if (wizard.entity.recurrence != null) builder.addField(
getEmbedMessage("event", "wizard.field.recurrence", settings.locale),
wizard.entity.recurrence.toHumanReadable(),
true
) else if (wizard.editing && wizard.entity.id != null && wizard.entity.id.contains("_")) builder.addField(
getEmbedMessage("event", "wizard.field.recurrence", settings.locale),
getEmbedMessage("event", "wizard.field.recurrence.child", settings.locale, wizard.entity.id.split("_")[0]),
false,
) else builder.addField(
getEmbedMessage("event", "wizard.field.recurrence", settings.locale),
getCommonMsg("embed.unset", settings.locale),
true
)

builder.addField(getEmbedMessage("event", "wizard.field.timezone", settings.locale), wizard.entity.timezone.id, false)

if (wizard.editing)
builder.addField(getEmbedMessage("event", "wizard.field.id", settings.locale), wizard.entity.id!!, true)
builder.addField(getEmbedMessage("event", "wizard.field.calendar", settings.locale), wizard.entity.calendarNumber.toString(), true)

if (wizard.entity.image != null)
builder.image(wizard.entity.image)

// Handle displaying warnings
val warnings = mutableListOf<String>()

if (wizard.entity.name.isNullOrBlank()) {
warnings.add(getEmbedMessage("event", "warning.wizard.noName", settings.locale))
}
// Checking end time is not needed
if (wizard.entity.start != null && wizard.entity.start.isBefore(Instant.now())) {
warnings.add(getEmbedMessage("event", "warning.wizard.past", settings.locale))
}
if (wizard.entity.start != null && wizard.entity.end != null) {
if (Duration.between(wizard.entity.start, wizard.entity.end).toDays() > 30) {
warnings.add(getEmbedMessage("event", "warning.wizard.veryLong", settings.locale))
}

}
if (warnings.isNotEmpty()) {
val warnText = "```fix\n${warnings.joinToString("\n")}\n```"
builder.addField(getEmbedMessage("event", "wizard.field.warnings", settings.locale), warnText, false)
}

return builder.build()
}

/////////////////////////
////// RSVP Embeds //////
/////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,22 @@ data class Event(
////////////////////////////
////// Nested classes //////
////////////////////////////
data class PartialEvent(
val id: String?,
val guildId: Snowflake,
val calendarNumber: Int,
val name: String?,
val description: String?,
val location: String?,
val color: EventColor,
val start: Instant?,
val end: Instant?,
val recur: Boolean,
val recurrence: Recurrence?,
val image: String?,
val timezone: ZoneId,
)

data class CreateSpec(
val name: String?,
val description: String?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import java.io.FileNotFoundException
import java.io.IOException
import java.io.InputStream
import java.net.MalformedURLException
import java.net.URL
import java.net.URI
import java.time.Duration
import javax.imageio.ImageIO
import javax.imageio.ImageReader

object ImageValidator {
fun validate(url: String, allowGif: Boolean): Mono<Boolean> {
return Mono.fromCallable {
val image = ImageIO.read(URL(url))
val image = ImageIO.read(URI.create(url).toURL())
image != null
}.subscribeOn(Schedulers.boundedElastic())
.onErrorResume(IOException::class.java) {
Expand All @@ -26,7 +26,7 @@ object ImageValidator {

private fun validateGif(url: String): Mono<Boolean> {
return Mono.fromCallable {
val connection = URL(url).openConnection()
val connection = URI.create(url).toURL().openConnection()
connection.connectTimeout = Duration.ofSeconds(3).toMillis().toInt()
connection.readTimeout = Duration.ofSeconds(3).toMillis().toInt()

Expand All @@ -49,7 +49,7 @@ object ImageValidator {

reader.setInput(stream, true, true)
reader.read(0, reader.defaultReadParam)
} catch (ignore: Exception) {
} catch (_: Exception) {

} finally {
reader?.dispose()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import org.dreamexposure.discal.core.`object`.new.model.discal.cam.TokenV1Model

// Wizards
typealias AnnouncementWizardState = WizardState<Announcement>
typealias EventWizardState = WizardState<Event>
typealias EventWizardState = WizardState<Event.PartialEvent>
typealias CalendarWizardState = WizardState<Calendar>

// Cache
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ recur.success.disable=Successfully set event to not recur
confirm.success.create=Event successfully created!
confirm.success.edit=Event successfully edited!
confirm.failure.missing=Please make sure all required properties are set.
confirm.failure.missing.time=A start and end time for the event are required.
confirm.failure.create=Event creation failed. Please double check that everything is correct and try again.\n\n\
If this continues, please request support in our Discord Guild.
confirm.failure.edit=Event edit failed. Please double check everything is correct and try again. \n\n\
Expand Down

0 comments on commit c384e6c

Please sign in to comment.