Filters zap payments outside the established min-max parameters on polls.
This commit is contained in:
@@ -33,9 +33,12 @@ class PollNoteViewModel : ViewModel() {
|
|||||||
|
|
||||||
private var pollEvent: PollNoteEvent? = null
|
private var pollEvent: PollNoteEvent? = null
|
||||||
private var pollOptions: Map<Int, String>? = null
|
private var pollOptions: Map<Int, String>? = null
|
||||||
private var valueMaximum: Int? = null
|
private var valueMaximum: Long? = null
|
||||||
private var valueMinimum: Int? = null
|
private var valueMinimum: Long? = null
|
||||||
private var closedAt: Int? = null
|
private var valueMaximumBD: BigDecimal? = null
|
||||||
|
private var valueMinimumBD: BigDecimal? = null
|
||||||
|
|
||||||
|
private var closedAt: Long? = null
|
||||||
private var consensusThreshold: BigDecimal? = null
|
private var consensusThreshold: BigDecimal? = null
|
||||||
|
|
||||||
private var totalZapped: BigDecimal = BigDecimal.ZERO
|
private var totalZapped: BigDecimal = BigDecimal.ZERO
|
||||||
@@ -49,10 +52,12 @@ class PollNoteViewModel : ViewModel() {
|
|||||||
pollNote = note
|
pollNote = note
|
||||||
pollEvent = pollNote?.event as PollNoteEvent
|
pollEvent = pollNote?.event as PollNoteEvent
|
||||||
pollOptions = pollEvent?.pollOptions()
|
pollOptions = pollEvent?.pollOptions()
|
||||||
valueMaximum = pollEvent?.getTagInt(VALUE_MAXIMUM)
|
valueMaximum = pollEvent?.getTagLong(VALUE_MAXIMUM)
|
||||||
valueMinimum = pollEvent?.getTagInt(VALUE_MINIMUM)
|
valueMinimum = pollEvent?.getTagLong(VALUE_MINIMUM)
|
||||||
consensusThreshold = pollEvent?.getTagInt(CONSENSUS_THRESHOLD)?.toFloat()?.div(100)?.toBigDecimal()
|
valueMinimumBD = valueMinimum?.let { BigDecimal(it) }
|
||||||
closedAt = pollEvent?.getTagInt(CLOSED_AT)
|
valueMaximumBD = valueMaximum?.let { BigDecimal(it) }
|
||||||
|
consensusThreshold = pollEvent?.getTagLong(CONSENSUS_THRESHOLD)?.toFloat()?.div(100)?.toBigDecimal()
|
||||||
|
closedAt = pollEvent?.getTagLong(CLOSED_AT)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun refreshTallies() {
|
fun refreshTallies() {
|
||||||
@@ -110,6 +115,29 @@ class PollNoteViewModel : ViewModel() {
|
|||||||
} catch (e: Exception) { null }
|
} catch (e: Exception) { null }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isValidInputVoteAmount(amount: BigDecimal?): Boolean {
|
||||||
|
if (amount == null) {
|
||||||
|
return false
|
||||||
|
} else if (valueMinimum == null && valueMaximum == null) {
|
||||||
|
if (amount > BigDecimal.ZERO) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else if (valueMinimum == null) {
|
||||||
|
if (amount > BigDecimal.ZERO && amount <= valueMaximumBD!!) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else if (valueMaximum == null) {
|
||||||
|
if (amount >= valueMinimumBD!!) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((valueMinimumBD!! <= amount) && (amount <= valueMaximumBD!!)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
fun isValidInputVoteAmount(amount: Long?): Boolean {
|
fun isValidInputVoteAmount(amount: Long?): Boolean {
|
||||||
if (amount == null) {
|
if (amount == null) {
|
||||||
return false
|
return false
|
||||||
@@ -145,24 +173,29 @@ class PollNoteViewModel : ViewModel() {
|
|||||||
private fun zappedPollOptionAmount(option: Int): BigDecimal {
|
private fun zappedPollOptionAmount(option: Int): BigDecimal {
|
||||||
return pollNote?.zaps?.values?.sumOf {
|
return pollNote?.zaps?.values?.sumOf {
|
||||||
val event = it?.event as? LnZapEvent
|
val event = it?.event as? LnZapEvent
|
||||||
if (event?.zappedPollOption() == option) {
|
val zapAmount = event?.amount ?: BigDecimal.ZERO
|
||||||
event.amount ?: BigDecimal(0)
|
val isValidAmount = isValidInputVoteAmount(event?.amount)
|
||||||
|
|
||||||
|
if (isValidAmount && event?.zappedPollOption() == option) {
|
||||||
|
zapAmount
|
||||||
} else {
|
} else {
|
||||||
BigDecimal(0)
|
BigDecimal.ZERO
|
||||||
}
|
}
|
||||||
} ?: BigDecimal(0)
|
} ?: BigDecimal.ZERO
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun totalZapped(): BigDecimal {
|
private fun totalZapped(): BigDecimal {
|
||||||
return pollNote?.zaps?.values?.sumOf {
|
return pollNote?.zaps?.values?.sumOf {
|
||||||
val zapEvent = (it?.event as? LnZapEvent)
|
val zapEvent = (it?.event as? LnZapEvent)
|
||||||
|
val zapAmount = zapEvent?.amount ?: BigDecimal.ZERO
|
||||||
|
val isValidAmount = isValidInputVoteAmount(zapEvent?.amount)
|
||||||
|
|
||||||
if (zapEvent?.zappedPollOption() != null) {
|
if (isValidAmount && zapEvent?.zappedPollOption() != null) {
|
||||||
zapEvent.amount ?: BigDecimal(0)
|
zapAmount
|
||||||
} else {
|
} else {
|
||||||
BigDecimal(0)
|
BigDecimal.ZERO
|
||||||
}
|
}
|
||||||
} ?: BigDecimal(0)
|
} ?: BigDecimal.ZERO
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createZapOptionsThatMatchThePollingParameters(): List<Long> {
|
fun createZapOptionsThatMatchThePollingParameters(): List<Long> {
|
||||||
@@ -176,8 +209,8 @@ class PollNoteViewModel : ViewModel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
valueMinimum?.let { options.add(it.toLong()) }
|
valueMinimum?.let { options.add(it) }
|
||||||
valueMaximum?.let { options.add(it.toLong()) }
|
valueMaximum?.let { options.add(it) }
|
||||||
|
|
||||||
return options.toSet().sorted()
|
return options.toSet().sorted()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,13 +27,16 @@ class PollNoteEvent(
|
|||||||
tags.filter { it.size > 2 && it[0] == POLL_OPTION }
|
tags.filter { it.size > 2 && it[0] == POLL_OPTION }
|
||||||
.associate { it[1].toInt() to it[2] }
|
.associate { it[1].toInt() to it[2] }
|
||||||
|
|
||||||
fun getTagInt(property: String): Int? {
|
fun minimumAmount() = tags.firstOrNull() { it.size > 1 && it[0] == VALUE_MINIMUM }?.getOrNull(1)?.toLongOrNull()
|
||||||
|
fun maximumAmount() = tags.firstOrNull() { it.size > 1 && it[0] == VALUE_MAXIMUM }?.getOrNull(1)?.toLongOrNull()
|
||||||
|
|
||||||
|
fun getTagLong(property: String): Long? {
|
||||||
val number = tags.firstOrNull() { it.size > 1 && it[0] == property }?.get(1)
|
val number = tags.firstOrNull() { it.size > 1 && it[0] == property }?.get(1)
|
||||||
|
|
||||||
return if (number.isNullOrBlank() || number == "null") {
|
return if (number.isNullOrBlank() || number == "null") {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
number.toInt()
|
number.toLong()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,11 +74,18 @@ class PollNoteEvent(
|
|||||||
pollOptions.forEach { poll_op ->
|
pollOptions.forEach { poll_op ->
|
||||||
tags.add(listOf(POLL_OPTION, poll_op.key.toString(), poll_op.value))
|
tags.add(listOf(POLL_OPTION, poll_op.key.toString(), poll_op.value))
|
||||||
}
|
}
|
||||||
tags.add(listOf(VALUE_MAXIMUM, valueMaximum.toString()))
|
valueMaximum?.let {
|
||||||
tags.add(listOf(VALUE_MINIMUM, valueMinimum.toString()))
|
tags.add(listOf(VALUE_MAXIMUM, valueMaximum.toString()))
|
||||||
tags.add(listOf(CONSENSUS_THRESHOLD, consensusThreshold.toString()))
|
}
|
||||||
tags.add(listOf(CLOSED_AT, closedAt.toString()))
|
valueMinimum?.let {
|
||||||
|
tags.add(listOf(VALUE_MINIMUM, valueMinimum.toString()))
|
||||||
|
}
|
||||||
|
consensusThreshold?.let {
|
||||||
|
tags.add(listOf(CONSENSUS_THRESHOLD, consensusThreshold.toString()))
|
||||||
|
}
|
||||||
|
closedAt?.let {
|
||||||
|
tags.add(listOf(CLOSED_AT, closedAt.toString()))
|
||||||
|
}
|
||||||
zapReceiver?.forEach {
|
zapReceiver?.forEach {
|
||||||
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
|
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user