Skip to content

Commit e10b608

Browse files
committed
Add upcoming event with rsvp options for display cal
1 parent 06669d4 commit e10b608

5 files changed

Lines changed: 93 additions & 5 deletions

File tree

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

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,7 @@ class EmbedService(
377377
//////////////////////////
378378
////// Event Embeds //////
379379
//////////////////////////
380-
suspend fun nextUpcomingEventEmbed(event: Event?, guildId: Snowflake, showUpdate: Boolean): EmbedCreateSpec {
381-
val settings = settingsService.getSettings(guildId)
380+
suspend fun nextUpcomingEventEmbed(event: Event?, rsvp: Rsvp?, settings: GuildSettings, includeRsvp: Boolean, showUpdate: Boolean): EmbedCreateSpec {
382381
val builder = defaultEmbedBuilder(settings)
383382
.color(event?.color?.asColor() ?: GlobalVal.discalColor)
384383
.title(getEmbedMessage("event", "upcoming.title", settings.locale))
@@ -422,9 +421,52 @@ class EmbedService(
422421

423422
if (event.image.isNotEmpty()) builder.image(event.image)
424423

424+
// Add RSVP info
425+
if (includeRsvp && rsvp != null) {
426+
val waitlistDisplayLimit = Config.EMBED_RSVP_WAITLIST_DISPLAY_LENGTH.getInt()
427+
428+
val goingOnTime = rsvp.goingOnTime.map {
429+
discordClient.getUserById(it).data.awaitSingle()
430+
}.joinToString(", ") {
431+
it.globalName().orElse(it.username())
432+
}.ifEmpty { "N/a" }
433+
434+
val late = rsvp.goingLate.map {
435+
discordClient.getUserById(it).data.awaitSingle()
436+
}.joinToString(", ") {
437+
it.globalName().orElse(it.username())
438+
}.ifEmpty { "N/a" }
439+
440+
val waitList = if (rsvp.waitlist.size > waitlistDisplayLimit) {
441+
rsvp.waitlist.map {
442+
discordClient.getUserById(it).data.awaitSingle()
443+
}.joinToString(", ") {
444+
it.globalName().orElse(it.username())
445+
}.plus("+${rsvp.waitlist.size - waitlistDisplayLimit} more")
446+
} else {
447+
rsvp.waitlist.map {
448+
discordClient.getUserById(it).data.awaitSingle()
449+
}.joinToString(", ") {
450+
it.globalName().orElse(it.username())
451+
}
452+
}
453+
454+
val limitValue = if (rsvp.limit < 0) {
455+
getEmbedMessage("event", "upcoming.field.limit.value", settings.locale, "${rsvp.getCurrentCount()}")
456+
} else "${rsvp.getCurrentCount()}/${rsvp.limit}"
457+
458+
builder.addField(getEmbedMessage("event", "upcoming.field.onTime", settings.locale), goingOnTime, false)
459+
.addField(getEmbedMessage("event", "upcoming.field.late", settings.locale), late, false)
460+
461+
if (waitList.isNotEmpty()) builder.addField(getEmbedMessage("event", "upcoming.field.waitList", settings.locale), waitList, false)
462+
if (rsvp.limit > 0) builder.addField(getEmbedMessage("event", "upcoming.field.limit", settings.locale), limitValue, true)
463+
}
464+
425465
return builder.build()
426466
}
427467

468+
469+
428470
suspend fun fullEventEmbed(event: Event, settings: GuildSettings): EmbedCreateSpec {
429471
val builder = defaultEmbedBuilder(settings)
430472
.footer(getEmbedMessage("event", "full.footer", settings.locale, event.id), null)

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

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.dreamexposure.discal.core.business
22

33
import discord4j.common.util.Snowflake
44
import discord4j.core.DiscordClient
5+
import discord4j.core.`object`.component.LayoutComponent
56
import discord4j.discordjson.json.MessageCreateRequest
67
import discord4j.discordjson.json.MessageEditRequest
78
import discord4j.rest.http.client.ClientException
@@ -24,9 +25,11 @@ import java.time.temporal.ChronoUnit
2425

2526
@Component
2627
class StaticMessageService(
28+
private val settingsService: GuildSettingsService,
2729
private val staticMessageRepository: StaticMessageRepository,
2830
private val staticMessageCache: StaticMessageCache,
2931
private val calendarService: CalendarService,
32+
private val rsvpService: RsvpService,
3033
private val embedService: EmbedService,
3134
private val componentService: ComponentService,
3235
private val metricService: MetricService,
@@ -81,12 +84,14 @@ class StaticMessageService(
8184
updateHour: Long
8285
): StaticMessage {
8386
// Gather everything we need
87+
val settings = settingsService.getSettings(guildId)
8488
val calendar = calendarService.getCalendar(guildId, calendarNumber) ?: throw NotFoundException("Calendar not found")
8589
val channel = discordClient.getChannelById(channelId)
8690
val nextUpdate = ZonedDateTime.now(calendar.timezone)
8791
.truncatedTo(ChronoUnit.DAYS)
8892
.plusHours(updateHour + 24)
8993
.toInstant()
94+
val additionalComponents = mutableListOf<LayoutComponent>()
9095

9196
val embed = when (type) {
9297
StaticMessage.Type.CALENDAR_OVERVIEW -> {
@@ -99,7 +104,16 @@ class StaticMessageService(
99104
}
100105
StaticMessage.Type.NEXT_EVENT -> {
101106
val event = calendarService.getUpcomingEvents(guildId, calendarNumber, 1).firstOrNull()
102-
embedService.nextUpcomingEventEmbed(event, guildId, showUpdate = true)
107+
if (event != null) additionalComponents.addAll(componentService.getEventRsvpComponents(event, settings))
108+
109+
embedService.nextUpcomingEventEmbed(event, null, settings, includeRsvp = false, showUpdate = true)
110+
}
111+
StaticMessage.Type.NEXT_EVENT_WITH_RSVP -> {
112+
val event = calendarService.getUpcomingEvents(guildId, calendarNumber, 1).firstOrNull()
113+
val rsvp = if (event == null) null else rsvpService.getRsvp(guildId, event.id)
114+
if (event != null) additionalComponents.addAll(componentService.getEventRsvpComponents(event, settings, true))
115+
116+
embedService.nextUpcomingEventEmbed(event, rsvp, settings, includeRsvp = true, showUpdate = true)
103117
}
104118
}
105119

@@ -176,8 +190,10 @@ class StaticMessageService(
176190
}
177191

178192
val calendar = calendarService.getCalendar(guildId, old.calendarNumber) ?: throw NotFoundException("Calendar not found")
193+
val settings = settingsService.getSettings(guildId)
179194

180195
// Finally update the message
196+
val additionalComponents = mutableListOf<LayoutComponent>()
181197
val embed = when (old.type) {
182198
StaticMessage.Type.CALENDAR_OVERVIEW -> {
183199
val events = calendarService.getUpcomingEvents(guildId, old.calendarNumber, OVERVIEW_EVENT_COUNT, MAX_CUTOFF_DAYS)
@@ -189,7 +205,16 @@ class StaticMessageService(
189205
}
190206
StaticMessage.Type.NEXT_EVENT -> {
191207
val event = calendarService.getUpcomingEvents(guildId, old.calendarNumber, 1).firstOrNull()
192-
embedService.nextUpcomingEventEmbed(event, guildId, showUpdate = true)
208+
if (event != null) additionalComponents.addAll(componentService.getEventRsvpComponents(event, settings))
209+
210+
embedService.nextUpcomingEventEmbed(event, null, settings, includeRsvp = false, showUpdate = true)
211+
}
212+
StaticMessage.Type.NEXT_EVENT_WITH_RSVP -> {
213+
val event = calendarService.getUpcomingEvents(guildId, old.calendarNumber, 1).firstOrNull()
214+
val rsvp = if (event == null) null else rsvpService.getRsvp(guildId, event.id)
215+
if (event != null) additionalComponents.addAll(componentService.getEventRsvpComponents(event, settings, true))
216+
217+
embedService.nextUpcomingEventEmbed(event, rsvp, settings, includeRsvp = true, showUpdate = true)
193218
}
194219
}
195220

@@ -229,6 +254,7 @@ class StaticMessageService(
229254

230255
val oldVersions = getStaticMessagesForCalendar(guildId, calendarNumber).filter { it.enabled }
231256
val calendar = calendarService.getCalendar(guildId, calendarNumber) ?: throw NotFoundException("Calendar not found")
257+
val settings = settingsService.getSettings(guildId)
232258

233259
oldVersions.forEach { old ->
234260
val existingData = discordClient.getMessageById(old.channelId, old.messageId)
@@ -271,6 +297,7 @@ class StaticMessageService(
271297
return@forEach
272298
}
273299

300+
val additionalComponents = mutableListOf<LayoutComponent>()
274301
val embed = when (old.type) {
275302
StaticMessage.Type.CALENDAR_OVERVIEW -> {
276303
val events = calendarService.getUpcomingEvents(guildId, calendarNumber, OVERVIEW_EVENT_COUNT)
@@ -282,7 +309,16 @@ class StaticMessageService(
282309
}
283310
StaticMessage.Type.NEXT_EVENT -> {
284311
val event = calendarService.getUpcomingEvents(guildId, calendarNumber, 1).firstOrNull()
285-
embedService.nextUpcomingEventEmbed(event, guildId, showUpdate = true)
312+
if (event != null) additionalComponents.addAll(componentService.getEventRsvpComponents(event, settings))
313+
314+
embedService.nextUpcomingEventEmbed(event, null, settings, includeRsvp = false, showUpdate = true)
315+
}
316+
StaticMessage.Type.NEXT_EVENT_WITH_RSVP -> {
317+
val event = calendarService.getUpcomingEvents(guildId, calendarNumber, 1).firstOrNull()
318+
val rsvp = if (event == null) null else rsvpService.getRsvp(guildId, event.id)
319+
if (event != null) additionalComponents.addAll(componentService.getEventRsvpComponents(event, settings, true))
320+
321+
embedService.nextUpcomingEventEmbed(event, rsvp, settings, includeRsvp = true, showUpdate = true)
286322
}
287323
}
288324

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ data class StaticMessage(
3838
CALENDAR_OVERVIEW(1),
3939
CALENDAR_WEEKLY(2),
4040
NEXT_EVENT(3),
41+
NEXT_EVENT_WITH_RSVP(4),
4142
;
4243

4344
companion object {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
{
2525
"name": "Next Upcoming Event",
2626
"value": 3
27+
},
28+
{
29+
"name": "Next Upcoming Event With RSVP Info",
30+
"value": 4
2731
}
2832
]
2933
},

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ upcoming.description.no-event=```\n[ No Upcoming Events ] \n```\n\nSchedule an e
33
upcoming.field.start=Start (Local)
44
upcoming.field.end=End (Local)
55
upcoming.field.location=Location
6+
upcoming.field.limit=Max Attending
7+
upcoming.field.limit.value={0}/Unlimited
8+
upcoming.field.onTime=<:rsvp_on_time:1465796203013734490> Arriving On Time
9+
upcoming.field.late=<:rsvp_late:1465796205635309578> Arriving Late
10+
upcoming.field.waitList=<:rsvp_waitlist:1465796200958525491> Wait List
611
upcoming.footer=Last Update
712

813

0 commit comments

Comments
 (0)