Allow retaining event duration when modifying start/end in the wizard (#152)

* WIP - keep event duration setting

* finish impl
This commit is contained in:
Nova Maday
2023-02-12 18:17:06 -06:00
committed by GitHub
parent e64e015574
commit 78247afdb8
10 changed files with 94 additions and 23 deletions

View File

@@ -172,6 +172,10 @@ class EventCommand(val wizard: Wizard<PreEvent>, val staticMessageSrv: StaticMes
.map(Long::toInt)
.map { it.coerceAtLeast(0).coerceAtMost(59) }
.orElse(0)
val keepDuration = event.options[0].getOption("keep-duration")
.flatMap(ApplicationCommandInteractionOption::getValue)
.map(ApplicationCommandInteractionOptionValue::asBoolean)
.orElse(settings.eventKeepDuration)
return Mono.justOrEmpty(event.interaction.member).filterWhen(Member::hasControlRole).flatMap {
val pre = wizard.get(settings.guildID)
@@ -197,8 +201,13 @@ class EventCommand(val wizard: Wizard<PreEvent>, val staticMessageSrv: StaticMes
}
} else {
// Event end already set, make sure everything is in order
if (pre.end!!.isAfter(start)) {
val originalDuration = if (pre.start != null) Duration.between(pre.start, pre.end) else null
val shouldChangeDuration = keepDuration && originalDuration != null
if (pre.end!!.isAfter(start) || shouldChangeDuration) {
pre.start = start
if (shouldChangeDuration) pre.end = start.plus(originalDuration)
if (pre.start!!.isAfter(Instant.now())) {
event.interaction.guild
.map { EventEmbed.pre(it, settings, pre) }
@@ -252,6 +261,10 @@ class EventCommand(val wizard: Wizard<PreEvent>, val staticMessageSrv: StaticMes
.map(Long::toInt)
.map { it.coerceAtLeast(0).coerceAtMost(59) }
.orElse(0)
val keepDuration = event.options[0].getOption("keep-duration")
.flatMap(ApplicationCommandInteractionOption::getValue)
.map(ApplicationCommandInteractionOptionValue::asBoolean)
.orElse(settings.eventKeepDuration)
return Mono.justOrEmpty(event.interaction.member).filterWhen(Member::hasControlRole).flatMap {
val pre = wizard.get(settings.guildID)
@@ -277,8 +290,13 @@ class EventCommand(val wizard: Wizard<PreEvent>, val staticMessageSrv: StaticMes
}
} else {
// Event start already set, make sure everything is in order
if (pre.start!!.isBefore(end)) {
val originalDuration = if (pre.end != null) Duration.between(pre.start, pre.end) else null
val shouldChangeDuration = keepDuration && originalDuration != null
if (pre.start!!.isBefore(end) || shouldChangeDuration) {
pre.end = end
if (shouldChangeDuration) pre.start = end.minus(originalDuration)
if (pre.end!!.isAfter(Instant.now())) {
event.interaction.guild
.map { EventEmbed.pre(it, settings, pre) }

View File

@@ -1,18 +1,18 @@
package org.dreamexposure.discal.client.commands.global
import discord4j.core.event.domain.interaction.ChatInputInteractionEvent
import discord4j.core.`object`.command.ApplicationCommandInteractionOption
import discord4j.core.`object`.command.ApplicationCommandInteractionOptionValue
import discord4j.core.`object`.entity.Message
import discord4j.core.event.domain.interaction.ChatInputInteractionEvent
import org.dreamexposure.discal.client.commands.SlashCommand
import org.dreamexposure.discal.client.message.embed.SettingsEmbed
import org.dreamexposure.discal.core.`object`.GuildSettings
import org.dreamexposure.discal.core.database.DatabaseManager
import org.dreamexposure.discal.core.enums.announcement.AnnouncementStyle
import org.dreamexposure.discal.core.enums.time.TimeFormat
import org.dreamexposure.discal.core.extensions.discord4j.followup
import org.dreamexposure.discal.core.extensions.discord4j.followupEphemeral
import org.dreamexposure.discal.core.extensions.discord4j.hasElevatedPermissions
import org.dreamexposure.discal.core.`object`.GuildSettings
import org.dreamexposure.discal.core.utils.getCommonMsg
import org.springframework.stereotype.Component
import reactor.core.publisher.Mono
@@ -32,6 +32,7 @@ class SettingsCommand : SlashCommand {
"announcement-style" -> announcementStyleSubcommand(event, settings)
"language" -> languageSubcommand(event, settings)
"time-format" -> timeFormatSubcommand(event, settings)
"event-keep-duration" -> eventKeepDurationSubcommand(event, settings)
"branding" -> brandingSubcommand(event, settings)
else -> Mono.empty() //Never can reach this, makes compiler happy.
}
@@ -99,6 +100,18 @@ class SettingsCommand : SlashCommand {
.flatMap { event.followupEphemeral(getMessage("format.success", settings, timeFormat.name)) }
}
private fun eventKeepDurationSubcommand(event: ChatInputInteractionEvent, settings: GuildSettings): Mono<Message> {
val keepDuration = event.options[0].getOption("value")
.flatMap(ApplicationCommandInteractionOption::getValue)
.map(ApplicationCommandInteractionOptionValue::asBoolean)
.get()
settings.eventKeepDuration = keepDuration
return DatabaseManager.updateSettings(settings)
.flatMap { event.followupEphemeral(getMessage("eventKeepDuration.success.$keepDuration", settings)) }
}
private fun brandingSubcommand(event: ChatInputInteractionEvent, settings: GuildSettings): Mono<Message> {
return if (settings.patronGuild) {
val useBranding = event.options[0].getOption("use")

View File

@@ -3,8 +3,8 @@ package org.dreamexposure.discal.client.message.embed
import discord4j.core.`object`.entity.Guild
import discord4j.core.`object`.entity.Role
import discord4j.core.spec.EmbedCreateSpec
import org.dreamexposure.discal.core.`object`.GuildSettings
import org.dreamexposure.discal.core.extensions.discord4j.getControlRole
import org.dreamexposure.discal.core.`object`.GuildSettings
import reactor.core.publisher.Mono
object SettingsEmbed : EmbedMaker {
@@ -16,6 +16,7 @@ object SettingsEmbed : EmbedMaker {
.addField(getMessage("settings", "view.field.role", settings), roleName, false)
.addField(getMessage("settings", "view.field.style", settings), settings.announcementStyle.name, true)
.addField(getMessage("settings", "view.field.format", settings), settings.timeFormat.name, true)
.addField(getMessage("settings", "view.field.eventKeepDuration", settings), "${settings.eventKeepDuration}", true)
.addField(getMessage("settings", "view.field.lang", settings), settings.getLocale().displayName, false)
.addField(getMessage("settings", "view.field.patron", settings), "${settings.patronGuild}", true)
.addField(getMessage("settings", "view.field.dev", settings), "${settings.devGuild}", true)

View File

@@ -129,7 +129,7 @@ object DatabaseManager {
CONTROL_ROLE = ?, ANNOUNCEMENT_STYLE = ?, TIME_FORMAT = ?,
LANG = ?, PREFIX = ?, PATRON_GUILD = ?, DEV_GUILD = ?,
MAX_CALENDARS = ?, DM_ANNOUNCEMENTS = ?,
BRANDED = ? WHERE GUILD_ID = ?
BRANDED = ?, event_keep_duration = ? WHERE GUILD_ID = ?
""".trimMargin()
Mono.from(
@@ -144,7 +144,8 @@ object DatabaseManager {
.bind(7, settings.maxCalendars)
.bind(8, settings.getDmAnnouncementsString())
.bind(9, settings.branded)
.bind(10, settings.guildID.asLong())
.bind(10, settings.eventKeepDuration)
.bind(11, settings.guildID.asLong())
.execute()
).flatMap { res -> Mono.from(res.rowsUpdated) }
.hasElement()
@@ -152,8 +153,8 @@ object DatabaseManager {
} else {
val insertCommand = """INSERT INTO ${Tables.GUILD_SETTINGS}
(GUILD_ID, CONTROL_ROLE, ANNOUNCEMENT_STYLE, TIME_FORMAT, LANG, PREFIX,
PATRON_GUILD, DEV_GUILD, MAX_CALENDARS, DM_ANNOUNCEMENTS, BRANDED)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
PATRON_GUILD, DEV_GUILD, MAX_CALENDARS, DM_ANNOUNCEMENTS, BRANDED, event_keep_duration)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""".trimMargin()
Mono.from(
@@ -169,6 +170,7 @@ object DatabaseManager {
.bind(8, settings.maxCalendars)
.bind(9, settings.getDmAnnouncementsString())
.bind(10, settings.branded)
.bind(11, settings.eventKeepDuration)
.execute()
).flatMap { res -> Mono.from(res.rowsUpdated) }
.hasElement()
@@ -550,10 +552,11 @@ object DatabaseManager {
val maxCals = row["MAX_CALENDARS", Int::class.java]!!
val dmAnnouncementsString = row["DM_ANNOUNCEMENTS", String::class.java]!!
val branded = row["BRANDED", Boolean::class.java]!!
val eventKeepDuration = row["event_keep_duration", Boolean::class.java]!!
val settings = GuildSettings(
guildId, controlRole, announcementStyle, timeFormat,
lang, prefix, patron, dev, maxCals, branded
lang, prefix, patron, dev, maxCals, branded, eventKeepDuration,
)
settings.dmAnnouncements.setFromString(dmAnnouncementsString)

View File

@@ -11,29 +11,32 @@ import java.util.*
@Serializable
data class GuildSettings(
@Serializable(with = SnowflakeAsStringSerializer::class)
@Serializable(with = SnowflakeAsStringSerializer::class)
@SerialName("guild_id")
val guildID: Snowflake,
@SerialName("control_role")
@SerialName("control_role")
var controlRole: String = "everyone",
@SerialName("announcement_style")
@SerialName("announcement_style")
var announcementStyle: AnnouncementStyle = AnnouncementStyle.EVENT,
@SerialName("time_format")
@SerialName("time_format")
var timeFormat: TimeFormat = TimeFormat.TWENTY_FOUR_HOUR,
var lang: String = "ENGLISH",
var prefix: String = "!",
var lang: String = "ENGLISH",
var prefix: String = "!",
@SerialName("patron_guild")
var patronGuild: Boolean = false,
@SerialName("dev_guild")
var devGuild: Boolean = false,
@SerialName("max_calendars")
var maxCalendars: Int = 1,
@SerialName("patron_guild")
var patronGuild: Boolean = false,
@SerialName("dev_guild")
var devGuild: Boolean = false,
@SerialName("max_calendars")
var maxCalendars: Int = 1,
var branded: Boolean = false,
var branded: Boolean = false,
@SerialName("event_keep_duration")
var eventKeepDuration: Boolean = false,
) {
@SerialName("dm_announcements")
val dmAnnouncements: MutableList<String> = mutableListOf()

View File

@@ -250,6 +250,12 @@
"required": false,
"min_value": 0,
"max_value": 59
},
{
"name": "keep-duration",
"type": 5,
"description": "Adjusts the end time to keep the same duration (overrides guild-level setting)",
"required": false
}
]
},
@@ -440,6 +446,12 @@
"required": false,
"min_value": 0,
"max_value": 59
},
{
"name": "keep-duration",
"type": 5,
"description": "Adjusts the start time to keep the same duration (overrides guild-level setting)",
"required": false
}
]
},

View File

@@ -94,6 +94,19 @@
}
]
},
{
"name": "keep-event-duration",
"type": 1,
"description": "Toggles whether to keep an event's duration when changing the start or end time (default false)",
"options": [
{
"name": "value",
"type": 5,
"description": "Whether to keep an event's duration",
"required": true
}
]
},
{
"name": "branding",
"type": 1,

View File

@@ -0,0 +1,3 @@
ALTER TABLE guild_settings
ADD COLUMN event_keep_duration BIT NOT NULL DEFAULT 0
AFTER announcement_style;

View File

@@ -12,3 +12,7 @@ style.success=Announcement Style successfully changed to `{0}`.
lang.success=Successfully changed default language!
format.success=Time Format successfully changed to `{0}`.
brand.success=Server branding has been set to `{0}`.
eventKeepDuration.success.true=Events will keep their duration by default when adjusting the start or end of the event.\n\
This can be overridden when changing an event's start/end.
eventKeepDuration.success.false=Events will *not* keep their duration by default when adjusting the start or end of the event.\n\
This can be overridden when changing an event's start/end.

View File

@@ -2,6 +2,7 @@ view.title=DisCal Guild Settings
view.field.role=Control Role
view.field.style=Announcement Style
view.field.format=Time Format
view.field.eventKeepDuration=Keep Event Duration
view.field.lang=Language
view.field.patron=Patron Guild
view.field.dev=Dev Guild