diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt index 651077a71..157187c06 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt @@ -90,19 +90,30 @@ class UserReportsSubAssembler( users: Iterable, eoseCache: EOSEAccountFast, inRelays: Set, - ): Collection> = - users - .groupBy { - eoseCache - .since(it) - ?.keys - ?.intersect(inRelays) - ?.hashCode() + ): Collection> { + if (users.none()) return emptyList() + + val relaySnapshot = inRelays.toSet() + + return users + .groupBy { user -> + val relaysForUser = eoseCache.sinceRelaySet(user) + if (relaysForUser.isNullOrEmpty() || relaySnapshot.isEmpty()) { + null + } else { + val intersection = relaysForUser.filter { it in relaySnapshot }.sorted() + if (intersection.isEmpty()) { + null + } else { + intersection.hashCode() + } + } }.values .map { // important to keep in order otherwise the Relay thinks the filter has changed and we REQ again it.sortedBy { it.pubkeyHex } } + } fun findMinimumEOSEsForUsers( users: List, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt index dfa5b2db4..9229450da 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relays/EOSE.kt @@ -166,6 +166,11 @@ class EOSEAccountFast( users[key]?.relayList?.toMutableMap() } + fun sinceRelaySet(key: T): Set? = + synchronized(lock) { + users[key]?.relayList?.keys?.toSet() + } + fun newEose( user: T, relayUrl: NormalizedRelayUrl,