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 2fd531131..60fe2689f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -39,7 +39,7 @@ import com.vitorpamplona.ammolite.relays.BundledUpdate import com.vitorpamplona.ammolite.relays.Client import com.vitorpamplona.ammolite.relays.Constants import com.vitorpamplona.ammolite.relays.FeedType -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.Relay import com.vitorpamplona.ammolite.relays.RelaySetupInfo import com.vitorpamplona.ammolite.relays.TypedFilter @@ -116,7 +116,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flattenMerge @@ -1060,7 +1059,7 @@ class Account( listOf( TypedFilter( setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL), - JsonFilter( + Filter( 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 103dcd6c1..586332510 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt @@ -28,7 +28,7 @@ import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.Client import com.vitorpamplona.ammolite.relays.EOSETime import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.Relay import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.encoders.HexKey @@ -81,7 +81,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( kinds = listOf(StatusEvent.KIND, AdvertisedRelayListEvent.KIND, ChatMessageRelayListEvent.KIND, SearchRelayListEvent.KIND, PrivateOutboxRelayListEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), limit = 10, @@ -115,7 +115,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { return TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf( MetadataEvent.KIND, @@ -138,7 +138,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND, BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), limit = 100, @@ -149,7 +149,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(DraftEvent.KIND, ReportEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), since = @@ -164,7 +164,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( authors = listOf(account.userProfile().pubkeyHex), limit = 400, ), @@ -181,7 +181,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf( TextNoteEvent.KIND, @@ -214,7 +214,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf( GitReplyEvent.KIND, @@ -236,7 +236,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 dee51163a..53a67a931 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.Channel import com.vitorpamplona.amethyst.model.LiveActivitiesChannel import com.vitorpamplona.amethyst.model.PublicChatChannel import com.vitorpamplona.ammolite.relays.FeedType -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter 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 = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( kinds = listOf(LiveActivitiesChatMessageEvent.KIND), tags = mapOf("a" to listOfNotNull(channel?.idHex)), limit = 200, @@ -113,7 +113,6 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") { listOfNotNull( createMessagesToChannelFilter(), createMessagesByMeToChannelFilter(), - ) - .ifEmpty { null } + ).ifEmpty { null } } } 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 86858a07b..6298f533b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomDataSource.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter 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 = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( 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 35631e73f..63539453e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrChatroomListDataSource.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.Account 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.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent @@ -41,11 +41,14 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PRIVATE_DMS), filter = - JsonFilter( + Filter( kinds = listOf(PrivateDmEvent.KIND), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), since = - latestEOSEs.users[account.userProfile()]?.followList?.get(chatRoomList)?.relayList, + latestEOSEs.users[account.userProfile()] + ?.followList + ?.get(chatRoomList) + ?.relayList, ), ) @@ -53,11 +56,14 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PRIVATE_DMS), filter = - JsonFilter( + Filter( kinds = listOf(PrivateDmEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), since = - latestEOSEs.users[account.userProfile()]?.followList?.get(chatRoomList)?.relayList, + latestEOSEs.users[account.userProfile()] + ?.followList + ?.get(chatRoomList) + ?.relayList, ), ) @@ -65,11 +71,14 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - JsonFilter( + Filter( kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND), authors = listOf(account.userProfile().pubkeyHex), since = - latestEOSEs.users[account.userProfile()]?.followList?.get(chatRoomList)?.relayList, + latestEOSEs.users[account.userProfile()] + ?.followList + ?.get(chatRoomList) + ?.relayList, ), ) @@ -82,11 +91,14 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { // Metadata comes from any relay types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(ChannelCreateEvent.KIND), ids = followingEvents.toList(), since = - latestEOSEs.users[account.userProfile()]?.followList?.get(chatRoomList)?.relayList, + latestEOSEs.users[account.userProfile()] + ?.followList + ?.get(chatRoomList) + ?.relayList, ), ) } @@ -101,7 +113,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { // Metadata comes from any relay types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(ChannelMetadataEvent.KIND), tags = mapOf("e" to listOf(it)), limit = 1, @@ -119,11 +131,14 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - JsonFilter( + Filter( kinds = listOf(ChannelMessageEvent.KIND), tags = mapOf("e" to listOf(it)), since = - latestEOSEs.users[account.userProfile()]?.followList?.get(chatRoomList)?.relayList, + latestEOSEs.users[account.userProfile()] + ?.followList + ?.get(chatRoomList) + ?.relayList, // Remember to consider spam that is being removed from the UI limit = 50, ), @@ -149,8 +164,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") { list, createLastChannelInfoFilter(), createLastMessageOfEachChannelFilter(), - ) - .flatten() + ).flatten() .ifEmpty { null } } } 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 f96db2371..0dc2f9944 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrCommunityDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrCommunityDataSource.kt @@ -22,7 +22,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.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter 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 = - JsonFilter( + Filter( 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 62401ba1f..f51302c1a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrDiscoveryDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrDiscoveryDataSource.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.AppDefinitionEvent import com.vitorpamplona.quartz.events.ChannelCreateEvent @@ -66,15 +66,24 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createMarketplaceFilter(): List { - val follows = account.liveDiscoveryFollowLists.value?.users?.toList() - val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() - val geohashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() + val follows = + account.liveDiscoveryFollowLists.value + ?.users + ?.toList() + val hashToLoad = + account.liveDiscoveryFollowLists.value + ?.hashtags + ?.toList() + val geohashToLoad = + account.liveDiscoveryFollowLists.value + ?.geotags + ?.toList() return listOfNotNull( TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( authors = follows, kinds = listOf(ClassifiedsEvent.KIND), limit = 300, @@ -89,7 +98,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(ClassifiedsEvent.KIND), tags = mapOf( @@ -111,7 +120,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(ClassifiedsEvent.KIND), tags = mapOf( @@ -132,12 +141,12 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { ) } - fun createNIP89Filter(kTags: List): List { - return listOfNotNull( + fun createNIP89Filter(kTags: List): List = + listOfNotNull( TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(AppDefinitionEvent.KIND), limit = 300, tags = mapOf("k" to kTags), @@ -149,16 +158,18 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { ), ), ) - } fun createLiveStreamFilter(): List { - val follows = account.liveDiscoveryFollowLists.value?.users?.toList() + val follows = + account.liveDiscoveryFollowLists.value + ?.users + ?.toList() return listOfNotNull( TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( authors = follows, kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), limit = 300, @@ -173,7 +184,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( tags = mapOf("p" to it), kinds = listOf(LiveActivitiesEvent.KIND), limit = 100, @@ -189,14 +200,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createPublicChatFilter(): List { - val follows = account.liveDiscoveryFollowLists.value?.users?.toList() + val follows = + account.liveDiscoveryFollowLists.value + ?.users + ?.toList() val followChats = account.selectedChatsFollowList().toList() return listOfNotNull( TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - JsonFilter( + Filter( authors = follows, kinds = listOf(ChannelMessageEvent.KIND), limit = 500, @@ -211,7 +225,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - JsonFilter( + Filter( ids = followChats, kinds = listOf(ChannelCreateEvent.KIND, ChannelMessageEvent.KIND), limit = 300, @@ -229,12 +243,15 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createCommunitiesFilter(): TypedFilter { - val follows = account.liveDiscoveryFollowLists.value?.users?.toList() + val follows = + account.liveDiscoveryFollowLists.value + ?.users + ?.toList() return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( authors = follows, kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), limit = 300, @@ -248,14 +265,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createLiveStreamTagsFilter(): TypedFilter? { - val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() + val hashToLoad = + account.liveDiscoveryFollowLists.value + ?.hashtags + ?.toList() if (hashToLoad.isNullOrEmpty()) return null return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), tags = mapOf( @@ -275,14 +295,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createLiveStreamGeohashesFilter(): TypedFilter? { - val hashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() + val hashToLoad = + account.liveDiscoveryFollowLists.value + ?.geotags + ?.toList() if (hashToLoad.isNullOrEmpty()) return null return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), tags = mapOf( @@ -302,14 +325,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createPublicChatsTagsFilter(): TypedFilter? { - val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() + val hashToLoad = + account.liveDiscoveryFollowLists.value + ?.hashtags + ?.toList() if (hashToLoad.isNullOrEmpty()) return null return TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - JsonFilter( + Filter( kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND), tags = @@ -330,14 +356,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createPublicChatsGeohashesFilter(): TypedFilter? { - val hashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() + val hashToLoad = + account.liveDiscoveryFollowLists.value + ?.geotags + ?.toList() if (hashToLoad.isNullOrEmpty()) return null return TypedFilter( types = setOf(FeedType.PUBLIC_CHATS), filter = - JsonFilter( + Filter( kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND), tags = @@ -358,14 +387,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createCommunitiesTagsFilter(): TypedFilter? { - val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() + val hashToLoad = + account.liveDiscoveryFollowLists.value + ?.hashtags + ?.toList() if (hashToLoad.isNullOrEmpty()) return null return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), tags = mapOf( @@ -385,14 +417,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { } fun createCommunitiesGeohashesFilter(): TypedFilter? { - val hashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() + val hashToLoad = + account.liveDiscoveryFollowLists.value + ?.geotags + ?.toList() if (hashToLoad.isNullOrEmpty()) return null return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), tags = mapOf( @@ -437,8 +472,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") { createPublicChatsTagsFilter(), createPublicChatsGeohashesFilter(), ), - ) - .toList() + ).toList() .ifEmpty { null } } } 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 55ba2e658..12dc4cefa 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrGeohashDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrGeohashDataSource.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioTrackEvent @@ -43,7 +43,7 @@ object NostrGeohashDataSource : AmethystNostrDataSource("SingleGeoHashFeed") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 d13d6d695..60372d4ae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioTrackEvent @@ -43,7 +43,7 @@ object NostrHashtagDataSource : AmethystNostrDataSource("SingleHashtagFeed") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 2417d2f29..f9f159450 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioTrackEvent @@ -80,7 +80,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(if (follows == null) FeedType.GLOBAL else FeedType.FOLLOWS), filter = - JsonFilter( + Filter( kinds = listOf( TextNoteEvent.KIND, @@ -116,7 +116,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = - JsonFilter( + Filter( kinds = listOf( TextNoteEvent.KIND, @@ -155,7 +155,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = - JsonFilter( + Filter( kinds = listOf( TextNoteEvent.KIND, @@ -194,7 +194,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = - JsonFilter( + Filter( kinds = listOf( TextNoteEvent.KIND, @@ -238,7 +238,6 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") { createFollowCommunitiesFilter(), createFollowTagsFilter(), createFollowGeohashesFilter(), - ) - .ifEmpty { null } + ).ifEmpty { null } } } 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 cd5a927db..b0d77af3d 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.Client import com.vitorpamplona.ammolite.relays.FeedType -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.Relay import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.LnZapPaymentResponseEvent @@ -42,7 +42,7 @@ class NostrLnZapPaymentResponseDataSource( return TypedFilter( types = feedTypes, filter = - JsonFilter( + Filter( 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 432765728..268951e2d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt @@ -22,7 +22,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.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.crypto.KeyPair import com.vitorpamplona.quartz.encoders.ATag @@ -95,7 +95,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( ids = listOfNotNull(hexToWatch), ), ), @@ -118,7 +118,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 = - JsonFilter( + Filter( kinds = listOf(MetadataEvent.KIND), search = mySearchString, limit = 1000, @@ -144,7 +144,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = setOf(FeedType.SEARCH), filter = - JsonFilter( + Filter( kinds = listOf( TextNoteEvent.KIND, @@ -165,7 +165,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe TypedFilter( types = setOf(FeedType.SEARCH), filter = - JsonFilter( + Filter( 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 129e8746c..1b83ee2c9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleChannelDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleChannelDataSource.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.LiveActivitiesChannel 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.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter 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 = - JsonFilter( + Filter( kinds = listOf(ChannelMetadataEvent.KIND), tags = mapOf("e" to reactionsToWatch), ), @@ -65,7 +65,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed return TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(ChannelCreateEvent.KIND), ids = interestedEvents.toList(), ), @@ -88,7 +88,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( 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 cde6acce8..6087a1ab3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.ammolite.relays.EOSETime import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent import com.vitorpamplona.quartz.events.DeletionEvent @@ -52,53 +52,53 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { ( eventsToWatch.filter { it.address() != null } + addressesToWatch.filter { it.address() != null } - ) - .toSet() + ).toSet() if (addressesToWatch.isEmpty()) { return null } - return groupByEOSEPresence(addressesToWatch).map { - listOf( - TypedFilter( - types = EVENT_FINDER_TYPES, - filter = - JsonFilter( - kinds = - listOf( - TextNoteEvent.KIND, - ReactionEvent.KIND, - RepostEvent.KIND, - GenericRepostEvent.KIND, - ReportEvent.KIND, - LnZapEvent.KIND, - PollNoteEvent.KIND, - CommunityPostApprovalEvent.KIND, - LiveActivitiesChatMessageEvent.KIND, - ), - tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }), - since = findMinimumEOSEs(it), - // Max amount of "replies" to download on a specific event. - limit = 1000, - ), - ), - TypedFilter( - types = EVENT_FINDER_TYPES, - filter = - JsonFilter( - kinds = - listOf( - DeletionEvent.KIND, - ), - tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }), - since = findMinimumEOSEs(it), - // Max amount of "replies" to download on a specific event. - limit = 10, - ), - ), - ) - }.flatten() + return groupByEOSEPresence(addressesToWatch) + .map { + listOf( + TypedFilter( + types = EVENT_FINDER_TYPES, + filter = + Filter( + kinds = + listOf( + TextNoteEvent.KIND, + ReactionEvent.KIND, + RepostEvent.KIND, + GenericRepostEvent.KIND, + ReportEvent.KIND, + LnZapEvent.KIND, + PollNoteEvent.KIND, + CommunityPostApprovalEvent.KIND, + LiveActivitiesChatMessageEvent.KIND, + ), + tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }), + since = findMinimumEOSEs(it), + // Max amount of "replies" to download on a specific event. + limit = 1000, + ), + ), + TypedFilter( + types = EVENT_FINDER_TYPES, + filter = + Filter( + kinds = + listOf( + DeletionEvent.KIND, + ), + tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }), + since = findMinimumEOSEs(it), + // Max amount of "replies" to download on a specific event. + limit = 10, + ), + ), + ) + }.flatten() } private fun createAddressFilter(): List? { @@ -114,7 +114,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(aTag.kind), authors = listOf(aTag.pubKeyHex), limit = 5, @@ -124,7 +124,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(aTag.kind), tags = mapOf("d" to listOf(aTag.dTag)), authors = listOf(aTag.pubKeyHex), @@ -141,48 +141,49 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { return null } - return groupByEOSEPresence(eventsToWatch).map { - listOf( - TypedFilter( - types = EVENT_FINDER_TYPES, - filter = - JsonFilter( - kinds = - listOf( - TextNoteEvent.KIND, - ReactionEvent.KIND, - RepostEvent.KIND, - GenericRepostEvent.KIND, - ReportEvent.KIND, - LnZapEvent.KIND, - PollNoteEvent.KIND, - OtsEvent.KIND, - TextNoteModificationEvent.KIND, - GitReplyEvent.KIND, - ), - tags = mapOf("e" to it.map { it.idHex }), - since = findMinimumEOSEs(it), - // Max amount of "replies" to download on a specific event. - limit = 10000, - ), - ), - TypedFilter( - types = EVENT_FINDER_TYPES, - filter = - JsonFilter( - kinds = - listOf( - DeletionEvent.KIND, - NIP90ContentDiscoveryResponseEvent.KIND, - NIP90StatusEvent.KIND, - ), - tags = mapOf("e" to it.map { it.idHex }), - since = findMinimumEOSEs(it), - limit = 100, - ), - ), - ) - }.flatten() + return groupByEOSEPresence(eventsToWatch) + .map { + listOf( + TypedFilter( + types = EVENT_FINDER_TYPES, + filter = + Filter( + kinds = + listOf( + TextNoteEvent.KIND, + ReactionEvent.KIND, + RepostEvent.KIND, + GenericRepostEvent.KIND, + ReportEvent.KIND, + LnZapEvent.KIND, + PollNoteEvent.KIND, + OtsEvent.KIND, + TextNoteModificationEvent.KIND, + GitReplyEvent.KIND, + ), + tags = mapOf("e" to it.map { it.idHex }), + since = findMinimumEOSEs(it), + // Max amount of "replies" to download on a specific event. + limit = 10000, + ), + ), + TypedFilter( + types = EVENT_FINDER_TYPES, + filter = + Filter( + kinds = + listOf( + DeletionEvent.KIND, + NIP90ContentDiscoveryResponseEvent.KIND, + NIP90StatusEvent.KIND, + ), + tags = mapOf("e" to it.map { it.idHex }), + since = findMinimumEOSEs(it), + limit = 100, + ), + ), + ) + }.flatten() } private fun createQuotesFilter(): List? { @@ -190,21 +191,22 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { return null } - return groupByEOSEPresence(eventsToWatch).map { - listOf( - TypedFilter( - types = EVENT_FINDER_TYPES, - filter = - JsonFilter( - kinds = listOf(TextNoteEvent.KIND), - tags = mapOf("q" to it.map { it.idHex }), - since = findMinimumEOSEs(it), - // Max amount of "replies" to download on a specific event. - limit = 1000, - ), - ), - ) - }.flatten() + return groupByEOSEPresence(eventsToWatch) + .map { + listOf( + TypedFilter( + types = EVENT_FINDER_TYPES, + filter = + Filter( + kinds = listOf(TextNoteEvent.KIND), + tags = mapOf("q" to it.map { it.idHex }), + since = findMinimumEOSEs(it), + // Max amount of "replies" to download on a specific event. + limit = 1000, + ), + ), + ) + }.flatten() } fun createLoadEventsIfNotLoadedFilter(): List? { @@ -227,7 +229,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( ids = interestedEvents.toList(), ), ), @@ -304,13 +306,21 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") { } } -fun groupByEOSEPresence(notes: Set): Collection> { - return notes.groupBy { it.lastReactionsDownloadTime.keys.sorted().joinToString(",") }.values -} +fun groupByEOSEPresence(notes: Set): Collection> = + notes + .groupBy { + it.lastReactionsDownloadTime.keys + .sorted() + .joinToString(",") + }.values -fun groupByEOSEPresence(users: Iterable): Collection> { - return users.groupBy { it.latestEOSEs.keys.sorted().joinToString(",") }.values -} +fun groupByEOSEPresence(users: Iterable): Collection> = + users + .groupBy { + it.latestEOSEs.keys + .sorted() + .joinToString(",") + }.values fun findMinimumEOSEs(notes: List): Map { val minLatestEOSEs = mutableMapOf() 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 5b6f48b26..a163c176d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.ammolite.relays.EOSETime import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent import com.vitorpamplona.quartz.events.ChatMessageRelayListEvent @@ -45,7 +45,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(MetadataEvent.KIND, AdvertisedRelayListEvent.KIND), authors = firstTimers, ), @@ -68,7 +68,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(MetadataEvent.KIND, StatusEvent.KIND, AdvertisedRelayListEvent.KIND, ChatMessageRelayListEvent.KIND), authors = groupIds, since = minEOSEs, @@ -77,7 +77,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") { TypedFilter( types = EVENT_FINDER_TYPES, filter = - JsonFilter( + Filter( 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 3fae129a4..a132bc5c7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrThreadDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrThreadDataSource.kt @@ -22,7 +22,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.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter object NostrThreadDataSource : AmethystNostrDataSource("SingleThreadFeed") { @@ -45,7 +45,7 @@ object NostrThreadDataSource : AmethystNostrDataSource("SingleThreadFeed") { return TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 19e16f2ec..f05299d2c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt @@ -22,7 +22,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.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.AppRecommendationEvent import com.vitorpamplona.quartz.events.AudioHeaderEvent @@ -55,7 +55,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(MetadataEvent.KIND), authors = listOf(it.pubkeyHex), limit = 1, @@ -68,7 +68,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf( TextNoteEvent.KIND, @@ -93,7 +93,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(LnZapEvent.KIND), tags = mapOf("p" to listOf(it.pubkeyHex)), limit = 200, @@ -106,7 +106,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(ContactListEvent.KIND), authors = listOf(it.pubkeyHex), limit = 1, @@ -119,7 +119,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(ContactListEvent.KIND), tags = mapOf("p" to listOf(it.pubkeyHex)), ), @@ -131,7 +131,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(BadgeProfilesEvent.KIND), authors = listOf(it.pubkeyHex), limit = 1, @@ -144,7 +144,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, AppRecommendationEvent.KIND), authors = listOf(it.pubkeyHex), @@ -158,7 +158,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = - JsonFilter( + Filter( 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 2dc2c18f2..1165313af 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrVideoDataSource.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/NostrVideoDataSource.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.ammolite.relays.FeedType -import com.vitorpamplona.ammolite.relays.JsonFilter +import com.vitorpamplona.ammolite.relays.Filter import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.quartz.events.FileHeaderEvent import com.vitorpamplona.quartz.events.FileStorageHeaderEvent @@ -64,12 +64,15 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") { } fun createContextualFilter(): TypedFilter { - val follows = account.liveStoriesFollowLists.value?.users?.toList() + val follows = + account.liveStoriesFollowLists.value + ?.users + ?.toList() return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( authors = follows, kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), limit = 200, @@ -84,14 +87,17 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") { } fun createFollowTagsFilter(): TypedFilter? { - val hashToLoad = account.liveStoriesFollowLists.value?.hashtags?.toList() ?: return null + val hashToLoad = + account.liveStoriesFollowLists.value + ?.hashtags + ?.toList() ?: return null if (hashToLoad.isEmpty()) return null return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), tags = mapOf( @@ -112,14 +118,17 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") { } fun createFollowGeohashesFilter(): TypedFilter? { - val hashToLoad = account.liveStoriesFollowLists.value?.geotags?.toList() ?: return null + val hashToLoad = + account.liveStoriesFollowLists.value + ?.geotags + ?.toList() ?: return null if (hashToLoad.isEmpty()) return null return TypedFilter( types = setOf(FeedType.GLOBAL), filter = - JsonFilter( + Filter( kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), tags = mapOf( @@ -155,7 +164,6 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") { createContextualFilter(), createFollowTagsFilter(), createFollowGeohashesFilter(), - ) - .ifEmpty { null } + ).ifEmpty { null } } } diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/JsonFilter.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Filter.kt similarity index 85% rename from ammolite/src/main/java/com/vitorpamplona/ammolite/relays/JsonFilter.kt rename to ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Filter.kt index 8d36668be..700a59802 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/JsonFilter.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Filter.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.ammolite.relays import com.vitorpamplona.quartz.events.Event -class JsonFilter( +class Filter( val ids: List? = null, val authors: List? = null, val kinds: List? = null, @@ -84,4 +84,20 @@ class JsonFilter( } return Event.mapper.writeValueAsString(filter) } + + fun match( + event: Event, + forRelay: String? = null, + ): Boolean { + if (ids?.any { event.id == it } == false) return false + if (kinds?.any { event.kind == it } == false) return false + if (authors?.any { event.pubKey == it } == false) return false + tags?.forEach { tag -> + if (!event.tags.any { it.first() == tag.key && it[1] in tag.value }) return false + } + if (event.createdAt !in (since?.get(forRelay)?.time ?: Long.MIN_VALUE)..(until ?: Long.MAX_VALUE)) { + return false + } + return true + } } 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 84841a3e4..ad83c57de 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/TypedFilter.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/TypedFilter.kt @@ -22,5 +22,5 @@ package com.vitorpamplona.ammolite.relays class TypedFilter( val types: Set, - val filter: JsonFilter, + val filter: Filter, )