mirror of
https://github.com/greenart7c3/Amber.git
synced 2026-10-06 03:18:23 +00:00
- Add retry logic when sending events
- Check if error message contains tor port to show a better message
This commit is contained in:
@@ -19,24 +19,31 @@ import kotlinx.coroutines.launch
|
||||
object AmberListenerSingleton {
|
||||
var accountStateViewModel: AccountStateViewModel? = null
|
||||
private var listener: AmberClientListener? = null
|
||||
val latestErrorMessages = mutableListOf<String>()
|
||||
|
||||
fun setListener(
|
||||
context: Context,
|
||||
accountStateViewModel: AccountStateViewModel?,
|
||||
) {
|
||||
listener = AmberClientListener(context, accountStateViewModel)
|
||||
listener = AmberClientListener(context)
|
||||
}
|
||||
|
||||
fun getListener(): AmberClientListener? {
|
||||
return listener
|
||||
}
|
||||
|
||||
fun showErrorMessage() {
|
||||
if (latestErrorMessages.isEmpty()) return
|
||||
if (latestErrorMessages.last().isBlank()) return
|
||||
accountStateViewModel?.toast("Error", latestErrorMessages.last())
|
||||
latestErrorMessages.clear()
|
||||
}
|
||||
}
|
||||
|
||||
class AmberClientListener(
|
||||
val context: Context,
|
||||
val accountStateViewModel: AccountStateViewModel?,
|
||||
) : NostrClient.Listener {
|
||||
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
|
||||
|
||||
override fun onAuth(relay: Relay, challenge: String) {
|
||||
scope.launch {
|
||||
LocalPreferences.currentAccount(context)?.let { account ->
|
||||
@@ -85,9 +92,9 @@ class AmberClientListener(
|
||||
}
|
||||
if (!success) {
|
||||
if (msg.isNotBlank()) {
|
||||
accountStateViewModel?.toast("Error", "Failed to send event.\n$msg")
|
||||
AmberListenerSingleton.latestErrorMessages.add("Failed to send event.\n$msg")
|
||||
} else {
|
||||
accountStateViewModel?.toast("Error", "Failed to send event. Try again.")
|
||||
AmberListenerSingleton.latestErrorMessages.add("Failed to send event. Try again.")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -108,7 +115,7 @@ class AmberClientListener(
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
accountStateViewModel?.toast("Error", message)
|
||||
AmberListenerSingleton.latestErrorMessages.add(message)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,8 +134,11 @@ class AmberClientListener(
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
accountStateViewModel?.toast("Error", error.message ?: "Unknown error")
|
||||
if (NostrSigner.instance.settings.useProxy && error.message?.contains("(port ${NostrSigner.instance.settings.proxyPort})") == true) {
|
||||
AmberListenerSingleton.latestErrorMessages.add("Failed to connect to Tor/Orbot")
|
||||
} else {
|
||||
AmberListenerSingleton.latestErrorMessages.add(error.message ?: "Unknown error")
|
||||
}
|
||||
}
|
||||
|
||||
override fun onEvent(event: Event, subscriptionId: String, relay: Relay, afterEOSE: Boolean) {
|
||||
|
||||
@@ -4,7 +4,6 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.util.Log
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.greenart7c3.nostrsigner.LocalPreferences
|
||||
import com.greenart7c3.nostrsigner.NostrSigner
|
||||
import com.greenart7c3.nostrsigner.database.LogEntity
|
||||
@@ -27,6 +26,7 @@ import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerResponse
|
||||
import com.vitorpamplona.quartz.utils.TimeUtils
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
object BunkerRequestUtils {
|
||||
@@ -84,7 +84,6 @@ object BunkerRequestUtils {
|
||||
}
|
||||
AmberListenerSingleton.setListener(
|
||||
context,
|
||||
AmberListenerSingleton.accountStateViewModel,
|
||||
)
|
||||
NostrSigner.instance.client.subscribe(
|
||||
AmberListenerSingleton.getListener()!!,
|
||||
@@ -97,7 +96,7 @@ object BunkerRequestUtils {
|
||||
id = 0,
|
||||
url = relay.url,
|
||||
type = "bunker response",
|
||||
message = ObjectMapper().writeValueAsString(bunkerResponse),
|
||||
message = EventMapper.mapper.writeValueAsString(bunkerResponse),
|
||||
time = System.currentTimeMillis(),
|
||||
),
|
||||
)
|
||||
@@ -164,12 +163,26 @@ object BunkerRequestUtils {
|
||||
)
|
||||
}
|
||||
|
||||
val success = NostrSigner.instance.client.sendAndWaitForResponse(it, relayList = relays)
|
||||
var success = false
|
||||
var errorCount = 0
|
||||
while (!success && errorCount < 3) {
|
||||
success = NostrSigner.instance.client.sendAndWaitForResponse(it, relayList = relays)
|
||||
if (!success) {
|
||||
errorCount++
|
||||
}
|
||||
relays.forEach {
|
||||
if (NostrSigner.instance.client.getRelay(it.url)?.isConnected() == false) {
|
||||
NostrSigner.instance.client.getRelay(it.url)?.connect()
|
||||
}
|
||||
}
|
||||
delay(1000)
|
||||
}
|
||||
if (success) {
|
||||
Log.d("IntentUtils", "Success response to relays ${relays.map { it.url }} type ${bunkerRequest?.method}")
|
||||
onDone(true)
|
||||
} else {
|
||||
onDone(false)
|
||||
AmberListenerSingleton.showErrorMessage()
|
||||
Log.d("IntentUtils", "Failed response to relays ${relays.map { it.url }} type ${bunkerRequest?.method}")
|
||||
}
|
||||
AmberListenerSingleton.getListener()?.let {
|
||||
|
||||
@@ -343,7 +343,7 @@ suspend fun onAddRelay(
|
||||
}
|
||||
|
||||
event?.let { signedEvent ->
|
||||
AmberListenerSingleton.setListener(context, accountStateViewModel)
|
||||
AmberListenerSingleton.setListener(context)
|
||||
val socket = factory
|
||||
val client = NostrClient(
|
||||
socket,
|
||||
@@ -399,6 +399,7 @@ suspend fun onAddRelay(
|
||||
count++
|
||||
}
|
||||
} else {
|
||||
AmberListenerSingleton.showErrorMessage()
|
||||
filterResult = true
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user