From af143f2ea1ca8b30fe747aae8b393881608022a4 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 22 Aug 2023 16:19:59 -0400 Subject: [PATCH] Base support for Calendar events --- .../quartz/events/CalendarDateSlotEvent.kt | 44 +++++++++++++++++ .../quartz/events/CalendarEvent.kt | 36 ++++++++++++++ .../quartz/events/CalendarRSVPEvent.kt | 46 +++++++++++++++++ .../quartz/events/CalendarTimeSlotEvent.kt | 49 +++++++++++++++++++ .../quartz/events/EventFactory.kt | 4 ++ 5 files changed, 179 insertions(+) create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarDateSlotEvent.kt create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarEvent.kt create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarRSVPEvent.kt create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarTimeSlotEvent.kt diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarDateSlotEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarDateSlotEvent.kt new file mode 100644 index 000000000..4b3e61b69 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarDateSlotEvent.kt @@ -0,0 +1,44 @@ +package com.vitorpamplona.quartz.events + +import androidx.compose.runtime.Immutable +import com.vitorpamplona.quartz.utils.TimeUtils +import com.vitorpamplona.quartz.encoders.toHexKey +import com.vitorpamplona.quartz.crypto.CryptoUtils +import com.vitorpamplona.quartz.encoders.ATag +import com.vitorpamplona.quartz.encoders.HexKey + +@Immutable +class CalendarDateSlotEvent( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + tags: List>, + content: String, + sig: HexKey +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) + + fun location() = tags.firstOrNull { it.size > 1 && it[0] == "location" }?.get(1) + fun start() = tags.firstOrNull { it.size > 1 && it[0] == "start" }?.get(1) + fun end() = tags.firstOrNull { it.size > 1 && it[0] == "end" }?.get(1) + + // ["start", ""], + // ["end", ""], + + companion object { + const val kind = 31922 + + fun create( + privateKey: ByteArray, + createdAt: Long = TimeUtils.now() + ): CalendarDateSlotEvent { + val tags = mutableListOf>() + val pubKey = CryptoUtils.pubkeyCreate(privateKey).toHexKey() + val id = generateId(pubKey, createdAt, kind, tags, "") + val sig = CryptoUtils.sign(id, privateKey) + return CalendarDateSlotEvent(id.toHexKey(), pubKey, createdAt, tags, "", sig.toHexKey()) + } + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarEvent.kt new file mode 100644 index 000000000..a21141367 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarEvent.kt @@ -0,0 +1,36 @@ +package com.vitorpamplona.quartz.events + +import androidx.compose.runtime.Immutable +import com.vitorpamplona.quartz.utils.TimeUtils +import com.vitorpamplona.quartz.encoders.toHexKey +import com.vitorpamplona.quartz.crypto.CryptoUtils +import com.vitorpamplona.quartz.encoders.ATag +import com.vitorpamplona.quartz.encoders.HexKey + +@Immutable +class CalendarEvent( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + tags: List>, + content: String, + sig: HexKey +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) + + companion object { + const val kind = 31924 + + fun create( + privateKey: ByteArray, + createdAt: Long = TimeUtils.now() + ): CalendarEvent { + val tags = mutableListOf>() + val pubKey = CryptoUtils.pubkeyCreate(privateKey).toHexKey() + val id = generateId(pubKey, createdAt, kind, tags, "") + val sig = CryptoUtils.sign(id, privateKey) + return CalendarEvent(id.toHexKey(), pubKey, createdAt, tags, "", sig.toHexKey()) + } + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarRSVPEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarRSVPEvent.kt new file mode 100644 index 000000000..4a2b48166 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarRSVPEvent.kt @@ -0,0 +1,46 @@ +package com.vitorpamplona.quartz.events + +import androidx.compose.runtime.Immutable +import com.vitorpamplona.quartz.utils.TimeUtils +import com.vitorpamplona.quartz.encoders.toHexKey +import com.vitorpamplona.quartz.crypto.CryptoUtils +import com.vitorpamplona.quartz.encoders.ATag +import com.vitorpamplona.quartz.encoders.HexKey + +@Immutable +class CalendarRSVPEvent( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + tags: List>, + content: String, + sig: HexKey +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) + + fun status() = tags.firstOrNull { it.size > 1 && it[0] == "location" }?.get(1) + fun start() = tags.firstOrNull { it.size > 1 && it[0] == "start" }?.get(1) + fun end() = tags.firstOrNull { it.size > 1 && it[0] == "end" }?.get(1) + + // ["L", "status"], + // ["l", "", "status"], + // ["L", "freebusy"], + // ["l", "", "freebusy"] + + companion object { + const val kind = 31925 + + fun create( + privateKey: ByteArray, + createdAt: Long = TimeUtils.now() + ): CalendarRSVPEvent { + val tags = mutableListOf>() + val pubKey = CryptoUtils.pubkeyCreate(privateKey).toHexKey() + val id = generateId(pubKey, createdAt, kind, tags, "") + val sig = CryptoUtils.sign(id, privateKey) + return CalendarRSVPEvent(id.toHexKey(), pubKey, createdAt, tags, "", sig.toHexKey()) + } + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarTimeSlotEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarTimeSlotEvent.kt new file mode 100644 index 000000000..7a18d1f78 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/CalendarTimeSlotEvent.kt @@ -0,0 +1,49 @@ +package com.vitorpamplona.quartz.events + +import androidx.compose.runtime.Immutable +import com.vitorpamplona.quartz.utils.TimeUtils +import com.vitorpamplona.quartz.encoders.toHexKey +import com.vitorpamplona.quartz.crypto.CryptoUtils +import com.vitorpamplona.quartz.encoders.ATag +import com.vitorpamplona.quartz.encoders.HexKey + +@Immutable +class CalendarTimeSlotEvent( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + tags: List>, + content: String, + sig: HexKey +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) + + fun location() = tags.firstOrNull { it.size > 1 && it[0] == "location" }?.get(1) + fun start() = tags.firstOrNull { it.size > 1 && it[0] == "start" }?.get(1)?.toLongOrNull() + fun end() = tags.firstOrNull { it.size > 1 && it[0] == "end" }?.get(1)?.toLongOrNull() + + fun startTmz() = tags.firstOrNull { it.size > 1 && it[0] == "start_tzid" }?.get(1)?.toLongOrNull() + fun endTmz() = tags.firstOrNull { it.size > 1 && it[0] == "end_tzid" }?.get(1)?.toLongOrNull() + + // ["start", ""], + // ["end", ""], + // ["start_tzid", ""], + // ["end_tzid", ""], + + companion object { + const val kind = 31923 + + fun create( + privateKey: ByteArray, + createdAt: Long = TimeUtils.now() + ): CalendarTimeSlotEvent { + val tags = mutableListOf>() + val pubKey = CryptoUtils.pubkeyCreate(privateKey).toHexKey() + val id = generateId(pubKey, createdAt, kind, tags, "") + val sig = CryptoUtils.sign(id, privateKey) + return CalendarTimeSlotEvent(id.toHexKey(), pubKey, createdAt, tags, "", sig.toHexKey()) + } + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/EventFactory.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/EventFactory.kt index 70f66321a..0cdab7daa 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/EventFactory.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/EventFactory.kt @@ -22,6 +22,10 @@ class EventFactory { BadgeDefinitionEvent.kind -> BadgeDefinitionEvent(id, pubKey, createdAt, tags, content, sig) BadgeProfilesEvent.kind -> BadgeProfilesEvent(id, pubKey, createdAt, tags, content, sig) BookmarkListEvent.kind -> BookmarkListEvent(id, pubKey, createdAt, tags, content, sig) + CalendarEvent.kind -> CalendarEvent(id, pubKey, createdAt, tags, content, sig) + CalendarDateSlotEvent.kind -> CalendarDateSlotEvent(id, pubKey, createdAt, tags, content, sig) + CalendarTimeSlotEvent.kind -> CalendarTimeSlotEvent(id, pubKey, createdAt, tags, content, sig) + CalendarRSVPEvent.kind -> CalendarRSVPEvent(id, pubKey, createdAt, tags, content, sig) ChannelCreateEvent.kind -> ChannelCreateEvent(id, pubKey, createdAt, tags, content, sig) ChannelHideMessageEvent.kind -> ChannelHideMessageEvent(id, pubKey, createdAt, tags, content, sig) ChannelMessageEvent.kind -> ChannelMessageEvent(id, pubKey, createdAt, tags, content, sig)