diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt index 2c3558b41..9317680eb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt @@ -12,7 +12,7 @@ import com.vitorpamplona.amethyst.service.model.ReactionEvent import com.vitorpamplona.amethyst.service.model.ReportEvent import com.vitorpamplona.amethyst.service.model.RepostEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent -import com.vitorpamplona.amethyst.service.relays.EOSETime +import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.FeedType import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter @@ -20,7 +20,7 @@ import com.vitorpamplona.amethyst.service.relays.TypedFilter object NostrAccountDataSource : NostrDataSource("AccountData") { lateinit var account: Account - var latestEOSEs: Map = emptyMap() + val latestEOSEs = EOSEAccount() fun createAccountContactListFilter(): TypedFilter { return TypedFilter( @@ -72,7 +72,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { filter = JsonFilter( kinds = listOf(ReportEvent.kind), authors = listOf(account.userProfile().pubkeyHex), - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) } @@ -91,17 +91,12 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { ), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), limit = 400, - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) val accountChannel = requestNewChannel { time, relayUrl -> - val eose = latestEOSEs[relayUrl] - if (eose == null) { - latestEOSEs = latestEOSEs + Pair(relayUrl, EOSETime(time)) - } else { - eose.time = time - } + latestEOSEs.addOrUpdate(account.userProfile(), relayUrl, time) } override fun updateChannelFilters() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt index 31d38d844..a97fa5f41 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt @@ -5,7 +5,7 @@ import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent import com.vitorpamplona.amethyst.service.model.PrivateDmEvent -import com.vitorpamplona.amethyst.service.relays.EOSETime +import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.FeedType import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter @@ -13,14 +13,14 @@ import com.vitorpamplona.amethyst.service.relays.TypedFilter object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") { lateinit var account: Account - var latestEOSEs: Map = emptyMap() + val latestEOSEs = EOSEAccount() fun createMessagesToMeFilter() = TypedFilter( types = setOf(FeedType.PRIVATE_DMS), filter = JsonFilter( kinds = listOf(PrivateDmEvent.kind), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) @@ -29,7 +29,7 @@ object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") { filter = JsonFilter( kinds = listOf(PrivateDmEvent.kind), authors = listOf(account.userProfile().pubkeyHex), - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) @@ -38,7 +38,7 @@ object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") { filter = JsonFilter( kinds = listOf(ChannelCreateEvent.kind, ChannelMetadataEvent.kind), authors = listOf(account.userProfile().pubkeyHex), - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) @@ -47,7 +47,7 @@ object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") { filter = JsonFilter( kinds = listOf(ChannelCreateEvent.kind), ids = account.followingChannels.toList(), - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) @@ -71,20 +71,15 @@ object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") { filter = JsonFilter( kinds = listOf(ChannelMessageEvent.kind), tags = mapOf("e" to listOf(it)), - since = latestEOSEs, + since = latestEOSEs.users[account.userProfile()]?.relayList, limit = 25 // Remember to consider spam that is being removed from the UI ) ) } } - val chatroomListChannel = requestNewChannel() { time, relayUrl -> - val eose = latestEOSEs[relayUrl] - if (eose == null) { - latestEOSEs = latestEOSEs + Pair(relayUrl, EOSETime(time)) - } else { - eose.time = time - } + val chatroomListChannel = requestNewChannel { time, relayUrl -> + latestEOSEs.addOrUpdate(account.userProfile(), relayUrl, time) } override fun updateChannelFilters() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt index f59fa5961..7b3428a68 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt @@ -4,7 +4,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.UserState import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent -import com.vitorpamplona.amethyst.service.relays.EOSETime +import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.FeedType import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter @@ -16,7 +16,7 @@ import kotlinx.coroutines.launch object NostrHomeDataSource : NostrDataSource("HomeFeed") { lateinit var account: Account - var latestEOSEs: Map = emptyMap() + val latestEOSEs = EOSEAccount() private val cacheListener: (UserState) -> Unit = { invalidateFilters() @@ -57,7 +57,7 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") { kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind), authors = followSet, limit = 400, - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) } @@ -77,18 +77,13 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") { }.flatten() ), limit = 100, - since = latestEOSEs + since = latestEOSEs.users[account.userProfile()]?.relayList ) ) } - val followAccountChannel = requestNewChannel() { time, relayUrl -> - val eose = latestEOSEs[relayUrl] - if (eose == null) { - latestEOSEs = latestEOSEs + Pair(relayUrl, EOSETime(time)) - } else { - eose.time = time - } + val followAccountChannel = requestNewChannel { time, relayUrl -> + latestEOSEs.addOrUpdate(account.userProfile(), relayUrl, time) } override fun updateChannelFilters() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt new file mode 100644 index 000000000..b55904bb7 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt @@ -0,0 +1,27 @@ +package com.vitorpamplona.amethyst.service.relays + +import com.vitorpamplona.amethyst.model.User + +class EOSETime(var time: Long) + +class EOSERelayList(var relayList: Map = emptyMap()) { + fun addOrUpdate(relayUrl: String, time: Long) { + val eose = relayList[relayUrl] + if (eose == null) { + relayList = relayList + Pair(relayUrl, EOSETime(time)) + } else { + eose.time = time + } + } +} + +class EOSEAccount(var users: Map = emptyMap()) { + fun addOrUpdate(user: User, relayUrl: String, time: Long) { + val relayList = users[user] + if (relayList == null) { + users = users + mapOf(user to EOSERelayList(mapOf(relayUrl to EOSETime(time)))) + } else { + relayList.addOrUpdate(relayUrl, time) + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/JsonFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/JsonFilter.kt index 8f58036d3..74bc52613 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/JsonFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/JsonFilter.kt @@ -4,9 +4,6 @@ import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonArray import com.google.gson.JsonObject -import java.util.* - -class EOSETime(var time: Long) class JsonFilter( val ids: List? = null,