Avoids parsing metadata events several times due to the json parser stopping coroutines.

This commit is contained in:
Vitor Pamplona
2024-03-12 17:16:50 -04:00
parent 82c4bf89df
commit efb9d9268b
10 changed files with 20 additions and 28 deletions
@@ -572,7 +572,7 @@ class Account(
if (!isWriteable()) return if (!isWriteable()) return
MetadataEvent.updateFromPast( MetadataEvent.updateFromPast(
latest = userProfile().info?.latestMetadata, latest = userProfile().latestMetadata,
name = name, name = name,
picture = picture, picture = picture,
banner = banner, banner = banner,
@@ -304,15 +304,22 @@ object LocalCache {
return note return note
} }
fun consume(event: MetadataEvent) { fun consume(
event: MetadataEvent,
relay: Relay?,
) {
// new event // new event
val oldUser = getOrCreateUser(event.pubKey) val oldUser = getOrCreateUser(event.pubKey)
if (oldUser.info == null || event.createdAt > oldUser.info!!.updatedMetadataAt) { val currentMetadata = oldUser.latestMetadata
if (currentMetadata == null || event.createdAt > currentMetadata.createdAt) {
oldUser.latestMetadata = event
val newUserMetadata = event.contactMetaData() val newUserMetadata = event.contactMetaData()
if (newUserMetadata != null) { if (newUserMetadata != null) {
oldUser.updateUserInfo(newUserMetadata, event) oldUser.updateUserInfo(newUserMetadata, event)
} }
// Log.d("MT", "New User Metadata ${oldUser.pubkeyDisplayHex} ${oldUser.toBestDisplayName()}") // Log.d("MT", "New User Metadata ${oldUser.pubkeyDisplayHex()} ${oldUser.toBestDisplayName()} from ${relay?.url}")
} else { } else {
// Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()} // Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()}
// ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}") // ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}")
@@ -2099,7 +2106,7 @@ object LocalCache {
is LnZapPaymentRequestEvent -> consume(event) is LnZapPaymentRequestEvent -> consume(event)
is LnZapPaymentResponseEvent -> consume(event) is LnZapPaymentResponseEvent -> consume(event)
is LongTextNoteEvent -> consume(event, relay) is LongTextNoteEvent -> consume(event, relay)
is MetadataEvent -> consume(event) is MetadataEvent -> consume(event, relay)
is MuteListEvent -> consume(event, relay) is MuteListEvent -> consume(event, relay)
is NNSEvent -> comsume(event, relay) is NNSEvent -> comsume(event, relay)
is OtsEvent -> consume(event, relay) is OtsEvent -> consume(event, relay)
@@ -52,6 +52,7 @@ import java.math.BigDecimal
class User(val pubkeyHex: String) { class User(val pubkeyHex: String) {
var info: UserMetadata? = null var info: UserMetadata? = null
var latestMetadata: MetadataEvent? = null
var latestContactList: ContactListEvent? = null var latestContactList: ContactListEvent? = null
var latestBookmarkList: BookmarkListEvent? = null var latestBookmarkList: BookmarkListEvent? = null
@@ -307,8 +308,6 @@ class User(val pubkeyHex: String) {
latestMetadata: MetadataEvent, latestMetadata: MetadataEvent,
) { ) {
info = newUserInfo info = newUserInfo
info?.latestMetadata = latestMetadata
info?.updatedMetadataAt = latestMetadata.createdAt
info?.tags = latestMetadata.tags.toImmutableListOfLists() info?.tags = latestMetadata.tags.toImmutableListOfLists()
info?.cleanBlankNames() info?.cleanBlankNames()
@@ -993,7 +993,7 @@ fun debugState(context: Context) {
"Users: " + "Users: " +
LocalCache.userListCache.filter { it.liveSet != null }.size + LocalCache.userListCache.filter { it.liveSet != null }.size +
" / " + " / " +
LocalCache.userListCache.filter { it.info?.latestMetadata != null }.size + LocalCache.userListCache.filter { it.latestMetadata != null }.size +
" / " + " / " +
LocalCache.userListCache.size, LocalCache.userListCache.size,
) )
@@ -45,7 +45,6 @@ import com.vitorpamplona.amethyst.ui.theme.Font14SP
import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer
import com.vitorpamplona.amethyst.ui.theme.nip05 import com.vitorpamplona.amethyst.ui.theme.nip05
import com.vitorpamplona.quartz.events.BaseTextNoteEvent import com.vitorpamplona.quartz.events.BaseTextNoteEvent
import com.vitorpamplona.quartz.events.toImmutableListOfLists
@Composable @Composable
fun ShowForkInformation( fun ShowForkInformation(
@@ -107,7 +106,7 @@ fun ForkInformationRowLightColor(
val userState by author.live().metadata.observeAsState() val userState by author.live().metadata.observeAsState()
val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() } val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() }
val userTags = val userTags =
remember(userState) { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() } remember(userState) { userState?.user?.info?.tags }
if (userDisplayName != null) { if (userDisplayName != null) {
CreateClickableTextWithEmoji( CreateClickableTextWithEmoji(
@@ -59,7 +59,6 @@ import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage
import com.vitorpamplona.amethyst.ui.theme.Size35dp import com.vitorpamplona.amethyst.ui.theme.Size35dp
import com.vitorpamplona.quartz.events.UserMetadata import com.vitorpamplona.quartz.events.UserMetadata
import com.vitorpamplona.quartz.events.toImmutableListOfLists
@Preview @Preview
@Composable @Composable
@@ -135,7 +134,7 @@ fun ShowQRDialog(
) { ) {
CreateTextWithEmoji( CreateTextWithEmoji(
text = user.bestDisplayName() ?: user.bestUsername() ?: "", text = user.bestDisplayName() ?: user.bestUsername() ?: "",
tags = user.info?.latestMetadata?.tags?.toImmutableListOfLists(), tags = user.info?.tags,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
fontSize = 18.sp, fontSize = 18.sp,
) )
@@ -104,8 +104,7 @@ class SharedPreferencesViewModel : ViewModel() {
fun init() { fun init() {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
val savedSettings = val savedSettings =
LocalPreferences.loadSharedSettings() LocalPreferences.loadSharedSettings() ?: Settings()
?: LocalPreferences.migrateOldSharedSettings() ?: Settings()
sharedPrefs.theme = savedSettings.theme sharedPrefs.theme = savedSettings.theme
sharedPrefs.language = savedSettings.preferredLanguage sharedPrefs.language = savedSettings.preferredLanguage
@@ -176,7 +176,6 @@ import com.vitorpamplona.quartz.events.PayInvoiceSuccessResponse
import com.vitorpamplona.quartz.events.ReportEvent import com.vitorpamplona.quartz.events.ReportEvent
import com.vitorpamplona.quartz.events.TelegramIdentity import com.vitorpamplona.quartz.events.TelegramIdentity
import com.vitorpamplona.quartz.events.TwitterIdentity import com.vitorpamplona.quartz.events.TwitterIdentity
import com.vitorpamplona.quartz.events.toImmutableListOfLists
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -961,8 +960,7 @@ private fun DrawAdditionalInfo(
) { ) {
val userState by baseUser.live().metadata.observeAsState() val userState by baseUser.live().metadata.observeAsState()
val user = remember(userState) { userState?.user } ?: return val user = remember(userState) { userState?.user } ?: return
val tags = val tags = userState?.user?.info?.tags
remember(userState) { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() }
val uri = LocalUriHandler.current val uri = LocalUriHandler.current
val clipboardManager = LocalClipboardManager.current val clipboardManager = LocalClipboardManager.current
@@ -1071,7 +1069,7 @@ private fun DrawAdditionalInfo(
val pubkeyHex = remember { baseUser.pubkeyHex } val pubkeyHex = remember { baseUser.pubkeyHex }
DisplayLNAddress(lud16, pubkeyHex, accountViewModel, nav) DisplayLNAddress(lud16, pubkeyHex, accountViewModel, nav)
val identities = user.info?.latestMetadata?.identityClaims() val identities = user.latestMetadata?.identityClaims()
if (!identities.isNullOrEmpty()) { if (!identities.isNullOrEmpty()) {
identities.forEach { identity: IdentityClaim -> identities.forEach { identity: IdentityClaim ->
Row(verticalAlignment = Alignment.CenterVertically) { Row(verticalAlignment = Alignment.CenterVertically) {
@@ -414,12 +414,6 @@ class UserMetadata {
var twitter: String? = null var twitter: String? = null
@Transient
var updatedMetadataAt: Long = 0
@Transient
var latestMetadata: MetadataEvent? = null
@Transient @Transient
var tags: ImmutableListOfLists<String>? = null var tags: ImmutableListOfLists<String>? = null
@@ -154,10 +154,7 @@ class MetadataEvent(
) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) {
fun contactMetaData() = fun contactMetaData() =
try { try {
mapper.readValue( mapper.readValue(content, UserMetadata::class.java)
ByteArrayInputStream(content.toByteArray(Charsets.UTF_8)),
UserMetadata::class.java,
)
} catch (e: Exception) { } catch (e: Exception) {
// e.printStackTrace() // e.printStackTrace()
Log.w("MT", "Content Parse Error: ${e.localizedMessage} $content") Log.w("MT", "Content Parse Error: ${e.localizedMessage} $content")