From dc61c5a8e46f27db8d13b175798e0d14cd07153c Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 10 Jul 2025 18:08:32 -0400 Subject: [PATCH] Keeps cache of the content inside Public chat forums --- .../admin/ChannelCreateEvent.kt | 32 +++++++++++++++---- .../admin/ChannelMetadataEvent.kt | 31 ++++++++++++++---- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelCreateEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelCreateEvent.kt index 5953c078a..b6c1e6f95 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelCreateEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelCreateEvent.kt @@ -22,11 +22,13 @@ package com.vitorpamplona.quartz.nip28PublicChat.admin import android.R.attr.data import android.util.Log +import android.util.Log.e import androidx.compose.runtime.Immutable import com.fasterxml.jackson.core.JsonParseException import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder +import com.vitorpamplona.quartz.nip01Core.core.has import com.vitorpamplona.quartz.nip01Core.hints.EventHintProvider import com.vitorpamplona.quartz.nip01Core.hints.types.EventIdHint import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -46,17 +48,33 @@ class ChannelCreateEvent( sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig), EventHintProvider { + @Transient + var cache: ChannelDataNorm? = null + override fun eventHints() = channelInfo().relays?.map { EventIdHint(id, it) } ?: emptyList() override fun linkedEventIds() = listOf(id) - fun channelInfo(): ChannelDataNorm = - try { - ChannelData.parse(content)?.normalize() ?: ChannelDataNorm() - } catch (e: JsonParseException) { - Log.w("ChannelCreateEvent", "Failure to parse ${this.toJson()}", e) - ChannelDataNorm() - } + fun isEncrypted() = tags.any { it.has(1) && it[0] == "encrypted" && it[1] == "true" } + + fun channelInfo(): ChannelDataNorm { + cache?.let { return it } + + val newInfo = + try { + if (isEncrypted()) { + ChannelDataNorm() + } else { + ChannelData.parse(content)?.normalize() ?: ChannelDataNorm() + } + } catch (e: JsonParseException) { + Log.w("ChannelCreateEvent", "Failure to parse ${this.toJson()}", e) + ChannelDataNorm() + } + + cache = newInfo + return newInfo + } companion object { const val KIND = 40 diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelMetadataEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelMetadataEvent.kt index 6446edcef..526214f20 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelMetadataEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/admin/ChannelMetadataEvent.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.Immutable import com.fasterxml.jackson.core.JsonParseException import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder +import com.vitorpamplona.quartz.nip01Core.core.has import com.vitorpamplona.quartz.nip01Core.hints.EventHintBundle import com.vitorpamplona.quartz.nip01Core.hints.EventHintProvider import com.vitorpamplona.quartz.nip01Core.hints.types.EventIdHint @@ -48,6 +49,9 @@ class ChannelMetadataEvent( sig: HexKey, ) : BasePublicChatEvent(id, pubKey, createdAt, KIND, tags, content, sig), EventHintProvider { + @Transient + var cache: ChannelDataNorm? = null + override fun eventHints() = channelInfo().relays?.mapNotNull { relay -> channelId()?.let { EventIdHint(it, relay) } @@ -55,13 +59,26 @@ class ChannelMetadataEvent( override fun linkedEventIds() = channelId()?.let { listOf(it) } ?: emptyList() - fun channelInfo(): ChannelDataNorm = - try { - ChannelData.parse(content)?.normalize() ?: ChannelDataNorm() - } catch (e: JsonParseException) { - Log.w("ChannelCreateEvent", "Failure to parse ${this.toJson()}", e) - ChannelDataNorm() - } + fun isEncrypted() = tags.any { it.has(1) && it[0] == "encrypted" && it[1] == "true" } + + fun channelInfo(): ChannelDataNorm { + cache?.let { return it } + + val newInfo = + try { + if (isEncrypted()) { + ChannelDataNorm() + } else { + ChannelData.parse(content)?.normalize() ?: ChannelDataNorm() + } + } catch (e: JsonParseException) { + Log.w("ChannelCreateEvent", "Failure to parse ${this.toJson()}", e) + ChannelDataNorm() + } + + cache = newInfo + return newInfo + } companion object { const val KIND = 41