send request, get results (still needs parsing)

This commit is contained in:
Believethehype
2024-05-14 21:41:36 +02:00
parent 0245c907ff
commit 8a50b3938d
5 changed files with 116 additions and 88 deletions

View File

@@ -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<Note>() {
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<Note> = 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<Note>): Set<Note> {
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<Note>): Set<Note> {
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<Note> = 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<Note>): List<Note> {

View File

@@ -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,
)
}
},
)
}

View File

@@ -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)
}
}
}

View File

@@ -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 <NostrNIP90ContentDiscoveryFeedViewModel : ViewModel> create(modelClass: Class<NostrNIP90ContentDiscoveryFeedViewModel>): NostrNIP90ContentDiscoveryFeedViewModel {
return NostrNIP90ContentDiscoveryFeedViewModel(account) as NostrNIP90ContentDiscoveryFeedViewModel
return NostrNIP90ContentDiscoveryFeedViewModel(account, dvmkey) as NostrNIP90ContentDiscoveryFeedViewModel
}
}
}

View File

@@ -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,
)
}
}
}