diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index df549b916..28610273f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -42,7 +42,7 @@ import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.Relay import com.vitorpamplona.ammolite.relays.RelaySetupInfo import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.crypto.KeyPair import com.vitorpamplona.quartz.encoders.ATag import com.vitorpamplona.quartz.encoders.HexKey @@ -1126,7 +1126,7 @@ class Account( listOf( TypedFilter( setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL), - PerRelayFilter( + SincePerRelayFilter( ids = listOf(it.id), ), ), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt index 443b4b596..a0fa38d7f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt @@ -30,7 +30,7 @@ import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES import com.vitorpamplona.ammolite.relays.Relay import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.ammolite.relays.filters.EOSETime -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent import com.vitorpamplona.quartz.events.BadgeAwardEvent @@ -81,7 +81,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ContactListEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), limit = 1, @@ -92,7 +92,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(MetadataEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), limit = 1, @@ -103,7 +103,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( StatusEvent.KIND, @@ -124,7 +124,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { return TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( MetadataEvent.KIND, @@ -146,7 +146,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND, BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), limit = 100, @@ -157,7 +157,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(DraftEvent.KIND, ReportEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), since = @@ -172,7 +172,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( authors = listOf(account.userProfile().pubkeyHex), limit = 400, ), @@ -189,7 +189,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -222,7 +222,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( GitReplyEvent.KIND, @@ -244,7 +244,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(GiftWrapEvent.KIND), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), since = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt index 67490e146..b8f279938 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.model.LiveActivitiesChannel import com.vitorpamplona.amethyst.model.PublicChatChannel import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.ChannelMessageEvent import com.vitorpamplona.quartz.events.LiveActivitiesChatMessageEvent @@ -58,7 +58,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL, FeedType.SEARCH), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelMessageEvent.KIND), authors = listOf(myAccount.userProfile().pubkeyHex), limit = 50, @@ -71,7 +71,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL, FeedType.SEARCH), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(LiveActivitiesChatMessageEvent.KIND), authors = listOf(myAccount.userProfile().pubkeyHex), limit = 50, @@ -86,7 +86,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") { return TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelMessageEvent.KIND), tags = mapOf("e" to listOfNotNull(channel?.idHex)), limit = 200, @@ -96,7 +96,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") { return TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(LiveActivitiesChatMessageEvent.KIND), tags = mapOf("a" to listOfNotNull(channel?.idHex)), limit = 200, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomDataSource.kt index c5785184f..d05ea4cf6 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomDataSource.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.ChatroomKey import com.vitorpamplona.quartz.events.PrivateDmEvent @@ -50,7 +50,7 @@ object NostrChatroomDataSource : AmethystNostrDataSource("ChatroomFeed") { TypedFilter( types = setOf(FeedType.PRIVATE_DMS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(PrivateDmEvent.KIND), authors = myPeer.users.toList(), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), @@ -73,7 +73,7 @@ object NostrChatroomDataSource : AmethystNostrDataSource("ChatroomFeed") { TypedFilter( types = setOf(FeedType.PRIVATE_DMS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(PrivateDmEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), tags = mapOf("p" to myPeer.users.map { it }), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt index 4faa54f8f..b3ef5a1a0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent import com.vitorpamplona.quartz.events.ChannelMetadataEvent @@ -41,7 +41,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PRIVATE_DMS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(PrivateDmEvent.KIND), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), since = @@ -56,7 +56,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PRIVATE_DMS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(PrivateDmEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), since = @@ -71,7 +71,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), since = @@ -91,7 +91,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { // Metadata comes from any relay types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelCreateEvent.KIND), ids = followingEvents.toList(), since = @@ -113,7 +113,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { // Metadata comes from any relay types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelMetadataEvent.KIND), tags = mapOf("e" to listOf(it)), limit = 1, @@ -131,7 +131,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelMessageEvent.KIND), tags = mapOf("e" to listOf(it)), since = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrCommunityDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrCommunityDataSource.kt index 8ea391619..b0afb40dd 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrCommunityDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrCommunityDataSource.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.CommunityDefinitionEvent import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent @@ -38,7 +38,7 @@ object NostrCommunityDataSource : AmethystNostrDataSource("SingleCommunityFeed") return TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( authors = community .moderators() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrDiscoveryDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrDiscoveryDataSource.kt index 2e823a00e..b1bb432be 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrDiscoveryDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrDiscoveryDataSource.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.AppDefinitionEvent import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent @@ -83,7 +83,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( authors = follows, kinds = listOf(ClassifiedsEvent.KIND), limit = 300, @@ -98,7 +98,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ClassifiedsEvent.KIND), tags = mapOf( @@ -120,7 +120,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ClassifiedsEvent.KIND), tags = mapOf( @@ -146,7 +146,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(AppDefinitionEvent.KIND), limit = 300, tags = mapOf("k" to kTags), @@ -169,7 +169,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( authors = follows, kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), limit = 300, @@ -184,7 +184,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( tags = mapOf("p" to it), kinds = listOf(LiveActivitiesEvent.KIND), limit = 100, @@ -210,7 +210,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( authors = follows, kinds = listOf(ChannelMessageEvent.KIND), limit = 500, @@ -225,7 +225,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( ids = followChats, kinds = listOf(ChannelCreateEvent.KIND, ChannelMessageEvent.KIND), limit = 300, @@ -251,7 +251,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( authors = follows, kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), limit = 300, @@ -275,7 +275,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), tags = mapOf( @@ -305,7 +305,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), tags = mapOf( @@ -335,7 +335,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { return TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND), tags = @@ -366,7 +366,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { return TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND), tags = @@ -397,7 +397,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), tags = mapOf( @@ -427,7 +427,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), tags = mapOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrGeohashDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrGeohashDataSource.kt index 84575a593..828d0acee 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrGeohashDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrGeohashDataSource.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioTrackEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent @@ -43,7 +43,7 @@ object NostrGeohashDataSource : AmethystNostrDataSource("SingleGeoHashFeed") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( tags = mapOf( "g" to diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt index e0b3fb87a..a8885a957 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioTrackEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent @@ -43,7 +43,7 @@ object NostrHashtagDataSource : AmethystNostrDataSource("SingleHashtagFeed") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( tags = mapOf( "t" to diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt index b9bf35182..88fe876ae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioTrackEvent @@ -82,7 +82,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(if (follows == null) FeedType.GLOBAL else FeedType.FOLLOWS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -118,7 +118,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { TypedFilter( types = setOf(FeedType.FOLLOWS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( MetadataEvent.KIND, @@ -145,7 +145,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -184,7 +184,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -223,7 +223,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt index 20c775cad..8c1c93070 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.LnZapPaymentResponseEvent import com.vitorpamplona.quartz.signers.NostrSigner @@ -39,7 +39,7 @@ class NostrLnZapPaymentResponseDataSource( return TypedFilter( types = feedTypes, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(LnZapPaymentResponseEvent.KIND), authors = listOf(fromServiceHex), tags = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt index b46e046aa..71a54afae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.crypto.KeyPair import com.vitorpamplona.quartz.encoders.ATag import com.vitorpamplona.quartz.encoders.Hex @@ -95,7 +95,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(MetadataEvent.KIND, aTag.kind), authors = listOfNotNull(aTag.pubKeyHex), // just to be sure @@ -110,7 +110,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( ids = listOfNotNull(hexToWatch), ), ), @@ -118,7 +118,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(MetadataEvent.KIND), authors = listOfNotNull(hexToWatch), // just to be sure @@ -135,7 +135,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = setOf(FeedType.SEARCH), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(MetadataEvent.KIND), search = mySearchString, limit = 1000, @@ -144,7 +144,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = setOf(FeedType.SEARCH), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -165,7 +165,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = setOf(FeedType.SEARCH), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( ChannelMetadataEvent.KIND, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleChannelDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleChannelDataSource.kt index aec144c7d..4dc3f5c69 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleChannelDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleChannelDataSource.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.model.PublicChatChannel import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelMetadataEvent @@ -44,7 +44,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed return TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelMetadataEvent.KIND), tags = mapOf("e" to reactionsToWatch), ), @@ -65,7 +65,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed return TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ChannelCreateEvent.KIND), ids = interestedEvents.toList(), ), @@ -88,7 +88,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(aTag.kind), tags = mapOf("d" to listOf(aTag.dTag)), authors = listOf(aTag.pubKeyHex), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt index b1da8d58c..9fdc9bf06 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.ammolite.relays.filters.EOSETime -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent import com.vitorpamplona.quartz.events.DeletionEvent import com.vitorpamplona.quartz.events.GenericRepostEvent @@ -67,7 +67,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -89,7 +89,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( DeletionEvent.KIND, @@ -117,7 +117,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(aTag.kind), authors = listOf(aTag.pubKeyHex), limit = 5, @@ -127,7 +127,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(aTag.kind), tags = mapOf("d" to listOf(aTag.dTag)), authors = listOf(aTag.pubKeyHex), @@ -150,7 +150,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -173,7 +173,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( DeletionEvent.KIND, @@ -200,7 +200,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(TextNoteEvent.KIND), tags = mapOf("q" to it.map { it.idHex }), since = findMinimumEOSEs(it), @@ -232,7 +232,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( ids = interestedEvents.toList(), ), ), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt index 7d897a9d6..58e2d43df 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.ammolite.relays.filters.EOSETime -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent import com.vitorpamplona.quartz.events.ChatMessageRelayListEvent import com.vitorpamplona.quartz.events.MetadataEvent @@ -45,7 +45,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(MetadataEvent.KIND, AdvertisedRelayListEvent.KIND), authors = firstTimers, ), @@ -69,7 +69,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(MetadataEvent.KIND, StatusEvent.KIND, AdvertisedRelayListEvent.KIND, ChatMessageRelayListEvent.KIND), authors = groupIds, since = minEOSEs, @@ -78,7 +78,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ReportEvent.KIND), tags = mapOf("p" to groupIds), since = minEOSEs, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrThreadDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrThreadDataSource.kt index fabb398b3..19e0fc3f1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrThreadDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrThreadDataSource.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.ThreadAssembler import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter object NostrThreadDataSource : AmethystNostrDataSource("SingleThreadFeed") { private var eventToWatch: String? = null @@ -45,7 +45,7 @@ object NostrThreadDataSource : AmethystNostrDataSource("SingleThreadFeed") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( ids = eventsToLoad.toList(), ), ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt index 0079aeea8..723a02276 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.AppRecommendationEvent import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioTrackEvent @@ -56,7 +56,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(MetadataEvent.KIND), authors = listOf(it.pubkeyHex), limit = 1, @@ -69,7 +69,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf( TextNoteEvent.KIND, @@ -94,7 +94,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(LnZapEvent.KIND), tags = mapOf("p" to listOf(it.pubkeyHex)), limit = 200, @@ -107,7 +107,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ContactListEvent.KIND), authors = listOf(it.pubkeyHex), limit = 1, @@ -120,7 +120,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ContactListEvent.KIND), tags = mapOf("p" to listOf(it.pubkeyHex)), ), @@ -132,7 +132,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(BadgeProfilesEvent.KIND), authors = listOf(it.pubkeyHex), limit = 1, @@ -145,7 +145,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, AppRecommendationEvent.KIND), authors = listOf(it.pubkeyHex), @@ -159,7 +159,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(ProfileGalleryEntryEvent.KIND), authors = listOf(it.pubkeyHex), @@ -173,7 +173,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(BadgeAwardEvent.KIND), tags = mapOf("p" to listOf(it.pubkeyHex)), limit = 20, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrVideoDataSource.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrVideoDataSource.kt index 9ee3d7ade..a2394e030 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrVideoDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrVideoDataSource.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType import com.vitorpamplona.ammolite.relays.TypedFilter -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.events.FileHeaderEvent import com.vitorpamplona.quartz.events.FileStorageHeaderEvent import com.vitorpamplona.quartz.events.VideoHorizontalEvent @@ -72,7 +72,7 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( authors = follows, kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), limit = 200, @@ -97,7 +97,7 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), tags = mapOf( @@ -128,7 +128,7 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") { return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - PerRelayFilter( + SincePerRelayFilter( kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), tags = mapOf( diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Subscription.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Subscription.kt index 9f93b4104..80cdc8951 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Subscription.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Subscription.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.ammolite.relays +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import java.util.UUID data class Subscription( @@ -42,28 +43,40 @@ data class Subscription( typedFilters?.forEachIndexed { index, typedFilter -> val otherFilter = otherFilters?.getOrNull(index) ?: return true - // Does not check SINCE on purpose. Avoids replacing the filter if SINCE was all that changed. - // fast check - if (typedFilter.filter.authors?.size != otherFilter.filter.authors?.size || - typedFilter.filter.ids?.size != otherFilter.filter.ids?.size || - typedFilter.filter.tags?.size != otherFilter.filter.tags?.size || - typedFilter.filter.kinds?.size != otherFilter.filter.kinds?.size || - typedFilter.filter.limit != otherFilter.filter.limit || - typedFilter.filter.search?.length != otherFilter.filter.search?.length || - typedFilter.filter.until != otherFilter.filter.until - ) { - return true + if (typedFilter.filter is SincePerRelayFilter && otherFilter.filter is SincePerRelayFilter) { + return isDifferent(typedFilter.filter, otherFilter.filter) } - // deep check - if (typedFilter.filter.ids != otherFilter.filter.ids || - typedFilter.filter.authors != otherFilter.filter.authors || - typedFilter.filter.tags != otherFilter.filter.tags || - typedFilter.filter.kinds != otherFilter.filter.kinds || - typedFilter.filter.search != otherFilter.filter.search - ) { - return true - } + return true + } + return false + } + + fun isDifferent( + filter1: SincePerRelayFilter, + filter2: SincePerRelayFilter, + ): Boolean { + // Does not check SINCE on purpose. Avoids replacing the filter if SINCE was all that changed. + // fast check + if (filter1.authors?.size != filter2.authors?.size || + filter1.ids?.size != filter2.ids?.size || + filter1.tags?.size != filter2.tags?.size || + filter1.kinds?.size != filter2.kinds?.size || + filter1.limit != filter2.limit || + filter1.search?.length != filter2.search?.length || + filter1.until != filter2.until + ) { + return true + } + + // deep check + if (filter1.ids != filter2.ids || + filter1.authors != filter2.authors || + filter1.tags != filter2.tags || + filter1.kinds != filter2.kinds || + filter1.search != filter2.search + ) { + return true } return false } diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/TypedFilter.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/TypedFilter.kt index 3b1e9058f..a07e95feb 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/TypedFilter.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/TypedFilter.kt @@ -20,9 +20,9 @@ */ package com.vitorpamplona.ammolite.relays -import com.vitorpamplona.ammolite.relays.filters.PerRelayFilter +import com.vitorpamplona.ammolite.relays.filters.IPerRelayFilter class TypedFilter( val types: Set, - val filter: PerRelayFilter, + val filter: IPerRelayFilter, ) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/IPerRelayFilter.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/IPerRelayFilter.kt new file mode 100644 index 000000000..873ce36fe --- /dev/null +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/IPerRelayFilter.kt @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.ammolite.relays.filters + +import com.vitorpamplona.quartz.events.Event + +interface IPerRelayFilter { + fun toJson(forRelay: String): String + + fun match( + event: Event, + forRelay: String, + ): Boolean + + fun toDebugJson(): String +} diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/PerRelayFilter.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/SincePerRelayFilter.kt similarity index 85% rename from ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/PerRelayFilter.kt rename to ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/SincePerRelayFilter.kt index a069af66f..3bb9187a4 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/PerRelayFilter.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/filters/SincePerRelayFilter.kt @@ -22,7 +22,10 @@ package com.vitorpamplona.ammolite.relays.filters import com.vitorpamplona.quartz.events.Event -class PerRelayFilter( +/** + * This is a nostr filter with per-relay authors list and since parameters + */ +class SincePerRelayFilter( val ids: List? = null, val authors: List? = null, val kinds: List? = null, @@ -31,17 +34,18 @@ class PerRelayFilter( val until: Long? = null, val limit: Int? = null, val search: String? = null, -) { - fun toJson(forRelay: String) = FilterSerializer.toJson(ids, authors, kinds, tags, since?.get(forRelay)?.time, until, limit, search) +) : IPerRelayFilter { + override fun toJson(forRelay: String) = FilterSerializer.toJson(ids, authors, kinds, tags, since?.get(forRelay)?.time, until, limit, search) - fun match( + override fun match( event: Event, - forRelay: String? = null, + forRelay: String, ) = FilterMatcher.match(event, ids, authors, kinds, tags, since?.get(forRelay)?.time, until) - fun toDebugJson(): String { + override fun toDebugJson(): String { val factory = Event.mapper.nodeFactory val obj = FilterSerializer.toJsonObject(ids, authors, kinds, tags, null, until, limit, search) + since?.run { if (isNotEmpty()) { val jsonObjectSince = factory.objectNode()