mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-10-11 02:44:15 +02:00
Adds error messages to relay information dialog
This commit is contained in:
@@ -79,7 +79,7 @@ class AntiSpamFilter {
|
|||||||
logOffender(hash, event)
|
logOffender(hash, event)
|
||||||
|
|
||||||
if (relay != null) {
|
if (relay != null) {
|
||||||
RelayStats.newSpam(relay.url, "Potential SPAM Message ${event.id} nostr:${Nip19Bech32.createNEvent(event.id, event.pubKey, event.kind, relay.url)}")
|
RelayStats.newSpam(relay.url, "https://njump.me/${Nip19Bech32.createNEvent(event.id, event.pubKey, event.kind, relay.url)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
liveSpam.invalidateData()
|
liveSpam.invalidateData()
|
||||||
|
@@ -31,15 +31,18 @@ import androidx.compose.foundation.layout.Spacer
|
|||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.verticalScroll
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -48,18 +51,24 @@ import androidx.compose.ui.window.Dialog
|
|||||||
import androidx.compose.ui.window.DialogProperties
|
import androidx.compose.ui.window.DialogProperties
|
||||||
import com.vitorpamplona.amethyst.R
|
import com.vitorpamplona.amethyst.R
|
||||||
import com.vitorpamplona.amethyst.model.RelayBriefInfoCache
|
import com.vitorpamplona.amethyst.model.RelayBriefInfoCache
|
||||||
|
import com.vitorpamplona.amethyst.service.relays.RelayStats
|
||||||
import com.vitorpamplona.amethyst.ui.actions.CloseButton
|
import com.vitorpamplona.amethyst.ui.actions.CloseButton
|
||||||
import com.vitorpamplona.amethyst.ui.components.ClickableEmail
|
import com.vitorpamplona.amethyst.ui.components.ClickableEmail
|
||||||
import com.vitorpamplona.amethyst.ui.components.ClickableUrl
|
import com.vitorpamplona.amethyst.ui.components.ClickableUrl
|
||||||
|
import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer
|
||||||
import com.vitorpamplona.amethyst.ui.note.LoadUser
|
import com.vitorpamplona.amethyst.ui.note.LoadUser
|
||||||
import com.vitorpamplona.amethyst.ui.note.RenderRelayIcon
|
import com.vitorpamplona.amethyst.ui.note.RenderRelayIcon
|
||||||
import com.vitorpamplona.amethyst.ui.note.UserCompose
|
import com.vitorpamplona.amethyst.ui.note.UserCompose
|
||||||
|
import com.vitorpamplona.amethyst.ui.note.timeAgo
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||||
import com.vitorpamplona.amethyst.ui.theme.DoubleHorzSpacer
|
import com.vitorpamplona.amethyst.ui.theme.DoubleHorzSpacer
|
||||||
import com.vitorpamplona.amethyst.ui.theme.DoubleVertSpacer
|
import com.vitorpamplona.amethyst.ui.theme.DoubleVertSpacer
|
||||||
import com.vitorpamplona.amethyst.ui.theme.StdPadding
|
import com.vitorpamplona.amethyst.ui.theme.StdPadding
|
||||||
|
import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer
|
||||||
import com.vitorpamplona.amethyst.ui.theme.largeRelayIconModifier
|
import com.vitorpamplona.amethyst.ui.theme.largeRelayIconModifier
|
||||||
import com.vitorpamplona.quartz.encoders.Nip11RelayInformation
|
import com.vitorpamplona.quartz.encoders.Nip11RelayInformation
|
||||||
|
import com.vitorpamplona.quartz.events.EmptyTagList
|
||||||
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
||||||
@OptIn(ExperimentalLayoutApi::class)
|
@OptIn(ExperimentalLayoutApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
@@ -70,6 +79,11 @@ fun RelayInformationDialog(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
nav: (String) -> Unit,
|
nav: (String) -> Unit,
|
||||||
) {
|
) {
|
||||||
|
val messages =
|
||||||
|
remember(relayBriefInfo) {
|
||||||
|
RelayStats.get(url = relayBriefInfo.url).messages.snapshot().values.sortedByDescending { it.time }.toImmutableList()
|
||||||
|
}
|
||||||
|
|
||||||
val automaticallyShowProfilePicture =
|
val automaticallyShowProfilePicture =
|
||||||
remember {
|
remember {
|
||||||
accountViewModel.settings.showProfilePictures.value
|
accountViewModel.settings.showProfilePictures.value
|
||||||
@@ -84,11 +98,16 @@ fun RelayInformationDialog(
|
|||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
Surface {
|
Surface {
|
||||||
val scrollState = rememberScrollState()
|
val color = mutableStateOf(Color.Transparent)
|
||||||
|
val context = LocalContext.current
|
||||||
|
|
||||||
Column(
|
LazyColumn(
|
||||||
modifier = Modifier.padding(10.dp).fillMaxSize().verticalScroll(scrollState),
|
modifier =
|
||||||
|
Modifier
|
||||||
|
.padding(10.dp)
|
||||||
|
.fillMaxSize(),
|
||||||
) {
|
) {
|
||||||
|
item {
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
@@ -96,7 +115,8 @@ fun RelayInformationDialog(
|
|||||||
) {
|
) {
|
||||||
CloseButton(onPress = { onClose() })
|
CloseButton(onPress = { onClose() })
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
Row(
|
Row(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
horizontalArrangement = Arrangement.Center,
|
horizontalArrangement = Arrangement.Center,
|
||||||
@@ -119,7 +139,8 @@ fun RelayInformationDialog(
|
|||||||
Row { SubtitleContent(relayInfo.description?.trim() ?: "") }
|
Row { SubtitleContent(relayInfo.description?.trim() ?: "") }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
Section(stringResource(R.string.owner))
|
Section(stringResource(R.string.owner))
|
||||||
|
|
||||||
relayInfo.pubkey?.let {
|
relayInfo.pubkey?.let {
|
||||||
@@ -128,7 +149,8 @@ fun RelayInformationDialog(
|
|||||||
nav(it)
|
nav(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
Section(stringResource(R.string.software))
|
Section(stringResource(R.string.software))
|
||||||
|
|
||||||
DisplaySoftwareInformation(relayInfo)
|
DisplaySoftwareInformation(relayInfo)
|
||||||
@@ -136,7 +158,8 @@ fun RelayInformationDialog(
|
|||||||
Section(stringResource(R.string.version))
|
Section(stringResource(R.string.version))
|
||||||
|
|
||||||
SectionContent(relayInfo.version ?: "")
|
SectionContent(relayInfo.version ?: "")
|
||||||
|
}
|
||||||
|
item {
|
||||||
Section(stringResource(R.string.contact))
|
Section(stringResource(R.string.contact))
|
||||||
|
|
||||||
Box(modifier = Modifier.padding(start = 10.dp)) {
|
Box(modifier = Modifier.padding(start = 10.dp)) {
|
||||||
@@ -150,11 +173,13 @@ fun RelayInformationDialog(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
Section(stringResource(R.string.supports))
|
Section(stringResource(R.string.supports))
|
||||||
|
|
||||||
DisplaySupportedNips(relayInfo)
|
DisplaySupportedNips(relayInfo)
|
||||||
|
}
|
||||||
|
item {
|
||||||
relayInfo.fees?.admission?.let {
|
relayInfo.fees?.admission?.let {
|
||||||
if (it.isNotEmpty()) {
|
if (it.isNotEmpty()) {
|
||||||
Section(stringResource(R.string.admission_fees))
|
Section(stringResource(R.string.admission_fees))
|
||||||
@@ -173,7 +198,8 @@ fun RelayInformationDialog(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
relayInfo.limitation?.let {
|
relayInfo.limitation?.let {
|
||||||
Section(stringResource(R.string.limitations))
|
Section(stringResource(R.string.limitations))
|
||||||
val authRequiredText =
|
val authRequiredText =
|
||||||
@@ -212,25 +238,29 @@ fun RelayInformationDialog(
|
|||||||
SectionContent("${stringResource(R.string.restricted_writes)}: $restrictedWritesText")
|
SectionContent("${stringResource(R.string.restricted_writes)}: $restrictedWritesText")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
relayInfo.relay_countries?.let {
|
relayInfo.relay_countries?.let {
|
||||||
Section(stringResource(R.string.countries))
|
Section(stringResource(R.string.countries))
|
||||||
|
|
||||||
FlowRow { it.forEach { item -> SectionContent(item) } }
|
FlowRow { it.forEach { item -> SectionContent(item) } }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
relayInfo.language_tags?.let {
|
relayInfo.language_tags?.let {
|
||||||
Section(stringResource(R.string.languages))
|
Section(stringResource(R.string.languages))
|
||||||
|
|
||||||
FlowRow { it.forEach { item -> SectionContent(item) } }
|
FlowRow { it.forEach { item -> SectionContent(item) } }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
relayInfo.tags?.let {
|
relayInfo.tags?.let {
|
||||||
Section(stringResource(R.string.tags))
|
Section(stringResource(R.string.tags))
|
||||||
|
|
||||||
FlowRow { it.forEach { item -> SectionContent(item) } }
|
FlowRow { it.forEach { item -> SectionContent(item) } }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
item {
|
||||||
relayInfo.posting_policy?.let {
|
relayInfo.posting_policy?.let {
|
||||||
Section(stringResource(R.string.posting_policy))
|
Section(stringResource(R.string.posting_policy))
|
||||||
|
|
||||||
@@ -242,6 +272,32 @@ fun RelayInformationDialog(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
item {
|
||||||
|
Section(stringResource(R.string.relay_error_messages))
|
||||||
|
}
|
||||||
|
|
||||||
|
items(messages) { msg ->
|
||||||
|
Row {
|
||||||
|
TranslatableRichTextViewer(
|
||||||
|
content =
|
||||||
|
remember {
|
||||||
|
"${timeAgo(msg.time, context)}, ${msg.type.name}: ${msg.message}"
|
||||||
|
},
|
||||||
|
canPreview = false,
|
||||||
|
quotesLeft = 0,
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
tags = EmptyTagList,
|
||||||
|
backgroundColor = color,
|
||||||
|
id = msg.hashCode().toString(),
|
||||||
|
accountViewModel = accountViewModel,
|
||||||
|
nav = nav,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(modifier = StdVertSpacer)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -463,6 +463,7 @@
|
|||||||
<string name="languages">Languages</string>
|
<string name="languages">Languages</string>
|
||||||
<string name="tags">Tags</string>
|
<string name="tags">Tags</string>
|
||||||
<string name="posting_policy">Posting policy</string>
|
<string name="posting_policy">Posting policy</string>
|
||||||
|
<string name="relay_error_messages">Errors and Notices from this Relay</string>
|
||||||
<string name="message_length">Message length</string>
|
<string name="message_length">Message length</string>
|
||||||
<string name="subscriptions">Subscriptions</string>
|
<string name="subscriptions">Subscriptions</string>
|
||||||
<string name="filters">Filters</string>
|
<string name="filters">Filters</string>
|
||||||
|
Reference in New Issue
Block a user