Skip to content

Commit 06669d4

Browse files
committed
Add display cal option to show only the next upcoming event
1 parent 38f317f commit 06669d4

5 files changed

Lines changed: 76 additions & 3 deletions

File tree

core/src/main/kotlin/org/dreamexposure/discal/core/business/EmbedService.kt

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,7 @@ class EmbedService(
195195

196196
// set footer
197197
if (showUpdate) {
198-
val lastUpdate = Instant.now().asDiscordTimestamp(DiscordTimestampFormat.RELATIVE_TIME)
199-
builder.footer(getEmbedMessage("calendar", "link.footer.update", settings.locale, lastUpdate), null)
198+
builder.footer(getEmbedMessage("calendar", "link.footer.update", settings.locale), null)
200199
.timestamp(Instant.now())
201200
} else builder.footer(getEmbedMessage("calendar", "link.footer.default", settings.locale), null)
202201

@@ -378,6 +377,54 @@ class EmbedService(
378377
//////////////////////////
379378
////// Event Embeds //////
380379
//////////////////////////
380+
suspend fun nextUpcomingEventEmbed(event: Event?, guildId: Snowflake, showUpdate: Boolean): EmbedCreateSpec {
381+
val settings = settingsService.getSettings(guildId)
382+
val builder = defaultEmbedBuilder(settings)
383+
.color(event?.color?.asColor() ?: GlobalVal.discalColor)
384+
.title(getEmbedMessage("event", "upcoming.title", settings.locale))
385+
386+
// Add footer info
387+
if (showUpdate) {
388+
builder.footer(getEmbedMessage("event", "upcoming.footer", settings.locale), null)
389+
.timestamp(Instant.now())
390+
}
391+
392+
// If event is null, turn this into a stub
393+
if (event == null) {
394+
builder.description(getEmbedMessage("event", "upcoming.description.no-event", settings.locale))
395+
396+
return builder.build()
397+
}
398+
399+
// Handle adding name and description + info about this event
400+
val descriptionBuilder = StringBuilder()
401+
if (event.name.isNotBlank()) descriptionBuilder.append(event.name.toMarkdown()).append("\n\n")
402+
if (event.description.isNotBlank()) descriptionBuilder.append(event.description.toMarkdown())
403+
404+
if (descriptionBuilder.isNotBlank()) builder.description(descriptionBuilder.toString().embedDescriptionSafe())
405+
406+
407+
builder.addField(
408+
getEmbedMessage("event", "upcoming.field.start", settings.locale),
409+
event.start.asDiscordTimestamp(LONG_DATETIME),
410+
true)
411+
builder.addField(
412+
getEmbedMessage("event", "upcoming.field.end", settings.locale),
413+
event.end.asDiscordTimestamp(LONG_DATETIME),
414+
true
415+
)
416+
417+
if (event.location.isNotBlank()) builder.addField(
418+
getEmbedMessage("event", "upcoming.field.location", settings.locale),
419+
event.location.toMarkdown().embedFieldSafe(),
420+
false
421+
)
422+
423+
if (event.image.isNotEmpty()) builder.image(event.image)
424+
425+
return builder.build()
426+
}
427+
381428
suspend fun fullEventEmbed(event: Event, settings: GuildSettings): EmbedCreateSpec {
382429
val builder = defaultEmbedBuilder(settings)
383430
.footer(getEmbedMessage("event", "full.footer", settings.locale, event.id), null)

core/src/main/kotlin/org/dreamexposure/discal/core/business/StaticMessageService.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ class StaticMessageService(
9797
val events = calendarService.getEventsInNextNDays(guildId, calendarNumber, 6)
9898
embedService.calendarWeekOverviewEmbed(calendar, events, showUpdate = true)
9999
}
100+
StaticMessage.Type.NEXT_EVENT -> {
101+
val event = calendarService.getUpcomingEvents(guildId, calendarNumber, 1).firstOrNull()
102+
embedService.nextUpcomingEventEmbed(event, guildId, showUpdate = true)
103+
}
100104
}
101105

102106

@@ -183,6 +187,10 @@ class StaticMessageService(
183187
val events = calendarService.getEventsInNextNDays(guildId, old.calendarNumber, 6)
184188
embedService.calendarWeekOverviewEmbed(calendar, events, showUpdate = true)
185189
}
190+
StaticMessage.Type.NEXT_EVENT -> {
191+
val event = calendarService.getUpcomingEvents(guildId, old.calendarNumber, 1).firstOrNull()
192+
embedService.nextUpcomingEventEmbed(event, guildId, showUpdate = true)
193+
}
186194
}
187195

188196
discordClient.getMessageById(old.channelId, old.messageId).edit(
@@ -272,6 +280,10 @@ class StaticMessageService(
272280
val events = calendarService.getEventsInNextNDays(guildId, calendarNumber, 6)
273281
embedService.calendarWeekOverviewEmbed(calendar, events, showUpdate = true)
274282
}
283+
StaticMessage.Type.NEXT_EVENT -> {
284+
val event = calendarService.getUpcomingEvents(guildId, calendarNumber, 1).firstOrNull()
285+
embedService.nextUpcomingEventEmbed(event, guildId, showUpdate = true)
286+
}
275287
}
276288

277289
discordClient.getMessageById(old.channelId, old.messageId).edit(

core/src/main/kotlin/org/dreamexposure/discal/core/object/new/StaticMessage.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ data class StaticMessage(
3636

3737
enum class Type(val value: Int) {
3838
CALENDAR_OVERVIEW(1),
39-
CALENDAR_WEEKLY(2);
39+
CALENDAR_WEEKLY(2),
40+
NEXT_EVENT(3),
41+
;
4042

4143
companion object {
4244
fun getByValue(value: Int) = entries.first { it.value == value }

core/src/main/resources/commands/global/displayCal.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
{
2121
"name": "Weekly Overview",
2222
"value": 2
23+
},
24+
{
25+
"name": "Next Upcoming Event",
26+
"value": 3
2327
}
2428
]
2529
},

core/src/main/resources/i18n/embed/event.properties

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
upcoming.title=~ Next Upcoming Event ~
2+
upcoming.description.no-event=```\n[ No Upcoming Events ] \n```\n\nSchedule an event with `/event create`.
3+
upcoming.field.start=Start (Local)
4+
upcoming.field.end=End (Local)
5+
upcoming.field.location=Location
6+
upcoming.footer=Last Update
7+
8+
19
full.title=Event Info
210
full.field.start=Start (Local)
311
full.field.end=End (Local)

0 commit comments

Comments
 (0)