Refactoring EOSEs to consider account switching in the app.

This commit is contained in:
Vitor Pamplona
2023-03-31 13:50:24 -04:00
parent bd62736002
commit 3145e381a0
5 changed files with 47 additions and 38 deletions

View File

@@ -12,7 +12,7 @@ import com.vitorpamplona.amethyst.service.model.ReactionEvent
import com.vitorpamplona.amethyst.service.model.ReportEvent import com.vitorpamplona.amethyst.service.model.ReportEvent
import com.vitorpamplona.amethyst.service.model.RepostEvent import com.vitorpamplona.amethyst.service.model.RepostEvent
import com.vitorpamplona.amethyst.service.model.TextNoteEvent 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.FeedType
import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.JsonFilter
import com.vitorpamplona.amethyst.service.relays.TypedFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter
@@ -20,7 +20,7 @@ import com.vitorpamplona.amethyst.service.relays.TypedFilter
object NostrAccountDataSource : NostrDataSource("AccountData") { object NostrAccountDataSource : NostrDataSource("AccountData") {
lateinit var account: Account lateinit var account: Account
var latestEOSEs: Map<String, EOSETime> = emptyMap() val latestEOSEs = EOSEAccount()
fun createAccountContactListFilter(): TypedFilter { fun createAccountContactListFilter(): TypedFilter {
return TypedFilter( return TypedFilter(
@@ -72,7 +72,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
filter = JsonFilter( filter = JsonFilter(
kinds = listOf(ReportEvent.kind), kinds = listOf(ReportEvent.kind),
authors = listOf(account.userProfile().pubkeyHex), 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)), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)),
limit = 400, limit = 400,
since = latestEOSEs since = latestEOSEs.users[account.userProfile()]?.relayList
) )
) )
val accountChannel = requestNewChannel { time, relayUrl -> val accountChannel = requestNewChannel { time, relayUrl ->
val eose = latestEOSEs[relayUrl] latestEOSEs.addOrUpdate(account.userProfile(), relayUrl, time)
if (eose == null) {
latestEOSEs = latestEOSEs + Pair(relayUrl, EOSETime(time))
} else {
eose.time = time
}
} }
override fun updateChannelFilters() { override fun updateChannelFilters() {

View File

@@ -5,7 +5,7 @@ import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent
import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent
import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent
import com.vitorpamplona.amethyst.service.model.PrivateDmEvent 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.FeedType
import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.JsonFilter
import com.vitorpamplona.amethyst.service.relays.TypedFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter
@@ -13,14 +13,14 @@ import com.vitorpamplona.amethyst.service.relays.TypedFilter
object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") { object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") {
lateinit var account: Account lateinit var account: Account
var latestEOSEs: Map<String, EOSETime> = emptyMap() val latestEOSEs = EOSEAccount()
fun createMessagesToMeFilter() = TypedFilter( fun createMessagesToMeFilter() = TypedFilter(
types = setOf(FeedType.PRIVATE_DMS), types = setOf(FeedType.PRIVATE_DMS),
filter = JsonFilter( filter = JsonFilter(
kinds = listOf(PrivateDmEvent.kind), kinds = listOf(PrivateDmEvent.kind),
tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), 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( filter = JsonFilter(
kinds = listOf(PrivateDmEvent.kind), kinds = listOf(PrivateDmEvent.kind),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
since = latestEOSEs since = latestEOSEs.users[account.userProfile()]?.relayList
) )
) )
@@ -38,7 +38,7 @@ object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") {
filter = JsonFilter( filter = JsonFilter(
kinds = listOf(ChannelCreateEvent.kind, ChannelMetadataEvent.kind), kinds = listOf(ChannelCreateEvent.kind, ChannelMetadataEvent.kind),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
since = latestEOSEs since = latestEOSEs.users[account.userProfile()]?.relayList
) )
) )
@@ -47,7 +47,7 @@ object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") {
filter = JsonFilter( filter = JsonFilter(
kinds = listOf(ChannelCreateEvent.kind), kinds = listOf(ChannelCreateEvent.kind),
ids = account.followingChannels.toList(), ids = account.followingChannels.toList(),
since = latestEOSEs since = latestEOSEs.users[account.userProfile()]?.relayList
) )
) )
@@ -71,20 +71,15 @@ object NostrChatroomListDataSource : NostrDataSource("MailBoxFeed") {
filter = JsonFilter( filter = JsonFilter(
kinds = listOf(ChannelMessageEvent.kind), kinds = listOf(ChannelMessageEvent.kind),
tags = mapOf("e" to listOf(it)), 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 limit = 25 // Remember to consider spam that is being removed from the UI
) )
) )
} }
} }
val chatroomListChannel = requestNewChannel() { time, relayUrl -> val chatroomListChannel = requestNewChannel { time, relayUrl ->
val eose = latestEOSEs[relayUrl] latestEOSEs.addOrUpdate(account.userProfile(), relayUrl, time)
if (eose == null) {
latestEOSEs = latestEOSEs + Pair(relayUrl, EOSETime(time))
} else {
eose.time = time
}
} }
override fun updateChannelFilters() { override fun updateChannelFilters() {

View File

@@ -4,7 +4,7 @@ import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.UserState import com.vitorpamplona.amethyst.model.UserState
import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent
import com.vitorpamplona.amethyst.service.model.TextNoteEvent 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.FeedType
import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.JsonFilter
import com.vitorpamplona.amethyst.service.relays.TypedFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter
@@ -16,7 +16,7 @@ import kotlinx.coroutines.launch
object NostrHomeDataSource : NostrDataSource("HomeFeed") { object NostrHomeDataSource : NostrDataSource("HomeFeed") {
lateinit var account: Account lateinit var account: Account
var latestEOSEs: Map<String, EOSETime> = emptyMap() val latestEOSEs = EOSEAccount()
private val cacheListener: (UserState) -> Unit = { private val cacheListener: (UserState) -> Unit = {
invalidateFilters() invalidateFilters()
@@ -57,7 +57,7 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") {
kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind), kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind),
authors = followSet, authors = followSet,
limit = 400, limit = 400,
since = latestEOSEs since = latestEOSEs.users[account.userProfile()]?.relayList
) )
) )
} }
@@ -77,18 +77,13 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") {
}.flatten() }.flatten()
), ),
limit = 100, limit = 100,
since = latestEOSEs since = latestEOSEs.users[account.userProfile()]?.relayList
) )
) )
} }
val followAccountChannel = requestNewChannel() { time, relayUrl -> val followAccountChannel = requestNewChannel { time, relayUrl ->
val eose = latestEOSEs[relayUrl] latestEOSEs.addOrUpdate(account.userProfile(), relayUrl, time)
if (eose == null) {
latestEOSEs = latestEOSEs + Pair(relayUrl, EOSETime(time))
} else {
eose.time = time
}
} }
override fun updateChannelFilters() { override fun updateChannelFilters() {

View File

@@ -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<String, EOSETime> = 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<User, EOSERelayList> = 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)
}
}
}

View File

@@ -4,9 +4,6 @@ import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.google.gson.JsonArray import com.google.gson.JsonArray
import com.google.gson.JsonObject import com.google.gson.JsonObject
import java.util.*
class EOSETime(var time: Long)
class JsonFilter( class JsonFilter(
val ids: List<String>? = null, val ids: List<String>? = null,