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:
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user