mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-10-03 22:52:36 +02:00
implement new NIP69 poll_option tags format List<List<String>>,
fix PollNoteEvent field getter return types
This commit is contained in:
@@ -3,10 +3,9 @@ package com.vitorpamplona.amethyst.service.model
|
|||||||
import com.vitorpamplona.amethyst.model.HexKey
|
import com.vitorpamplona.amethyst.model.HexKey
|
||||||
import com.vitorpamplona.amethyst.model.toHexKey
|
import com.vitorpamplona.amethyst.model.toHexKey
|
||||||
import nostr.postr.Utils
|
import nostr.postr.Utils
|
||||||
import org.json.JSONObject
|
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
||||||
const val POLL_OPTIONS = "poll_options"
|
const val POLL_OPTION = "poll_option"
|
||||||
const val VALUE_MAXIMUM = "value_maximum"
|
const val VALUE_MAXIMUM = "value_maximum"
|
||||||
const val VALUE_MINIMUM = "value_minimum"
|
const val VALUE_MINIMUM = "value_minimum"
|
||||||
const val CONSENSUS_THRESHOLD = "consensus_threshold"
|
const val CONSENSUS_THRESHOLD = "consensus_threshold"
|
||||||
@@ -31,19 +30,23 @@ class PollNoteEvent(
|
|||||||
|
|
||||||
fun replyTos() = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) }
|
fun replyTos() = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) }
|
||||||
|
|
||||||
fun pollOptions() = jsonToPollOptions(tags.filter { it.firstOrNull() == POLL_OPTIONS }[0][1])
|
fun pollOptions(): Map<Int, String> {
|
||||||
fun valueMaximum() = tags.filter { it.firstOrNull() == VALUE_MAXIMUM }.mapNotNull {
|
val map = mutableMapOf<Int, String>()
|
||||||
it.getOrNull(1)?.get(1)
|
tags.filter { it.first() == POLL_OPTION }
|
||||||
}
|
.forEach { map[it[1].toInt()] = it[2] }
|
||||||
fun valueMinimum() = tags.filter { it.firstOrNull() == VALUE_MINIMUM }.mapNotNull {
|
return map
|
||||||
it.getOrNull(1)?.get(1)
|
|
||||||
}
|
|
||||||
fun consensusThreshold() = tags.filter { it.firstOrNull() == CONSENSUS_THRESHOLD }.mapNotNull {
|
|
||||||
it.getOrNull(1)?.get(1)
|
|
||||||
}
|
|
||||||
fun closedAt() = tags.filter { it.firstOrNull() == CLOSED_AT }.mapNotNull {
|
|
||||||
it.getOrNull(1)?.get(1)
|
|
||||||
}
|
}
|
||||||
|
fun valueMaximum(): Int? = tags.filter { it.firstOrNull() == VALUE_MAXIMUM }
|
||||||
|
.getOrNull(1)?.getOrNull(1)?.toInt()
|
||||||
|
|
||||||
|
fun valueMinimum(): Int? = tags.filter { it.firstOrNull() == VALUE_MINIMUM }
|
||||||
|
.getOrNull(1)?.getOrNull(1)?.toInt()
|
||||||
|
|
||||||
|
fun consensusThreshold(): Int? = tags.filter { it.firstOrNull() == CONSENSUS_THRESHOLD }
|
||||||
|
.getOrNull(1)?.getOrNull(1)?.toInt()
|
||||||
|
|
||||||
|
fun closedAt(): Int? = tags.filter { it.firstOrNull() == CLOSED_AT }
|
||||||
|
.getOrNull(1)?.getOrNull(1)?.toInt()
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val kind = 6969
|
const val kind = 6969
|
||||||
@@ -72,7 +75,9 @@ class PollNoteEvent(
|
|||||||
addresses?.forEach {
|
addresses?.forEach {
|
||||||
tags.add(listOf("a", it.toTag()))
|
tags.add(listOf("a", it.toTag()))
|
||||||
}
|
}
|
||||||
tags.add(listOf(POLL_OPTIONS, gson.toJson(pollOptions)))
|
pollOptions.forEach { poll_op ->
|
||||||
|
tags.add(listOf(POLL_OPTION, poll_op.key.toString(), poll_op.value))
|
||||||
|
}
|
||||||
tags.add(listOf(VALUE_MAXIMUM, valueMaximum.toString()))
|
tags.add(listOf(VALUE_MAXIMUM, valueMaximum.toString()))
|
||||||
tags.add(listOf(VALUE_MINIMUM, valueMinimum.toString()))
|
tags.add(listOf(VALUE_MINIMUM, valueMinimum.toString()))
|
||||||
tags.add(listOf(CONSENSUS_THRESHOLD, consensusThreshold.toString()))
|
tags.add(listOf(CONSENSUS_THRESHOLD, consensusThreshold.toString()))
|
||||||
@@ -81,15 +86,6 @@ class PollNoteEvent(
|
|||||||
val sig = Utils.sign(id, privateKey)
|
val sig = Utils.sign(id, privateKey)
|
||||||
return PollNoteEvent(id.toHexKey(), pubKey, createdAt, tags, msg, sig.toHexKey())
|
return PollNoteEvent(id.toHexKey(), pubKey, createdAt, tags, msg, sig.toHexKey())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun jsonToPollOptions(jsonString: String): Map<Int, String> {
|
|
||||||
val jsonMap = mutableMapOf<Int, String>()
|
|
||||||
val jsonObject = JSONObject(jsonString)
|
|
||||||
jsonObject.keys().forEach {
|
|
||||||
jsonMap[it.toString().toInt()] = jsonObject.getString(it)
|
|
||||||
}
|
|
||||||
return jsonMap
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,12 +98,9 @@ class PollNoteEvent(
|
|||||||
"tags": [
|
"tags": [
|
||||||
["e", <32-bytes hex of the id of the poll event>, <primary poll host relay URL>],
|
["e", <32-bytes hex of the id of the poll event>, <primary poll host relay URL>],
|
||||||
["p", <32-bytes hex of the key>, <primary poll host relay URL>],
|
["p", <32-bytes hex of the key>, <primary poll host relay URL>],
|
||||||
["poll_options", "{
|
["poll_option", "0", "poll option 0 description string"],
|
||||||
\"0\": \"poll option 0 description string\",
|
["poll_option", "1", "poll option 1 description string"],
|
||||||
\"1\": \"poll option 1 description string\",
|
["poll_option", "n", "poll option <n> description string"],
|
||||||
\"n\": \"poll option <n> description string\"
|
|
||||||
}"
|
|
||||||
],
|
|
||||||
["value_maximum", "maximum satoshi value for inclusion in tally"],
|
["value_maximum", "maximum satoshi value for inclusion in tally"],
|
||||||
["value_minimum", "minimum satoshi value for inclusion in tally"],
|
["value_minimum", "minimum satoshi value for inclusion in tally"],
|
||||||
["consensus_threshold", "required percentage to attain consensus <0..100>"],
|
["consensus_threshold", "required percentage to attain consensus <0..100>"],
|
||||||
|
@@ -3,6 +3,7 @@ package com.vitorpamplona.amethyst.ui.actions
|
|||||||
import androidx.compose.runtime.mutableStateListOf
|
import androidx.compose.runtime.mutableStateListOf
|
||||||
import androidx.compose.runtime.mutableStateMapOf
|
import androidx.compose.runtime.mutableStateMapOf
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.snapshots.SnapshotStateMap
|
||||||
import androidx.compose.ui.text.input.TextFieldValue
|
import androidx.compose.ui.text.input.TextFieldValue
|
||||||
import com.vitorpamplona.amethyst.model.*
|
import com.vitorpamplona.amethyst.model.*
|
||||||
import com.vitorpamplona.amethyst.service.nip19.Nip19
|
import com.vitorpamplona.amethyst.service.nip19.Nip19
|
||||||
@@ -10,7 +11,7 @@ import com.vitorpamplona.amethyst.service.nip19.Nip19
|
|||||||
class NewPollViewModel : NewPostViewModel() {
|
class NewPollViewModel : NewPostViewModel() {
|
||||||
|
|
||||||
var zapRecipients = mutableStateListOf<HexKey>()
|
var zapRecipients = mutableStateListOf<HexKey>()
|
||||||
var pollOptions = mutableStateMapOf<Int, String>(Pair(0, ""), Pair(1, ""))
|
var pollOptions = newStateMapPollOptions()
|
||||||
var valueMaximum: Int? = null
|
var valueMaximum: Int? = null
|
||||||
var valueMinimum: Int? = null
|
var valueMinimum: Int? = null
|
||||||
var consensusThreshold: Int? = null
|
var consensusThreshold: Int? = null
|
||||||
@@ -127,10 +128,14 @@ class NewPollViewModel : NewPostViewModel() {
|
|||||||
mentions = null
|
mentions = null
|
||||||
|
|
||||||
zapRecipients = mutableStateListOf<HexKey>()
|
zapRecipients = mutableStateListOf<HexKey>()
|
||||||
pollOptions = mutableStateMapOf<Int, String>(Pair(0, ""), Pair(1, ""))
|
pollOptions = newStateMapPollOptions()
|
||||||
valueMaximum = null
|
valueMaximum = null
|
||||||
valueMinimum = null
|
valueMinimum = null
|
||||||
consensusThreshold = null
|
consensusThreshold = null
|
||||||
closedAt = null
|
closedAt = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun newStateMapPollOptions(): SnapshotStateMap<Int, String> {
|
||||||
|
return mutableStateMapOf(Pair(0, ""), Pair(1, ""))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,9 +26,9 @@ fun PollNote(
|
|||||||
.border(BorderStroke(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.32f)))
|
.border(BorderStroke(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.32f)))
|
||||||
.padding(4.dp)
|
.padding(4.dp)
|
||||||
|
|
||||||
pollEvent.pollOptions().values.forEachIndexed { index, string ->
|
pollEvent.pollOptions().forEach { poll_op ->
|
||||||
TranslateableRichTextViewer(
|
TranslateableRichTextViewer(
|
||||||
string,
|
poll_op.value,
|
||||||
canPreview,
|
canPreview,
|
||||||
modifier,
|
modifier,
|
||||||
pollEvent.tags(),
|
pollEvent.tags(),
|
||||||
|
Reference in New Issue
Block a user