Miglioramenti UI e gestione puntate server

- Implementato focus automatico sulla riga successiva dopo la
  cancellazione di un'asta, con scrolling e reset focus.
- Utilizzo dei dati ufficiali del server per il conteggio
  delle puntate residue e usate su asta, con fallback manuale.
- Corretto il parsing dei campi della risposta server
  (campo 2: puntate residue, campo 5: puntate usate).
- Risolto il mancato aggiornamento immediato della UI
  (colonna "Clicks" e banner "Puntate residue").
- Aggiunto logging dettagliato per il parsing della risposta
  server e il debugging di eventuali problemi.
- Documentate le modifiche in file dedicati con scenari di
  test e istruzioni per il troubleshooting.
This commit is contained in:
2025-11-20 23:01:53 +01:00
parent c37b5b9f1e
commit 4bfcf147b4
13 changed files with 1658 additions and 11 deletions
+14
View File
@@ -383,6 +383,20 @@ namespace AutoBidder.Services
// Esegui la puntata
var result = await _apiClient.PlaceBidAsync(auction.AuctionId, auction.OriginalUrl);
auction.LastClickAt = DateTime.UtcNow;
// Aggiorna dati puntate da risposta server
if (result.Success)
{
if (result.RemainingBids.HasValue)
{
auction.RemainingBids = result.RemainingBids.Value;
}
if (result.BidsUsedOnThisAuction.HasValue)
{
auction.BidsUsedOnThisAuction = result.BidsUsedOnThisAuction.Value;
}
}
OnBidExecuted?.Invoke(auction, result);
if (result.Success)
+71 -7
View File
@@ -494,19 +494,83 @@ namespace AutoBidder.Services
{
result.Success = true;
var parts = responseText.Split('|');
if (parts.Length > 1 && double.TryParse(parts[1], out var priceIndex))
// Log della risposta completa per debugging
Log($"[BID PARSE] Risposta completa: {responseText}", auctionId);
Log($"[BID PARSE] Numero totale campi: {parts.Length}", auctionId);
// Formato risposta Bidoo: 9 campi separati da |
// Campo 1 (indice 0): "ok"
// Campo 2 (indice 1): Puntate residue totali
// Campo 3 (indice 2): ?
// Campo 4 (indice 3): ?
// Campo 5 (indice 4): Puntate usate su questa asta
// Campo 6-9 (indice 5-8): Altri dati
// Prezzo - presumibilmente nel campo 3 o nei campi successivi
// Cerchiamo un campo numerico ragionevole per il prezzo
for (int i = 1; i < Math.Min(parts.Length, 6); i++)
{
result.NewPrice = priceIndex * 0.01;
if (i == 1 || i == 4) continue; // Skip remaining bids e bids used
if (double.TryParse(parts[i], out var priceIndex) && priceIndex > 0)
{
result.NewPrice = priceIndex * 0.01;
Log($"[BID PARSE] Campo {i+1} - Prezzo parsato: €{result.NewPrice:F2}", auctionId);
break;
}
}
// Parse remaining bids from response if present: ok|324|...
if (parts.Length > 1 && int.TryParse(parts[1], out var remaining))
// Campo 2 (indice 1): Puntate residue totali
if (parts.Length > 1)
{
_session.RemainingBids = remaining;
Log($"[BID SUCCESS] Puntata piazzata - Crediti residui: {remaining}", auctionId);
Log($"[BID PARSE] Campo 2 (indice 1) - Remaining bids: '{parts[1]}'", auctionId);
if (int.TryParse(parts[1], out var remaining))
{
result.RemainingBids = remaining;
_session.RemainingBids = remaining;
Log($"[BID SUCCESS] ✅ Puntate residue totali: {remaining}", auctionId);
}
else
{
Log($"[BID PARSE WARN] ⚠️ Impossibile parsare campo 2 come int: '{parts[1]}'", auctionId);
}
}
else
{
Log("[BID SUCCESS] Puntata piazzata", auctionId);
Log($"[BID PARSE ERROR] ❌ Risposta non ha campo 2 (remaining bids)", auctionId);
}
// Campo 5 (indice 4): Puntate usate su questa asta
if (parts.Length > 4)
{
Log($"[BID PARSE] Campo 5 (indice 4) - Bids used on auction: '{parts[4]}'", auctionId);
if (int.TryParse(parts[4], out var usedOnAuction))
{
result.BidsUsedOnThisAuction = usedOnAuction;
Log($"[BID SUCCESS] ✅ Puntate usate su questa asta: {usedOnAuction}", auctionId);
}
else
{
Log($"[BID PARSE WARN] ⚠️ Impossibile parsare campo 5 come int: '{parts[4]}'", auctionId);
}
}
else
{
Log($"[BID PARSE ERROR] ❌ Risposta non ha campo 5 (bids used on auction) - Campi totali: {parts.Length}", auctionId);
}
// Log tutti i campi per debugging completo
Log($"[BID PARSE DEBUG] Tutti i campi della risposta:", auctionId);
for (int i = 0; i < parts.Length; i++)
{
Log($" Campo {i+1} (indice {i}): '{parts[i]}'", auctionId);
}
// Messaggio finale
if (!result.RemainingBids.HasValue && !result.BidsUsedOnThisAuction.HasValue)
{
Log("[BID SUCCESS] ⚠️ Puntata piazzata ma dati contatori non disponibili nella risposta", auctionId);
}
}
else if (responseText.StartsWith("error", StringComparison.OrdinalIgnoreCase) || responseText.StartsWith("no|", StringComparison.OrdinalIgnoreCase))