From 8a50b3938ddb7174dc15a954df0f46d29f28ab0c Mon Sep 17 00:00:00 2001 From: Believethehype <1097224+believethehype@users.noreply.github.com> Date: Tue, 14 May 2024 21:41:36 +0200 Subject: [PATCH] send request, get results (still needs parsing) --- .../ui/dal/NIP90ContentDiscoveryFilter.kt | 59 ++++++++++++-- .../amethyst/ui/navigation/AppNavigation.kt | 12 +-- .../types/NIP90ContentDiscoveryResponse.kt | 77 ++++++------------- .../amethyst/ui/screen/FeedViewModel.kt | 8 +- .../loggedIn/NIP90ContentDiscoveryScreen.kt | 48 +++++++----- 5 files changed, 116 insertions(+), 88 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryFilter.kt index 54b64fdd2..c5d613d1d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NIP90ContentDiscoveryFilter.kt @@ -20,15 +20,19 @@ */ package com.vitorpamplona.amethyst.ui.dal +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.quartz.encoders.toHexKey import com.vitorpamplona.quartz.events.MuteListEvent import com.vitorpamplona.quartz.events.NIP90ContentDiscoveryResponseEvent import com.vitorpamplona.quartz.events.PeopleListEvent open class NIP90ContentDiscoveryFilter( val account: Account, + val dvmkey: String, ) : AdditiveFeedFilter() { override fun feedKey(): String { return account.userProfile().pubkeyHex + "-" + followList() @@ -49,15 +53,28 @@ open class NIP90ContentDiscoveryFilter( val notes = LocalCache.notes.filterIntoSet { _, it -> val noteEvent = it.event - noteEvent is NIP90ContentDiscoveryResponseEvent // && params.match(noteEvent) + noteEvent is NIP90ContentDiscoveryResponseEvent && it.event?.pubKey() == dvmkey && it.event?.isTaggedUser(account.keyPair.pubKey.toHexKey()) == true // && params.match(noteEvent) } + var sorted = sort(notes) + var note = sorted.first() - return sort(notes) + var eventContent = note.event?.content() + + var collection: Set = setOf() + val mapper = jacksonObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + var json = mapper.readValue(eventContent, Array::class.java) + for (element in json) { + // var test = mapper.readValue(element.toString(), Array::class.java) + // TODO. This is ugly. how to Kotlin? + var id = element.toString().trimStart('[').trimStart('e').trimStart(',').trimEnd(']').trimStart().trimEnd() + collection + id + } + + return sort(collection) } override fun applyFilter(collection: Set): Set { - var result = innerApplyFilter(collection) - return result + return innerApplyFilter(collection) } fun buildFilterParams(account: Account): FilterByListParams { @@ -70,12 +87,38 @@ open class NIP90ContentDiscoveryFilter( } protected open fun innerApplyFilter(collection: Collection): Set { - val params = buildFilterParams(account) + // val params = buildFilterParams(account) - return collection.filterTo(HashSet()) { - val noteEvent = it.event - noteEvent is NIP90ContentDiscoveryResponseEvent // && params.match(noteEvent) + val notes = + collection.filterTo(HashSet()) { + val noteEvent = it.event + noteEvent is NIP90ContentDiscoveryResponseEvent && it.event?.isTaggedUser(account.keyPair.pubKey.toHexKey()) == true // && params.match(noteEvent) + } + + // TODO. We want to parse the content of the latest event to ids and get the nodes from these ids + + /* var sorted = sort(notes) + var note = sorted.first() + + var eventContent = note.event?.content() + + val collection: Set = setOf() + val mapper = jacksonObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + var json = mapper.readValue(eventContent, Array::class.java) + for (element in json) { + // var test = mapper.readValue(element.toString(), Array::class.java) + // TODO. This is ugly. how to Kotlin? + var id = element.toString().trimStart('[').trimStart('e').trimStart(',').trimEnd(']').trimStart().trimEnd() + + var note = LocalCache.getNoteIfExists(id) + if (note != null) { + collection + note + } } + + return collection + */ + return notes } override fun sort(collection: Set): List { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index e16d97ba3..51250e69d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -227,11 +227,13 @@ fun AppNavigation( route.route, route.arguments, content = { - NIP90ContentDiscoveryScreen( - DVMID = it.arguments?.getString("id"), - accountViewModel = accountViewModel, - nav = nav, - ) + it.arguments?.getString("id")?.let { it1 -> + NIP90ContentDiscoveryScreen( + DVMID = it1, + accountViewModel = accountViewModel, + nav = nav, + ) + } }, ) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/types/NIP90ContentDiscoveryResponse.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/types/NIP90ContentDiscoveryResponse.kt index dad8a5460..11cd5087b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/types/NIP90ContentDiscoveryResponse.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/types/NIP90ContentDiscoveryResponse.kt @@ -22,8 +22,6 @@ package com.vitorpamplona.amethyst.ui.note.types import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.State @@ -32,7 +30,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextOverflow import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.ui.components.GenericLoadable import com.vitorpamplona.amethyst.ui.components.SensitivityWarning @@ -42,7 +39,6 @@ import com.vitorpamplona.amethyst.ui.note.ReplyNoteComposition import com.vitorpamplona.amethyst.ui.note.elements.DisplayUncitedHashtags import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer -import com.vitorpamplona.amethyst.ui.theme.placeholderText import com.vitorpamplona.quartz.events.BaseTextNoteEvent import com.vitorpamplona.quartz.events.CommunityDefinitionEvent import com.vitorpamplona.quartz.events.EmptyTagList @@ -66,20 +62,6 @@ fun RenderNIP90ContentDiscoveryResponse( val noteEvent = note.event val modifier = remember(note) { Modifier.fillMaxWidth() } - if (noteEvent != null) { - TranslatableRichTextViewer( - content = noteEvent.content(), - canPreview = canPreview && !makeItShort, - quotesLeft = quotesLeft, - modifier = modifier, - tags = noteEvent.tags().toImmutableListOfLists(), - backgroundColor = backgroundColor, - id = note.idHex, - accountViewModel = accountViewModel, - nav = nav, - ) - } - val showReply by remember(note) { derivedStateOf { @@ -140,42 +122,33 @@ fun RenderNIP90ContentDiscoveryResponse( val isAuthorTheLoggedUser = remember(note.event) { accountViewModel.isLoggedUser(note.author) } - if (makeItShort && isAuthorTheLoggedUser) { - Text( - text = eventContent, - color = MaterialTheme.colorScheme.placeholderText, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - ) - } else { - SensitivityWarning( - note = note, + SensitivityWarning( + note = note, + accountViewModel = accountViewModel, + ) { + val modifier = remember(note) { Modifier.fillMaxWidth() } + val tags = + remember(note) { note.event?.tags()?.toImmutableListOfLists() ?: EmptyTagList } + + TranslatableRichTextViewer( + content = eventContent, + canPreview = canPreview && !makeItShort, + quotesLeft = quotesLeft, + modifier = modifier, + tags = tags, + backgroundColor = backgroundColor, + id = note.idHex, accountViewModel = accountViewModel, - ) { - val modifier = remember(note) { Modifier.fillMaxWidth() } - val tags = - remember(note) { note.event?.tags()?.toImmutableListOfLists() ?: EmptyTagList } + nav = nav, + ) + } - TranslatableRichTextViewer( - content = eventContent, - canPreview = canPreview && !makeItShort, - quotesLeft = quotesLeft, - modifier = modifier, - tags = tags, - backgroundColor = backgroundColor, - id = note.idHex, - accountViewModel = accountViewModel, - nav = nav, - ) - } - - if (note.event?.hasHashtags() == true) { - val hashtags = - remember(note.event) { - note.event?.hashtags()?.toImmutableList() ?: persistentListOf() - } - DisplayUncitedHashtags(hashtags, eventContent, nav) - } + if (note.event?.hasHashtags() == true) { + val hashtags = + remember(note.event) { + note.event?.hashtags()?.toImmutableList() ?: persistentListOf() + } + DisplayUncitedHashtags(hashtags, eventContent, nav) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 0169f92c3..b1ab4d25b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -283,12 +283,12 @@ class NostrBookmarkPrivateFeedViewModel(val account: Account) : } @Stable -class NostrNIP90ContentDiscoveryFeedViewModel(val account: Account) : +class NostrNIP90ContentDiscoveryFeedViewModel(val account: Account, val dvmkey: String) : // FeedViewModel(BookmarkPrivateFeedFilter(account)) { - FeedViewModel(NIP90ContentDiscoveryFilter(account)) { - class Factory(val account: Account) : ViewModelProvider.Factory { + FeedViewModel(NIP90ContentDiscoveryFilter(account, dvmkey)) { + class Factory(val account: Account, val dvmkey: String) : ViewModelProvider.Factory { override fun create(modelClass: Class): NostrNIP90ContentDiscoveryFeedViewModel { - return NostrNIP90ContentDiscoveryFeedViewModel(account) as NostrNIP90ContentDiscoveryFeedViewModel + return NostrNIP90ContentDiscoveryFeedViewModel(account, dvmkey) as NostrNIP90ContentDiscoveryFeedViewModel } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NIP90ContentDiscoveryScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NIP90ContentDiscoveryScreen.kt index 3d45096aa..f061298a8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NIP90ContentDiscoveryScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NIP90ContentDiscoveryScreen.kt @@ -33,22 +33,25 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.lifecycle.viewmodel.compose.viewModel +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.service.relays.Client import com.vitorpamplona.amethyst.ui.screen.NostrNIP90ContentDiscoveryFeedViewModel import com.vitorpamplona.amethyst.ui.screen.RefresheableFeedView +import com.vitorpamplona.quartz.events.NIP90ContentDiscoveryRequestEvent @Composable fun NIP90ContentDiscoveryScreen( - DVMID: String?, + DVMID: String, accountViewModel: AccountViewModel, nav: (String) -> Unit, ) { val resultFeedViewModel: NostrNIP90ContentDiscoveryFeedViewModel = viewModel( key = "NostrNIP90ContentDiscoveryFeedViewModel", - factory = NostrNIP90ContentDiscoveryFeedViewModel.Factory(accountViewModel.account), + factory = NostrNIP90ContentDiscoveryFeedViewModel.Factory(accountViewModel.account, dvmkey = DVMID), ) - val userState by accountViewModel.account.decryptBookmarks.observeAsState() + val userState by accountViewModel.account.decryptBookmarks.observeAsState() // TODO LaunchedEffect(userState) { resultFeedViewModel.invalidateData() @@ -75,26 +78,33 @@ private fun RenderNostrNIP90ContentDiscoveryScreen( if (DVMID != null) { // TODO 1 Send KIND 5300 Event with p tag = DVMID (crashes, because cant map to event) + val thread = + Thread { + try { + NIP90ContentDiscoveryRequestEvent.create(DVMID, accountViewModel.account.signer) { + Client.send(it) + LocalCache.justConsume(it, null) + } + } catch (e: Exception) { + e.printStackTrace() + } + } - /*NIP90ContentDiscoveryRequestEvent.create(DVMID, accountViewModel.account.signer) { - Client.send(it) - LocalCache.justConsume(it, null) - }*/ + thread.start() + } + // var keyPair = accountViewModel.account.keyPair - // var keyPair = accountViewModel.account.keyPair + // TODO 2 PARSE AND LOAD RESULTS FROM KIND 6300 REPLY to resultfeedmodel (RN this doesnt show events) - // TODO 2 PARSE AND LOAD RESULTS FROM KIND 6300 REPLY to resultfeedmodel (RN this doesnt show events) + // TODO 3 Render Results (hopefully works when 2 is working) - // TODO 3 Render Results (hopefully works when 2 is working) - - HorizontalPager(state = pagerState) { - RefresheableFeedView( - resultFeedViewModel, - null, - accountViewModel = accountViewModel, - nav = nav, - ) - } + HorizontalPager(state = pagerState) { + RefresheableFeedView( + resultFeedViewModel, + null, + accountViewModel = accountViewModel, + nav = nav, + ) } } }