diff --git a/src/App/Localization/Loc.cs b/src/App/Localization/Loc.cs index af56ffd..9f42caf 100644 --- a/src/App/Localization/Loc.cs +++ b/src/App/Localization/Loc.cs @@ -169,9 +169,9 @@ public sealed class Loc // Wallet panel ["wallet.close"] = ["Chiudi wallet", "Close wallet", "Cerrar wallet", "Fermer le wallet", "Fechar carteira", "Wallet schließen"], ["wallet.server"] = ["Server:", "Server:", "Servidor:", "Serveur :", "Servidor:", "Server:"], - ["wallet.connect"] = ["Connetti e sincronizza", "Connect and sync", "Conectar y sincronizar", "Connecter et synchroniser", "Conectar e sincronizar", "Verbinden und synchronisieren"], + ["wallet.connect"] = ["Connetti", "Connect", "Conectar", "Connecter", "Conectar", "Verbinden"], ["wallet.manual"] = ["oppure host:porta manuale", "or manual host:port", "o host:puerto manual", "ou hôte:port manuel", "ou host:porta manual", "oder manuell host:port"], - ["wallet.discover"] = ["Cerca altri server", "Discover servers", "Buscar otros servidores", "Rechercher des serveurs", "Procurar servidores", "Server suchen"], + ["wallet.discover"] = ["Sincronizza", "Sync servers", "Sincronizar", "Synchroniser", "Sincronizar", "Synchronisieren"], ["wallet.resetcert"] = ["Reset cert.", "Reset certs", "Restablecer cert.", "Réinit. cert.", "Redefinir cert.", "Zert. zurücksetzen"], ["tab.receive"] = ["Ricevi", "Receive", "Recibir", "Recevoir", "Receber", "Empfangen"], ["tab.history"] = ["Storico", "History", "Historial", "Historique", "Histórico", "Verlauf"], diff --git a/src/App/ViewModels/MainWindowViewModel.Sync.cs b/src/App/ViewModels/MainWindowViewModel.Sync.cs index c31ff44..6924ded 100644 --- a/src/App/ViewModels/MainWindowViewModel.Sync.cs +++ b/src/App/ViewModels/MainWindowViewModel.Sync.cs @@ -345,17 +345,57 @@ public partial class MainWindowViewModel _ = ConnectAndSync(); } + /// + /// Peer discovery. Always clickable: if the wallet is already connected, it reuses + /// that connection; otherwise it opens a short-lived connection to a candidate server + /// just to query its peer list, without touching the wallet's connection state. + /// [RelayCommand] private async Task DiscoverServers() { - if (_client is null || !_client.IsConnected) + if (_client is { IsConnected: true } connected) { - StatusMessage = Loc.Tr("conn.none") + "."; + await DiscoverServersUsing(connected); + return; + } + + var (host, port) = ParseServer(); + ElectrumClient? temp = null; + Exception? lastError = null; + foreach (var (h, p) in BuildServerCandidates(host, port)) + { + try + { + var pins = new CertificatePinStore(AppPaths.CertificatePinsPath(Net)); + temp = await ElectrumClient.ConnectAsync(h, p, UseSsl, pins); + lastError = null; + break; + } + catch (Exception ex) + { + lastError = ex; + } + } + if (temp is null) + { + StatusMessage = $"Errore nella scoperta peer: {lastError?.Message ?? Loc.Tr("conn.none")}"; return; } try { - var added = await Registry.DiscoverAsync(_client); + await DiscoverServersUsing(temp); + } + finally + { + await temp.DisposeAsync(); + } + } + + private async Task DiscoverServersUsing(ElectrumClient client) + { + try + { + var added = await Registry.DiscoverAsync(client); var selected = SelectedKnownServer; RefreshServers(); SelectedKnownServer = KnownServers.FirstOrDefault(s => s.Host == selected?.Host) diff --git a/src/App/Views/MainView.axaml b/src/App/Views/MainView.axaml index 0317834..b528ac4 100644 --- a/src/App/Views/MainView.axaml +++ b/src/App/Views/MainView.axaml @@ -1237,6 +1237,8 @@