Aggiornamento alla versione 4.0.0

* Aggiunto `BooleanToOpacityConverter` per gestire opacità dinamica.
* Introdotto nuovo sistema di timing con `BidBeforeDeadlineMs`.
* Aggiunta opzione `CheckAuctionOpenBeforeBid` per maggiore sicurezza.
* Implementato polling adattivo (10ms-1000ms) e cooldown di 800ms.
* Migliorata gestione pulsanti globali con supporto `AUTO-START`/`AUTO-STOP`.
* Fix per il tasto `Canc` e focus automatico sul `DataGrid`.
* Fix per avvio singola asta senza necessità di "Avvia Tutti".
* Aggiornati formati CSV/JSON/XML con nuovi campi.
* Migliorata gestione cookie con endpoint unico `buy_bids.php`.
* Miglioramenti UI/UX: tooltip, formattazione prezzi, feedback visivo.
* Aggiornata documentazione e changelog per la versione 4.0.0.
This commit is contained in:
Alberto Balbo
2025-11-19 18:43:40 +01:00
parent 6036896f7d
commit f017ec0364
27 changed files with 2281 additions and 1069 deletions
@@ -10,44 +10,42 @@ namespace AutoBidder
/// </summary>
public partial class MainWindow
{
private void SaveCookieButton_Click(object sender, RoutedEventArgs e)
private async void SaveCookieButton_Click(object sender, RoutedEventArgs e)
{
try
{
var cookie = SettingsCookieTextBox.Text?.Trim();
if (string.IsNullOrEmpty(cookie))
{
MessageBox.Show(this, "Inserisci un cookie valido", "Errore", MessageBoxButton.OK, MessageBoxImage.Warning);
// Silenzioso - nessun MessageBox
return;
}
_auctionMonitor.InitializeSessionWithCookie(cookie, string.Empty);
var success = _auctionMonitor.UpdateUserInfoAsync().GetAwaiter().GetResult();
var success = await _auctionMonitor.UpdateUserInfoAsync();
var session = _auctionMonitor.GetSession();
if (success && session != null)
{
Services.SessionManager.SaveSession(session);
SetUserBanner(session.Username ?? string.Empty, session.RemainingBids);
UsernameText.Text = session.Username ?? string.Empty;
StartButton.IsEnabled = true;
Log($"[OK] Sessione salvata per: {session.Username}");
MessageBox.Show(this, $"Cookie valido!\nUtente: {session.Username}\nPuntate disponibili: {session.RemainingBids}", "Sessione Salvata", MessageBoxButton.OK, MessageBoxImage.Information);
// Rimosso MessageBox - verrà mostrato dal chiamante
}
else
{
Log($"[WARN] Cookie non valido o scaduto", LogLevel.Warn);
MessageBox.Show(this, "Cookie non valido o scaduto.\nVerifica che il cookie sia corretto.", "Errore Cookie", MessageBoxButton.OK, MessageBoxImage.Warning);
// Rimosso MessageBox - verrà mostrato dal chiamante se necessario
}
}
catch (Exception ex)
{
Log($"[ERRORE] Salvataggio cookie: {ex.Message}", LogLevel.Error);
MessageBox.Show(this, "Errore durante salvataggio cookie: " + ex.Message, "Errore", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void ImportCookieFromBrowserButton_Click(object sender, RoutedEventArgs e)
private async void ImportCookieFromBrowserButton_Click(object sender, RoutedEventArgs e)
{
try
{
@@ -57,14 +55,14 @@ namespace AutoBidder
return;
}
var cookies = EmbeddedWebView.CoreWebView2.CookieManager.GetCookiesAsync("https://it.bidoo.com").GetAwaiter().GetResult();
var cookies = await EmbeddedWebView.CoreWebView2.CookieManager.GetCookiesAsync("https://it.bidoo.com");
var stattrb = cookies.FirstOrDefault(c => c.Name == "__stattrb");
if (stattrb != null)
{
SettingsCookieTextBox.Text = stattrb.Value;
Log("[OK] Cookie importato dal browser");
MessageBox.Show(this, "Cookie importato con successo!\nClicca 'Salva Cookie' per confermare.", "Importa Cookie", MessageBoxButton.OK, MessageBoxImage.Information);
MessageBox.Show(this, "Cookie importato con successo!\nClicca 'Salva' per confermare.", "Importa Cookie", MessageBoxButton.OK, MessageBoxImage.Information);
}
else
{
@@ -110,27 +108,118 @@ namespace AutoBidder
SettingsManager.Save(s);
ExportPreferences.SaveLastExportExtension(s.LastExportExt);
MessageBox.Show(this, "Impostazioni salvate.", "Salva", MessageBoxButton.OK, MessageBoxImage.Information);
Log("[OK] Impostazioni export salvate", LogLevel.Success);
// Rimosso MessageBox - verrà mostrato dal chiamante
}
catch (Exception ex)
{
MessageBox.Show(this, "Errore salvataggio impostazioni: " + ex.Message, "Errore", MessageBoxButton.OK, MessageBoxImage.Error);
Log($"[ERRORE] Salvataggio impostazioni export: {ex.Message}", LogLevel.Error);
}
}
private void CancelSettingsButton_Click(object sender, RoutedEventArgs e)
{
LoadExportSettings();
try
{
// Ricarica impostazioni export
LoadExportSettings();
// Ricarica cookie salvato
var session = Services.SessionManager.LoadSession();
if (session != null && !string.IsNullOrEmpty(session.CookieString))
{
SettingsCookieTextBox.Text = session.CookieString;
}
else
{
SettingsCookieTextBox.Text = string.Empty;
}
Log("[INFO] Impostazioni ripristinate", LogLevel.Info);
MessageBox.Show(this, "Impostazioni ripristinate alle ultime salvate.", "Annulla", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
Log($"[ERRORE] Ripristino impostazioni: {ex.Message}", LogLevel.Error);
MessageBox.Show(this, "Errore durante ripristino: " + ex.Message, "Errore", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void SaveDefaultsButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(this, "Funzionalità non ancora implementata", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
try
{
// Salva impostazioni predefinite aste
if (int.TryParse(DefaultBidBeforeDeadlineMs.Text, out var bidMs) && bidMs >= 0 && bidMs <= 5000)
{
var settings = Utilities.SettingsManager.Load() ?? new Utilities.AppSettings();
settings.DefaultBidBeforeDeadlineMs = bidMs;
settings.DefaultCheckAuctionOpenBeforeBid = DefaultCheckAuctionOpen.IsChecked ?? false;
if (double.TryParse(DefaultMinPrice.Text.Replace(',', '.'), System.Globalization.NumberStyles.Any,
System.Globalization.CultureInfo.InvariantCulture, out var minPrice))
{
settings.DefaultMinPrice = minPrice;
}
if (double.TryParse(DefaultMaxPrice.Text.Replace(',', '.'), System.Globalization.NumberStyles.Any,
System.Globalization.CultureInfo.InvariantCulture, out var maxPrice))
{
settings.DefaultMaxPrice = maxPrice;
}
if (int.TryParse(DefaultMaxClicks.Text, out var maxClicks))
{
settings.DefaultMaxClicks = maxClicks;
}
Utilities.SettingsManager.Save(settings);
Log("[OK] Impostazioni predefinite aste salvate", LogLevel.Success);
// Rimosso MessageBox - verrà mostrato dal chiamante
}
else
{
Log("[WARN] Valore anticipo puntata non valido", LogLevel.Warn);
}
}
catch (Exception ex)
{
Log($"[ERRORE] Salvataggio defaults: {ex.Message}", LogLevel.Error);
}
}
private void CancelDefaultsButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(this, "Funzionalità non ancora implementata", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
try
{
// Ricarica defaults salvati
var settings = Utilities.SettingsManager.Load();
if (settings != null)
{
DefaultBidBeforeDeadlineMs.Text = settings.DefaultBidBeforeDeadlineMs.ToString();
DefaultCheckAuctionOpen.IsChecked = settings.DefaultCheckAuctionOpenBeforeBid;
DefaultMinPrice.Text = settings.DefaultMinPrice.ToString("F2");
DefaultMaxPrice.Text = settings.DefaultMaxPrice.ToString("F2");
DefaultMaxClicks.Text = settings.DefaultMaxClicks.ToString();
}
else
{
// Valori di default se non ci sono impostazioni salvate
DefaultBidBeforeDeadlineMs.Text = "200";
DefaultCheckAuctionOpen.IsChecked = false;
DefaultMinPrice.Text = "0";
DefaultMaxPrice.Text = "0";
DefaultMaxClicks.Text = "0";
}
Log("[INFO] Impostazioni predefinite ripristinate", LogLevel.Info);
MessageBox.Show(this, "Impostazioni predefinite ripristinate.", "Annulla", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
Log($"[ERRORE] Ripristino defaults: {ex.Message}", LogLevel.Error);
MessageBox.Show(this, "Errore durante ripristino: " + ex.Message, "Errore", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
}