mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-09-21 21:51:44 +02:00
Refactoring EOSEs to consider account switching in the app.
This commit is contained in:
@@ -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() {
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user