Renames JsonFilter to just Filter and adds a matching function

This commit is contained in:
Vitor Pamplona 2024-06-25 10:06:06 -04:00
parent c448e75953
commit 79ace7f18c
20 changed files with 311 additions and 232 deletions

View File

@ -39,7 +39,7 @@ import com.vitorpamplona.ammolite.relays.BundledUpdate
import com.vitorpamplona.ammolite.relays.Client import com.vitorpamplona.ammolite.relays.Client
import com.vitorpamplona.ammolite.relays.Constants import com.vitorpamplona.ammolite.relays.Constants
import com.vitorpamplona.ammolite.relays.FeedType 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.Relay
import com.vitorpamplona.ammolite.relays.RelaySetupInfo import com.vitorpamplona.ammolite.relays.RelaySetupInfo
import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.ammolite.relays.TypedFilter
@ -116,7 +116,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.combineTransform
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flattenMerge import kotlinx.coroutines.flow.flattenMerge
@ -1060,7 +1059,7 @@ class Account(
listOf( listOf(
TypedFilter( TypedFilter(
setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL), setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL),
JsonFilter( Filter(
ids = listOf(it.id), ids = listOf(it.id),
), ),
), ),

View File

@ -28,7 +28,7 @@ import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES
import com.vitorpamplona.ammolite.relays.Client import com.vitorpamplona.ammolite.relays.Client
import com.vitorpamplona.ammolite.relays.EOSETime import com.vitorpamplona.ammolite.relays.EOSETime
import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES 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.Relay
import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.encoders.HexKey
@ -81,7 +81,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(ContactListEvent.KIND), kinds = listOf(ContactListEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
limit = 1, limit = 1,
@ -92,7 +92,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(MetadataEvent.KIND), kinds = listOf(MetadataEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
limit = 1, limit = 1,
@ -103,7 +103,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(StatusEvent.KIND, AdvertisedRelayListEvent.KIND, ChatMessageRelayListEvent.KIND, SearchRelayListEvent.KIND, PrivateOutboxRelayListEvent.KIND), kinds = listOf(StatusEvent.KIND, AdvertisedRelayListEvent.KIND, ChatMessageRelayListEvent.KIND, SearchRelayListEvent.KIND, PrivateOutboxRelayListEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
limit = 10, limit = 10,
@ -115,7 +115,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
return TypedFilter( return TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
MetadataEvent.KIND, MetadataEvent.KIND,
@ -138,7 +138,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND, BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND), kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND, BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
limit = 100, limit = 100,
@ -149,7 +149,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(DraftEvent.KIND, ReportEvent.KIND), kinds = listOf(DraftEvent.KIND, ReportEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
since = since =
@ -164,7 +164,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
limit = 400, limit = 400,
), ),
@ -181,7 +181,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
return TypedFilter( return TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
TextNoteEvent.KIND, TextNoteEvent.KIND,
@ -214,7 +214,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
return TypedFilter( return TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
GitReplyEvent.KIND, GitReplyEvent.KIND,
@ -236,7 +236,7 @@ object NostrAccountDataSource : AmethystNostrDataSource("AccountData") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(GiftWrapEvent.KIND), kinds = listOf(GiftWrapEvent.KIND),
tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)),
since = since =

View File

@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.Channel
import com.vitorpamplona.amethyst.model.LiveActivitiesChannel import com.vitorpamplona.amethyst.model.LiveActivitiesChannel
import com.vitorpamplona.amethyst.model.PublicChatChannel import com.vitorpamplona.amethyst.model.PublicChatChannel
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.ChannelMessageEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent
import com.vitorpamplona.quartz.events.LiveActivitiesChatMessageEvent import com.vitorpamplona.quartz.events.LiveActivitiesChatMessageEvent
@ -58,7 +58,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") {
return TypedFilter( return TypedFilter(
types = setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL, FeedType.SEARCH), types = setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL, FeedType.SEARCH),
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelMessageEvent.KIND), kinds = listOf(ChannelMessageEvent.KIND),
authors = listOf(myAccount.userProfile().pubkeyHex), authors = listOf(myAccount.userProfile().pubkeyHex),
limit = 50, limit = 50,
@ -71,7 +71,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") {
return TypedFilter( return TypedFilter(
types = setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL, FeedType.SEARCH), types = setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS, FeedType.GLOBAL, FeedType.SEARCH),
filter = filter =
JsonFilter( Filter(
kinds = listOf(LiveActivitiesChatMessageEvent.KIND), kinds = listOf(LiveActivitiesChatMessageEvent.KIND),
authors = listOf(myAccount.userProfile().pubkeyHex), authors = listOf(myAccount.userProfile().pubkeyHex),
limit = 50, limit = 50,
@ -86,7 +86,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") {
return TypedFilter( return TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelMessageEvent.KIND), kinds = listOf(ChannelMessageEvent.KIND),
tags = mapOf("e" to listOfNotNull(channel?.idHex)), tags = mapOf("e" to listOfNotNull(channel?.idHex)),
limit = 200, limit = 200,
@ -96,7 +96,7 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") {
return TypedFilter( return TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(LiveActivitiesChatMessageEvent.KIND), kinds = listOf(LiveActivitiesChatMessageEvent.KIND),
tags = mapOf("a" to listOfNotNull(channel?.idHex)), tags = mapOf("a" to listOfNotNull(channel?.idHex)),
limit = 200, limit = 200,
@ -113,7 +113,6 @@ object NostrChannelDataSource : AmethystNostrDataSource("ChatroomFeed") {
listOfNotNull( listOfNotNull(
createMessagesToChannelFilter(), createMessagesToChannelFilter(),
createMessagesByMeToChannelFilter(), createMessagesByMeToChannelFilter(),
) ).ifEmpty { null }
.ifEmpty { null }
} }
} }

View File

@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service
import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.EOSEAccount
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.ChatroomKey import com.vitorpamplona.quartz.events.ChatroomKey
import com.vitorpamplona.quartz.events.PrivateDmEvent import com.vitorpamplona.quartz.events.PrivateDmEvent
@ -50,7 +50,7 @@ object NostrChatroomDataSource : AmethystNostrDataSource("ChatroomFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.PRIVATE_DMS), types = setOf(FeedType.PRIVATE_DMS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(PrivateDmEvent.KIND), kinds = listOf(PrivateDmEvent.KIND),
authors = myPeer.users.toList(), authors = myPeer.users.toList(),
tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)),
@ -73,7 +73,7 @@ object NostrChatroomDataSource : AmethystNostrDataSource("ChatroomFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.PRIVATE_DMS), types = setOf(FeedType.PRIVATE_DMS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(PrivateDmEvent.KIND), kinds = listOf(PrivateDmEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
tags = mapOf("p" to myPeer.users.map { it }), tags = mapOf("p" to myPeer.users.map { it }),

View File

@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.EOSEAccount
import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelCreateEvent
import com.vitorpamplona.quartz.events.ChannelMessageEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent
@ -41,11 +41,14 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.PRIVATE_DMS), types = setOf(FeedType.PRIVATE_DMS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(PrivateDmEvent.KIND), kinds = listOf(PrivateDmEvent.KIND),
tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)),
since = 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( TypedFilter(
types = setOf(FeedType.PRIVATE_DMS), types = setOf(FeedType.PRIVATE_DMS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(PrivateDmEvent.KIND), kinds = listOf(PrivateDmEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
since = 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( TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND), kinds = listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND),
authors = listOf(account.userProfile().pubkeyHex), authors = listOf(account.userProfile().pubkeyHex),
since = 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 // Metadata comes from any relay
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelCreateEvent.KIND), kinds = listOf(ChannelCreateEvent.KIND),
ids = followingEvents.toList(), ids = followingEvents.toList(),
since = 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 // Metadata comes from any relay
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelMetadataEvent.KIND), kinds = listOf(ChannelMetadataEvent.KIND),
tags = mapOf("e" to listOf(it)), tags = mapOf("e" to listOf(it)),
limit = 1, limit = 1,
@ -119,11 +131,14 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelMessageEvent.KIND), kinds = listOf(ChannelMessageEvent.KIND),
tags = mapOf("e" to listOf(it)), tags = mapOf("e" to listOf(it)),
since = 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 // Remember to consider spam that is being removed from the UI
limit = 50, limit = 50,
), ),
@ -149,8 +164,7 @@ object NostrChatroomListDataSource : AmethystNostrDataSource("MailBoxFeed") {
list, list,
createLastChannelInfoFilter(), createLastChannelInfoFilter(),
createLastMessageOfEachChannelFilter(), createLastMessageOfEachChannelFilter(),
) ).flatten()
.flatten()
.ifEmpty { null } .ifEmpty { null }
} }
} }

View File

@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service
import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.amethyst.model.AddressableNote
import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.CommunityDefinitionEvent import com.vitorpamplona.quartz.events.CommunityDefinitionEvent
import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent
@ -38,7 +38,7 @@ object NostrCommunityDataSource : AmethystNostrDataSource("SingleCommunityFeed")
return TypedFilter( return TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
authors = authors =
community community
.moderators() .moderators()

View File

@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.Amethyst
import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.EOSEAccount
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.AppDefinitionEvent import com.vitorpamplona.quartz.events.AppDefinitionEvent
import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelCreateEvent
@ -66,15 +66,24 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createMarketplaceFilter(): List<TypedFilter> { fun createMarketplaceFilter(): List<TypedFilter> {
val follows = account.liveDiscoveryFollowLists.value?.users?.toList() val follows =
val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() account.liveDiscoveryFollowLists.value
val geohashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() ?.users
?.toList()
val hashToLoad =
account.liveDiscoveryFollowLists.value
?.hashtags
?.toList()
val geohashToLoad =
account.liveDiscoveryFollowLists.value
?.geotags
?.toList()
return listOfNotNull( return listOfNotNull(
TypedFilter( TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
authors = follows, authors = follows,
kinds = listOf(ClassifiedsEvent.KIND), kinds = listOf(ClassifiedsEvent.KIND),
limit = 300, limit = 300,
@ -89,7 +98,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(ClassifiedsEvent.KIND), kinds = listOf(ClassifiedsEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -111,7 +120,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(ClassifiedsEvent.KIND), kinds = listOf(ClassifiedsEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -132,12 +141,12 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
) )
} }
fun createNIP89Filter(kTags: List<String>): List<TypedFilter> { fun createNIP89Filter(kTags: List<String>): List<TypedFilter> =
return listOfNotNull( listOfNotNull(
TypedFilter( TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(AppDefinitionEvent.KIND), kinds = listOf(AppDefinitionEvent.KIND),
limit = 300, limit = 300,
tags = mapOf("k" to kTags), tags = mapOf("k" to kTags),
@ -149,16 +158,18 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
), ),
), ),
) )
}
fun createLiveStreamFilter(): List<TypedFilter> { fun createLiveStreamFilter(): List<TypedFilter> {
val follows = account.liveDiscoveryFollowLists.value?.users?.toList() val follows =
account.liveDiscoveryFollowLists.value
?.users
?.toList()
return listOfNotNull( return listOfNotNull(
TypedFilter( TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
authors = follows, authors = follows,
kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND),
limit = 300, limit = 300,
@ -173,7 +184,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
tags = mapOf("p" to it), tags = mapOf("p" to it),
kinds = listOf(LiveActivitiesEvent.KIND), kinds = listOf(LiveActivitiesEvent.KIND),
limit = 100, limit = 100,
@ -189,14 +200,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createPublicChatFilter(): List<TypedFilter> { fun createPublicChatFilter(): List<TypedFilter> {
val follows = account.liveDiscoveryFollowLists.value?.users?.toList() val follows =
account.liveDiscoveryFollowLists.value
?.users
?.toList()
val followChats = account.selectedChatsFollowList().toList() val followChats = account.selectedChatsFollowList().toList()
return listOfNotNull( return listOfNotNull(
TypedFilter( TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
authors = follows, authors = follows,
kinds = listOf(ChannelMessageEvent.KIND), kinds = listOf(ChannelMessageEvent.KIND),
limit = 500, limit = 500,
@ -211,7 +225,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
TypedFilter( TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
ids = followChats, ids = followChats,
kinds = listOf(ChannelCreateEvent.KIND, ChannelMessageEvent.KIND), kinds = listOf(ChannelCreateEvent.KIND, ChannelMessageEvent.KIND),
limit = 300, limit = 300,
@ -229,12 +243,15 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createCommunitiesFilter(): TypedFilter { fun createCommunitiesFilter(): TypedFilter {
val follows = account.liveDiscoveryFollowLists.value?.users?.toList() val follows =
account.liveDiscoveryFollowLists.value
?.users
?.toList()
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
authors = follows, authors = follows,
kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND),
limit = 300, limit = 300,
@ -248,14 +265,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createLiveStreamTagsFilter(): TypedFilter? { fun createLiveStreamTagsFilter(): TypedFilter? {
val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() val hashToLoad =
account.liveDiscoveryFollowLists.value
?.hashtags
?.toList()
if (hashToLoad.isNullOrEmpty()) return null if (hashToLoad.isNullOrEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -275,14 +295,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createLiveStreamGeohashesFilter(): TypedFilter? { fun createLiveStreamGeohashesFilter(): TypedFilter? {
val hashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() val hashToLoad =
account.liveDiscoveryFollowLists.value
?.geotags
?.toList()
if (hashToLoad.isNullOrEmpty()) return null if (hashToLoad.isNullOrEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND), kinds = listOf(LiveActivitiesChatMessageEvent.KIND, LiveActivitiesEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -302,14 +325,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createPublicChatsTagsFilter(): TypedFilter? { fun createPublicChatsTagsFilter(): TypedFilter? {
val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() val hashToLoad =
account.liveDiscoveryFollowLists.value
?.hashtags
?.toList()
if (hashToLoad.isNullOrEmpty()) return null if (hashToLoad.isNullOrEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND), listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND),
tags = tags =
@ -330,14 +356,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createPublicChatsGeohashesFilter(): TypedFilter? { fun createPublicChatsGeohashesFilter(): TypedFilter? {
val hashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() val hashToLoad =
account.liveDiscoveryFollowLists.value
?.geotags
?.toList()
if (hashToLoad.isNullOrEmpty()) return null if (hashToLoad.isNullOrEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND), listOf(ChannelCreateEvent.KIND, ChannelMetadataEvent.KIND, ChannelMessageEvent.KIND),
tags = tags =
@ -358,14 +387,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createCommunitiesTagsFilter(): TypedFilter? { fun createCommunitiesTagsFilter(): TypedFilter? {
val hashToLoad = account.liveDiscoveryFollowLists.value?.hashtags?.toList() val hashToLoad =
account.liveDiscoveryFollowLists.value
?.hashtags
?.toList()
if (hashToLoad.isNullOrEmpty()) return null if (hashToLoad.isNullOrEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -385,14 +417,17 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
} }
fun createCommunitiesGeohashesFilter(): TypedFilter? { fun createCommunitiesGeohashesFilter(): TypedFilter? {
val hashToLoad = account.liveDiscoveryFollowLists.value?.geotags?.toList() val hashToLoad =
account.liveDiscoveryFollowLists.value
?.geotags
?.toList()
if (hashToLoad.isNullOrEmpty()) return null if (hashToLoad.isNullOrEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND), kinds = listOf(CommunityDefinitionEvent.KIND, CommunityPostApprovalEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -437,8 +472,7 @@ object NostrDiscoveryDataSource : AmethystNostrDataSource("DiscoveryFeed") {
createPublicChatsTagsFilter(), createPublicChatsTagsFilter(),
createPublicChatsGeohashesFilter(), createPublicChatsGeohashesFilter(),
), ),
) ).toList()
.toList()
.ifEmpty { null } .ifEmpty { null }
} }
} }

View File

@ -21,7 +21,7 @@
package com.vitorpamplona.amethyst.service package com.vitorpamplona.amethyst.service
import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioHeaderEvent
import com.vitorpamplona.quartz.events.AudioTrackEvent import com.vitorpamplona.quartz.events.AudioTrackEvent
@ -43,7 +43,7 @@ object NostrGeohashDataSource : AmethystNostrDataSource("SingleGeoHashFeed") {
return TypedFilter( return TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
tags = tags =
mapOf( mapOf(
"g" to "g" to

View File

@ -21,7 +21,7 @@
package com.vitorpamplona.amethyst.service package com.vitorpamplona.amethyst.service
import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioHeaderEvent
import com.vitorpamplona.quartz.events.AudioTrackEvent import com.vitorpamplona.quartz.events.AudioTrackEvent
@ -43,7 +43,7 @@ object NostrHashtagDataSource : AmethystNostrDataSource("SingleHashtagFeed") {
return TypedFilter( return TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
tags = tags =
mapOf( mapOf(
"t" to "t" to

View File

@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.Amethyst
import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.EOSEAccount
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioHeaderEvent
import com.vitorpamplona.quartz.events.AudioTrackEvent import com.vitorpamplona.quartz.events.AudioTrackEvent
@ -80,7 +80,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") {
return TypedFilter( return TypedFilter(
types = setOf(if (follows == null) FeedType.GLOBAL else FeedType.FOLLOWS), types = setOf(if (follows == null) FeedType.GLOBAL else FeedType.FOLLOWS),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
TextNoteEvent.KIND, TextNoteEvent.KIND,
@ -116,7 +116,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") {
return TypedFilter( return TypedFilter(
types = setOf(FeedType.FOLLOWS), types = setOf(FeedType.FOLLOWS),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
TextNoteEvent.KIND, TextNoteEvent.KIND,
@ -155,7 +155,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") {
return TypedFilter( return TypedFilter(
types = setOf(FeedType.FOLLOWS), types = setOf(FeedType.FOLLOWS),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
TextNoteEvent.KIND, TextNoteEvent.KIND,
@ -194,7 +194,7 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") {
return TypedFilter( return TypedFilter(
types = setOf(FeedType.FOLLOWS), types = setOf(FeedType.FOLLOWS),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
TextNoteEvent.KIND, TextNoteEvent.KIND,
@ -238,7 +238,6 @@ object NostrHomeDataSource : AmethystNostrDataSource("HomeFeed") {
createFollowCommunitiesFilter(), createFollowCommunitiesFilter(),
createFollowTagsFilter(), createFollowTagsFilter(),
createFollowGeohashesFilter(), createFollowGeohashesFilter(),
) ).ifEmpty { null }
.ifEmpty { null }
} }
} }

View File

@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service
import com.vitorpamplona.ammolite.relays.Client import com.vitorpamplona.ammolite.relays.Client
import com.vitorpamplona.ammolite.relays.FeedType 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.Relay
import com.vitorpamplona.ammolite.relays.TypedFilter import com.vitorpamplona.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.LnZapPaymentResponseEvent import com.vitorpamplona.quartz.events.LnZapPaymentResponseEvent
@ -42,7 +42,7 @@ class NostrLnZapPaymentResponseDataSource(
return TypedFilter( return TypedFilter(
types = feedTypes, types = feedTypes,
filter = filter =
JsonFilter( Filter(
kinds = listOf(LnZapPaymentResponseEvent.KIND), kinds = listOf(LnZapPaymentResponseEvent.KIND),
authors = listOf(fromServiceHex), authors = listOf(fromServiceHex),
tags = tags =

View File

@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service
import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.crypto.KeyPair import com.vitorpamplona.quartz.crypto.KeyPair
import com.vitorpamplona.quartz.encoders.ATag import com.vitorpamplona.quartz.encoders.ATag
@ -95,7 +95,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(MetadataEvent.KIND, aTag.kind), kinds = listOf(MetadataEvent.KIND, aTag.kind),
authors = listOfNotNull(aTag.pubKeyHex), authors = listOfNotNull(aTag.pubKeyHex),
// just to be sure // just to be sure
@ -110,7 +110,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
ids = listOfNotNull(hexToWatch), ids = listOfNotNull(hexToWatch),
), ),
), ),
@ -118,7 +118,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(MetadataEvent.KIND), kinds = listOf(MetadataEvent.KIND),
authors = listOfNotNull(hexToWatch), authors = listOfNotNull(hexToWatch),
// just to be sure // just to be sure
@ -135,7 +135,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe
TypedFilter( TypedFilter(
types = setOf(FeedType.SEARCH), types = setOf(FeedType.SEARCH),
filter = filter =
JsonFilter( Filter(
kinds = listOf(MetadataEvent.KIND), kinds = listOf(MetadataEvent.KIND),
search = mySearchString, search = mySearchString,
limit = 1000, limit = 1000,
@ -144,7 +144,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe
TypedFilter( TypedFilter(
types = setOf(FeedType.SEARCH), types = setOf(FeedType.SEARCH),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
TextNoteEvent.KIND, TextNoteEvent.KIND,
@ -165,7 +165,7 @@ object NostrSearchEventOrUserDataSource : AmethystNostrDataSource("SearchEventFe
TypedFilter( TypedFilter(
types = setOf(FeedType.SEARCH), types = setOf(FeedType.SEARCH),
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
ChannelMetadataEvent.KIND, ChannelMetadataEvent.KIND,

View File

@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.LiveActivitiesChannel
import com.vitorpamplona.amethyst.model.PublicChatChannel import com.vitorpamplona.amethyst.model.PublicChatChannel
import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelCreateEvent
import com.vitorpamplona.quartz.events.ChannelMetadataEvent import com.vitorpamplona.quartz.events.ChannelMetadataEvent
@ -44,7 +44,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed
return TypedFilter( return TypedFilter(
types = setOf(FeedType.PUBLIC_CHATS), types = setOf(FeedType.PUBLIC_CHATS),
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelMetadataEvent.KIND), kinds = listOf(ChannelMetadataEvent.KIND),
tags = mapOf("e" to reactionsToWatch), tags = mapOf("e" to reactionsToWatch),
), ),
@ -65,7 +65,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed
return TypedFilter( return TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(ChannelCreateEvent.KIND), kinds = listOf(ChannelCreateEvent.KIND),
ids = interestedEvents.toList(), ids = interestedEvents.toList(),
), ),
@ -88,7 +88,7 @@ object NostrSingleChannelDataSource : AmethystNostrDataSource("SingleChannelFeed
TypedFilter( TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(aTag.kind), kinds = listOf(aTag.kind),
tags = mapOf("d" to listOf(aTag.dTag)), tags = mapOf("d" to listOf(aTag.dTag)),
authors = listOf(aTag.pubKeyHex), authors = listOf(aTag.pubKeyHex),

View File

@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.ammolite.relays.EOSETime import com.vitorpamplona.ammolite.relays.EOSETime
import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent
import com.vitorpamplona.quartz.events.DeletionEvent import com.vitorpamplona.quartz.events.DeletionEvent
@ -52,53 +52,53 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") {
( (
eventsToWatch.filter { it.address() != null } + eventsToWatch.filter { it.address() != null } +
addressesToWatch.filter { it.address() != null } addressesToWatch.filter { it.address() != null }
) ).toSet()
.toSet()
if (addressesToWatch.isEmpty()) { if (addressesToWatch.isEmpty()) {
return null return null
} }
return groupByEOSEPresence(addressesToWatch).map { return groupByEOSEPresence(addressesToWatch)
listOf( .map {
TypedFilter( listOf(
types = EVENT_FINDER_TYPES, TypedFilter(
filter = types = EVENT_FINDER_TYPES,
JsonFilter( filter =
kinds = Filter(
listOf( kinds =
TextNoteEvent.KIND, listOf(
ReactionEvent.KIND, TextNoteEvent.KIND,
RepostEvent.KIND, ReactionEvent.KIND,
GenericRepostEvent.KIND, RepostEvent.KIND,
ReportEvent.KIND, GenericRepostEvent.KIND,
LnZapEvent.KIND, ReportEvent.KIND,
PollNoteEvent.KIND, LnZapEvent.KIND,
CommunityPostApprovalEvent.KIND, PollNoteEvent.KIND,
LiveActivitiesChatMessageEvent.KIND, CommunityPostApprovalEvent.KIND,
), LiveActivitiesChatMessageEvent.KIND,
tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }), ),
since = findMinimumEOSEs(it), tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }),
// Max amount of "replies" to download on a specific event. since = findMinimumEOSEs(it),
limit = 1000, // Max amount of "replies" to download on a specific event.
), limit = 1000,
), ),
TypedFilter( ),
types = EVENT_FINDER_TYPES, TypedFilter(
filter = types = EVENT_FINDER_TYPES,
JsonFilter( filter =
kinds = Filter(
listOf( kinds =
DeletionEvent.KIND, listOf(
), DeletionEvent.KIND,
tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }), ),
since = findMinimumEOSEs(it), tags = mapOf("a" to it.mapNotNull { it.address()?.toTag() }),
// Max amount of "replies" to download on a specific event. since = findMinimumEOSEs(it),
limit = 10, // Max amount of "replies" to download on a specific event.
), limit = 10,
), ),
) ),
}.flatten() )
}.flatten()
} }
private fun createAddressFilter(): List<TypedFilter>? { private fun createAddressFilter(): List<TypedFilter>? {
@ -114,7 +114,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") {
TypedFilter( TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(aTag.kind), kinds = listOf(aTag.kind),
authors = listOf(aTag.pubKeyHex), authors = listOf(aTag.pubKeyHex),
limit = 5, limit = 5,
@ -124,7 +124,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") {
TypedFilter( TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(aTag.kind), kinds = listOf(aTag.kind),
tags = mapOf("d" to listOf(aTag.dTag)), tags = mapOf("d" to listOf(aTag.dTag)),
authors = listOf(aTag.pubKeyHex), authors = listOf(aTag.pubKeyHex),
@ -141,48 +141,49 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") {
return null return null
} }
return groupByEOSEPresence(eventsToWatch).map { return groupByEOSEPresence(eventsToWatch)
listOf( .map {
TypedFilter( listOf(
types = EVENT_FINDER_TYPES, TypedFilter(
filter = types = EVENT_FINDER_TYPES,
JsonFilter( filter =
kinds = Filter(
listOf( kinds =
TextNoteEvent.KIND, listOf(
ReactionEvent.KIND, TextNoteEvent.KIND,
RepostEvent.KIND, ReactionEvent.KIND,
GenericRepostEvent.KIND, RepostEvent.KIND,
ReportEvent.KIND, GenericRepostEvent.KIND,
LnZapEvent.KIND, ReportEvent.KIND,
PollNoteEvent.KIND, LnZapEvent.KIND,
OtsEvent.KIND, PollNoteEvent.KIND,
TextNoteModificationEvent.KIND, OtsEvent.KIND,
GitReplyEvent.KIND, TextNoteModificationEvent.KIND,
), GitReplyEvent.KIND,
tags = mapOf("e" to it.map { it.idHex }), ),
since = findMinimumEOSEs(it), tags = mapOf("e" to it.map { it.idHex }),
// Max amount of "replies" to download on a specific event. since = findMinimumEOSEs(it),
limit = 10000, // Max amount of "replies" to download on a specific event.
), limit = 10000,
), ),
TypedFilter( ),
types = EVENT_FINDER_TYPES, TypedFilter(
filter = types = EVENT_FINDER_TYPES,
JsonFilter( filter =
kinds = Filter(
listOf( kinds =
DeletionEvent.KIND, listOf(
NIP90ContentDiscoveryResponseEvent.KIND, DeletionEvent.KIND,
NIP90StatusEvent.KIND, NIP90ContentDiscoveryResponseEvent.KIND,
), NIP90StatusEvent.KIND,
tags = mapOf("e" to it.map { it.idHex }), ),
since = findMinimumEOSEs(it), tags = mapOf("e" to it.map { it.idHex }),
limit = 100, since = findMinimumEOSEs(it),
), limit = 100,
), ),
) ),
}.flatten() )
}.flatten()
} }
private fun createQuotesFilter(): List<TypedFilter>? { private fun createQuotesFilter(): List<TypedFilter>? {
@ -190,21 +191,22 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") {
return null return null
} }
return groupByEOSEPresence(eventsToWatch).map { return groupByEOSEPresence(eventsToWatch)
listOf( .map {
TypedFilter( listOf(
types = EVENT_FINDER_TYPES, TypedFilter(
filter = types = EVENT_FINDER_TYPES,
JsonFilter( filter =
kinds = listOf(TextNoteEvent.KIND), Filter(
tags = mapOf("q" to it.map { it.idHex }), kinds = listOf(TextNoteEvent.KIND),
since = findMinimumEOSEs(it), tags = mapOf("q" to it.map { it.idHex }),
// Max amount of "replies" to download on a specific event. since = findMinimumEOSEs(it),
limit = 1000, // Max amount of "replies" to download on a specific event.
), limit = 1000,
), ),
) ),
}.flatten() )
}.flatten()
} }
fun createLoadEventsIfNotLoadedFilter(): List<TypedFilter>? { fun createLoadEventsIfNotLoadedFilter(): List<TypedFilter>? {
@ -227,7 +229,7 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") {
TypedFilter( TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
ids = interestedEvents.toList(), ids = interestedEvents.toList(),
), ),
), ),
@ -304,13 +306,21 @@ object NostrSingleEventDataSource : AmethystNostrDataSource("SingleEventFeed") {
} }
} }
fun groupByEOSEPresence(notes: Set<Note>): Collection<List<Note>> { fun groupByEOSEPresence(notes: Set<Note>): Collection<List<Note>> =
return notes.groupBy { it.lastReactionsDownloadTime.keys.sorted().joinToString(",") }.values notes
} .groupBy {
it.lastReactionsDownloadTime.keys
.sorted()
.joinToString(",")
}.values
fun groupByEOSEPresence(users: Iterable<User>): Collection<List<User>> { fun groupByEOSEPresence(users: Iterable<User>): Collection<List<User>> =
return users.groupBy { it.latestEOSEs.keys.sorted().joinToString(",") }.values users
} .groupBy {
it.latestEOSEs.keys
.sorted()
.joinToString(",")
}.values
fun findMinimumEOSEs(notes: List<Note>): Map<String, EOSETime> { fun findMinimumEOSEs(notes: List<Note>): Map<String, EOSETime> {
val minLatestEOSEs = mutableMapOf<String, EOSETime>() val minLatestEOSEs = mutableMapOf<String, EOSETime>()

View File

@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service
import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.ammolite.relays.EOSETime import com.vitorpamplona.ammolite.relays.EOSETime
import com.vitorpamplona.ammolite.relays.EVENT_FINDER_TYPES 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent
import com.vitorpamplona.quartz.events.ChatMessageRelayListEvent import com.vitorpamplona.quartz.events.ChatMessageRelayListEvent
@ -45,7 +45,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") {
TypedFilter( TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(MetadataEvent.KIND, AdvertisedRelayListEvent.KIND), kinds = listOf(MetadataEvent.KIND, AdvertisedRelayListEvent.KIND),
authors = firstTimers, authors = firstTimers,
), ),
@ -68,7 +68,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") {
TypedFilter( TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(MetadataEvent.KIND, StatusEvent.KIND, AdvertisedRelayListEvent.KIND, ChatMessageRelayListEvent.KIND), kinds = listOf(MetadataEvent.KIND, StatusEvent.KIND, AdvertisedRelayListEvent.KIND, ChatMessageRelayListEvent.KIND),
authors = groupIds, authors = groupIds,
since = minEOSEs, since = minEOSEs,
@ -77,7 +77,7 @@ object NostrSingleUserDataSource : AmethystNostrDataSource("SingleUserFeed") {
TypedFilter( TypedFilter(
types = EVENT_FINDER_TYPES, types = EVENT_FINDER_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(ReportEvent.KIND), kinds = listOf(ReportEvent.KIND),
tags = mapOf("p" to groupIds), tags = mapOf("p" to groupIds),
since = minEOSEs, since = minEOSEs,

View File

@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service
import com.vitorpamplona.amethyst.model.ThreadAssembler import com.vitorpamplona.amethyst.model.ThreadAssembler
import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES 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.ammolite.relays.TypedFilter
object NostrThreadDataSource : AmethystNostrDataSource("SingleThreadFeed") { object NostrThreadDataSource : AmethystNostrDataSource("SingleThreadFeed") {
@ -45,7 +45,7 @@ object NostrThreadDataSource : AmethystNostrDataSource("SingleThreadFeed") {
return TypedFilter( return TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
ids = eventsToLoad.toList(), ids = eventsToLoad.toList(),
), ),
) )

View File

@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service
import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.ammolite.relays.COMMON_FEED_TYPES 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.AppRecommendationEvent import com.vitorpamplona.quartz.events.AppRecommendationEvent
import com.vitorpamplona.quartz.events.AudioHeaderEvent import com.vitorpamplona.quartz.events.AudioHeaderEvent
@ -55,7 +55,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(MetadataEvent.KIND), kinds = listOf(MetadataEvent.KIND),
authors = listOf(it.pubkeyHex), authors = listOf(it.pubkeyHex),
limit = 1, limit = 1,
@ -68,7 +68,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf( listOf(
TextNoteEvent.KIND, TextNoteEvent.KIND,
@ -93,7 +93,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(LnZapEvent.KIND), kinds = listOf(LnZapEvent.KIND),
tags = mapOf("p" to listOf(it.pubkeyHex)), tags = mapOf("p" to listOf(it.pubkeyHex)),
limit = 200, limit = 200,
@ -106,7 +106,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(ContactListEvent.KIND), kinds = listOf(ContactListEvent.KIND),
authors = listOf(it.pubkeyHex), authors = listOf(it.pubkeyHex),
limit = 1, limit = 1,
@ -119,7 +119,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(ContactListEvent.KIND), kinds = listOf(ContactListEvent.KIND),
tags = mapOf("p" to listOf(it.pubkeyHex)), tags = mapOf("p" to listOf(it.pubkeyHex)),
), ),
@ -131,7 +131,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(BadgeProfilesEvent.KIND), kinds = listOf(BadgeProfilesEvent.KIND),
authors = listOf(it.pubkeyHex), authors = listOf(it.pubkeyHex),
limit = 1, limit = 1,
@ -144,7 +144,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = kinds =
listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, AppRecommendationEvent.KIND), listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, AppRecommendationEvent.KIND),
authors = listOf(it.pubkeyHex), authors = listOf(it.pubkeyHex),
@ -158,7 +158,7 @@ object NostrUserProfileDataSource : AmethystNostrDataSource("UserProfileFeed") {
TypedFilter( TypedFilter(
types = COMMON_FEED_TYPES, types = COMMON_FEED_TYPES,
filter = filter =
JsonFilter( Filter(
kinds = listOf(BadgeAwardEvent.KIND), kinds = listOf(BadgeAwardEvent.KIND),
tags = mapOf("p" to listOf(it.pubkeyHex)), tags = mapOf("p" to listOf(it.pubkeyHex)),
limit = 20, limit = 20,

View File

@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.Amethyst
import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.service.relays.EOSEAccount import com.vitorpamplona.amethyst.service.relays.EOSEAccount
import com.vitorpamplona.ammolite.relays.FeedType 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.ammolite.relays.TypedFilter
import com.vitorpamplona.quartz.events.FileHeaderEvent import com.vitorpamplona.quartz.events.FileHeaderEvent
import com.vitorpamplona.quartz.events.FileStorageHeaderEvent import com.vitorpamplona.quartz.events.FileStorageHeaderEvent
@ -64,12 +64,15 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") {
} }
fun createContextualFilter(): TypedFilter { fun createContextualFilter(): TypedFilter {
val follows = account.liveStoriesFollowLists.value?.users?.toList() val follows =
account.liveStoriesFollowLists.value
?.users
?.toList()
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
authors = follows, authors = follows,
kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND),
limit = 200, limit = 200,
@ -84,14 +87,17 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") {
} }
fun createFollowTagsFilter(): TypedFilter? { 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 if (hashToLoad.isEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -112,14 +118,17 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") {
} }
fun createFollowGeohashesFilter(): TypedFilter? { 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 if (hashToLoad.isEmpty()) return null
return TypedFilter( return TypedFilter(
types = setOf(FeedType.GLOBAL), types = setOf(FeedType.GLOBAL),
filter = filter =
JsonFilter( Filter(
kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND), kinds = listOf(FileHeaderEvent.KIND, FileStorageHeaderEvent.KIND, VideoHorizontalEvent.KIND, VideoVerticalEvent.KIND),
tags = tags =
mapOf( mapOf(
@ -155,7 +164,6 @@ object NostrVideoDataSource : AmethystNostrDataSource("VideoFeed") {
createContextualFilter(), createContextualFilter(),
createFollowTagsFilter(), createFollowTagsFilter(),
createFollowGeohashesFilter(), createFollowGeohashesFilter(),
) ).ifEmpty { null }
.ifEmpty { null }
} }
} }

View File

@ -22,7 +22,7 @@ package com.vitorpamplona.ammolite.relays
import com.vitorpamplona.quartz.events.Event import com.vitorpamplona.quartz.events.Event
class JsonFilter( class Filter(
val ids: List<String>? = null, val ids: List<String>? = null,
val authors: List<String>? = null, val authors: List<String>? = null,
val kinds: List<Int>? = null, val kinds: List<Int>? = null,
@ -84,4 +84,20 @@ class JsonFilter(
} }
return Event.mapper.writeValueAsString(filter) 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
}
} }

View File

@ -22,5 +22,5 @@ package com.vitorpamplona.ammolite.relays
class TypedFilter( class TypedFilter(
val types: Set<FeedType>, val types: Set<FeedType>,
val filter: JsonFilter, val filter: Filter,
) )