diff --git a/Mimante/Mimante.csproj b/Mimante/AutoBidder.csproj similarity index 100% rename from Mimante/Mimante.csproj rename to Mimante/AutoBidder.csproj diff --git a/Mimante/Mimante.sln b/Mimante/AutoBidder.sln similarity index 97% rename from Mimante/Mimante.sln rename to Mimante/AutoBidder.sln index 5d7dbd0..35637ce 100644 --- a/Mimante/Mimante.sln +++ b/Mimante/AutoBidder.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.14.36511.14 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mimante", "Mimante.csproj", "{9BBAEF93-DF66-432C-9349-459E272D6538}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoBidder", "AutoBidder.csproj", "{9BBAEF93-DF66-432C-9349-459E272D6538}" EndProject Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "Template", "..\Template\Template.wapproj", "{1D9DB6F9-BD2B-4B14-9F2E-104060FAAD1E}" EndProject diff --git a/Mimante/MainWindow.xaml.cs b/Mimante/MainWindow.xaml.cs index 118a3a1..236069a 100644 --- a/Mimante/MainWindow.xaml.cs +++ b/Mimante/MainWindow.xaml.cs @@ -454,7 +454,7 @@ namespace AutoBidder DateTime lastDecisionLog = DateTime.MinValue; DateTime lastMissingLogUtc = DateTime.MinValue; DateTime lastSuccessfulRead = DateTime.UtcNow; - DateTime lastBidderUpdate = DateTime.MinValue; // ⭐ NUOVO: per limitare frequency update bidders + string lastKnownBidder = ""; // ⭐ traccia ultimo bidder per rilevare cambiamenti const string ultraFastScript = @" (function(){ @@ -510,6 +510,16 @@ namespace AutoBidder if(m) priceVal = m[1]; } + // ⭐ LETTURA BIDDER CORRENTE (aggiunto al main script per efficienza) + var currentBidder = null; + var bidderEl = document.querySelector('.auction-current-winner, .current-bidder, .last-bidder, .winner-name'); + if(bidderEl) { + var bidderName = (bidderEl.textContent||bidderEl.innerText||'').trim(); + if(bidderName && bidderName.length > 0 && bidderName.length < 50) { + currentBidder = bidderName; + } + } + // Bottone - ricerca diretta e velocissima var btn = null; var btnSels = ['a.auction-btn-bid:not([disabled])', '.auction-btn-bid:not([disabled])', 'a.bid-button']; @@ -519,7 +529,7 @@ namespace AutoBidder } if(btn && /\b(INIZIA|STARTING|RIAPRE)\b/i.test(btn.textContent||'')) { - return JSON.stringify({status:'soon', price: priceVal, btnFound: true}); + return JSON.stringify({status:'soon', price: priceVal, btnFound: true, currentBidder: currentBidder}); } // Timer DOM (fallback) @@ -536,9 +546,9 @@ namespace AutoBidder var result; if(!btn) { - result = JSON.stringify({status:'no-button', price: priceVal}); + result = JSON.stringify({status:'no-button', price: priceVal, currentBidder: currentBidder}); } else if(!finalTimer) { - result = JSON.stringify({status:'no-timer', price: priceVal, btnFound: true}); + result = JSON.stringify({status:'no-timer', price: priceVal, btnFound: true, currentBidder: currentBidder}); } else { result = JSON.stringify({ status:'found', @@ -548,6 +558,7 @@ namespace AutoBidder domTimer: domTimerVal, price: priceVal, btnFound: true, + currentBidder: currentBidder, timestamp: now }); } @@ -556,64 +567,6 @@ namespace AutoBidder window._abCache = {data: result, timestamp: now}; return result; - } catch(e) { - return JSON.stringify({status:'error', error: e.message}); - } -})();"; - - const string getLastBidderScript = @" -(function(){ - try { - var el = document.querySelector('.auction-current-winner, .current-bidder, .last-bidder'); - if(el) { - var name = (el.textContent||'').trim(); - if(name && name.length > 0 && name.length < 50) - return JSON.stringify({status:'found', bidder: name}); - } - return JSON.stringify({status:'not-found'}); - } catch(e) { - return JSON.stringify({status:'error', error: e.message}); - } -})();"; - - // ⭐⭐⭐ NUOVO SCRIPT: Legge TUTTA la cronologia puntate dalla tabella - const string getAllBiddersScript = @" -(function(){ - try { - var bidders = {}; - - // Cerca la tabella cronologia (auction-history, bid-history, ecc.) - var historyTable = document.querySelector('#DStorico, .auction-history table, .bid-history table, table.table-condensed'); - - if(historyTable) { - var rows = historyTable.querySelectorAll('tbody tr'); - - for(var i = 0; i < rows.length; i++) { - var cells = rows[i].querySelectorAll('td'); - if(cells.length >= 4) { - // Ultima colonna (4a) di solito è l'username - var username = (cells[3].textContent || cells[3].innerText || '').trim(); - - // Filtro nomi validi - if(username && username.length > 0 && username.length < 50 && username !== ' ') { - if(bidders[username]) { - bidders[username]++; - } else { - bidders[username] = 1; - } - } - } - } - } - - // Converti in array - var result = []; - for(var name in bidders) { - result.push({name: name, count: bidders[name]}); - } - - return JSON.stringify({status:'found', bidders: result}); - } catch(e) { return JSON.stringify({status:'error', error: e.message}); } @@ -622,7 +575,7 @@ namespace AutoBidder Log("🚀 Loop ULTRA-AGGRESSIVO avviato!"); Log("⚡ Strategia: Polling lento >2s, MASSIMA reattività <2s"); Log("📊 Lettura diretta variabili JavaScript Bidoo"); - Log("👥 Tracciamento COMPLETO cronologia puntate"); + Log("👥 Tracciamento REAL-TIME puntate utenti"); while (!token.IsCancellationRequested) { @@ -634,44 +587,6 @@ namespace AutoBidder try { await FetchUserNameAsync(); } catch { } } - // ⭐ AGGIORNA LISTA BIDDERS ogni 2 secondi leggendo la tabella cronologia - if ((DateTime.UtcNow - lastBidderUpdate) > TimeSpan.FromSeconds(2)) - { - try - { - var biddersResult = await ExecuteScriptWithTimeoutAsync(getAllBiddersScript, TimeSpan.FromMilliseconds(1000), token); - if (!string.IsNullOrEmpty(biddersResult)) - { - using var jd = JsonDocument.Parse(biddersResult ?? "{}"); - if (jd.RootElement.GetProperty("status").GetString() == "found") - { - var biddersArray = jd.RootElement.GetProperty("bidders"); - - // Aggiorna dizionario bidders - foreach (var bidder in biddersArray.EnumerateArray()) - { - var name = bidder.GetProperty("name").GetString() ?? ""; - var count = bidder.GetProperty("count").GetInt32(); - - if (!string.IsNullOrWhiteSpace(name)) - { - // Aggiorna sempre con il count più alto - if (!_bidders.ContainsKey(name) || _bidders[name].Count < count) - { - _bidders[name] = (count, DateTime.Now); - } - } - } - - UpdateBiddersGrid(); - } - } - } - catch { } - - lastBidderUpdate = DateTime.UtcNow; - } - // ⚡ ESECUZIONE SCRIPT ULTRA-VELOCE con timeout ridotto string? result = null; try @@ -727,7 +642,7 @@ namespace AutoBidder continue; } - if (!string.IsNullOrEmpty(result) && result.Length >= 2 && result[0] == '"' && result[^1] == '"') + if (!string.IsNullOrEmpty(result) && result.Length >= 2 && result[0] == '"' && result[^1] == '"' ) { try { result = JsonSerializer.Deserialize(result) ?? result; } catch { } } @@ -751,6 +666,24 @@ namespace AutoBidder var root = doc.RootElement; var status = root.GetProperty("status").GetString() ?? string.Empty; + // ⭐ LETTURA BIDDER CORRENTE dal risultato principale + string? currentBidder = null; + if (root.TryGetProperty("currentBidder", out var bidderProp) && bidderProp.ValueKind != JsonValueKind.Null) + { + currentBidder = bidderProp.GetString(); + + // ⭐ LOG quando cambia il bidder E REGISTRA IMMEDIATAMENTE + if (!string.IsNullOrWhiteSpace(currentBidder) && currentBidder != lastKnownBidder) + { + Log($"👤 Puntata di: {currentBidder}"); + + // ⭐ REGISTRA SUBITO LA PUNTATA NELLA LISTA + RegisterBidder(currentBidder); + + lastKnownBidder = currentBidder; + } + } + switch (status) { case "no-button": @@ -799,8 +732,6 @@ namespace AutoBidder { Log($"⏱️ Timer: {timerValue}s"); } - - previousTimer = timerValue; if (root.TryGetProperty("price", out var pEl) && pEl.ValueKind != JsonValueKind.Null) { @@ -831,37 +762,33 @@ namespace AutoBidder } } - if (double.TryParse(timerValue, NumberStyles.Any, CultureInfo.InvariantCulture, out var currentTimer) && - double.TryParse(previousTimer, NumberStyles.Any, CultureInfo.InvariantCulture, out var prevTimer)) + // ⭐ FIX CONTATORE RESET: Confronta con previousTimer PRIMA di aggiornarlo + if (!string.IsNullOrEmpty(timerValue) && !string.IsNullOrEmpty(previousTimer)) { - if (previousTimer != null && currentTimer > prevTimer + 0.5 && prevTimer < 30) + if (double.TryParse(timerValue, NumberStyles.Any, CultureInfo.InvariantCulture, out var currentTimer) && + double.TryParse(previousTimer, NumberStyles.Any, CultureInfo.InvariantCulture, out var prevTimer)) { - resetCount++; - await Dispatcher.InvokeAsync(() => ResetCountText.Text = resetCount.ToString()); - - try + // ⭐ Reset detectato: timer corrente > precedente + soglia E timer precedente era basso + if (currentTimer > prevTimer + 0.5 && prevTimer < 30) { - var bidderResult = await ExecuteScriptWithTimeoutAsync(getLastBidderScript, TimeSpan.FromMilliseconds(800), token); - if (!string.IsNullOrEmpty(bidderResult)) + resetCount++; + await Dispatcher.InvokeAsync(() => ResetCountText.Text = resetCount.ToString()); + + // ⭐ Usa currentBidder invece di fare una nuova query + var winnerName = !string.IsNullOrWhiteSpace(currentBidder) ? currentBidder : "Sconosciuto"; + Log($"🔄 Reset #{resetCount} - Winner: {winnerName}"); + + if (resetCount >= maxResets) { - using var jd = JsonDocument.Parse(bidderResult ?? "{}"); - if (jd.RootElement.GetProperty("status").GetString() == "found") - { - var bidder = jd.RootElement.GetProperty("bidder").GetString() ?? "Sconosciuto"; - RegisterBidder(bidder); - Log($"🔄 Reset #{resetCount} - Winner: {bidder}"); - } + StopAutomation($"Limite reset raggiunto: {resetCount}"); + return; } } - catch { Log($"🔄 Reset #{resetCount}"); } - - if (resetCount >= maxResets) - { - StopAutomation($"Limite reset raggiunto: {resetCount}"); - return; - } } } + + // ⭐ Aggiorna previousTimer DOPO il check del reset + previousTimer = timerValue; bool shouldClick = false; int clickTimerValue = 0; @@ -899,8 +826,18 @@ namespace AutoBidder { clickCount++; await Dispatcher.InvokeAsync(() => ClickCountText.Text = clickCount.ToString()); - RegisterBidder(_currentUserName); - Log($"✅ Click #{clickCount} - Timer: {timerValue}s (Delay: {clickDelayMs}ms)"); + + // ⭐ Usa il nome utente corrente (mai AutoBidder se abbiamo il nome) + if (!string.IsNullOrWhiteSpace(_currentUserName)) + { + RegisterBidder(_currentUserName); + Log($"✅ Click #{clickCount} ({_currentUserName}) - Timer: {timerValue}s (Delay: {clickDelayMs}ms)"); + } + else + { + // ⭐ NON registrare AutoBidder nella lista, solo nel log + Log($"✅ Click #{clickCount} (AutoBidder) - Timer: {timerValue}s (Delay: {clickDelayMs}ms)"); + } if (clickCount >= maxClicks) { @@ -1129,11 +1066,38 @@ namespace AutoBidder } } + private void StopAutomation(string reason) + { + try + { + _cts?.Cancel(); + _automationTask?.Wait(); + } + catch { } + + _cts = null; + _automationTask = null; + + Dispatcher.Invoke(() => + { + StartButton.IsEnabled = true; + StopButton.IsEnabled = false; + StartButton.Opacity = 1.0; + StopButton.Opacity = 0.5; + }); + + Log("🔴 Automazione fermata: " + reason); + } + private void RegisterBidder(string? bidderName) { try { - var name = !string.IsNullOrWhiteSpace(bidderName) ? bidderName.Trim() : "AutoBidder"; + // ⭐ FIX: Non usa più "AutoBidder" come fallback se il nome è vuoto + if (string.IsNullOrWhiteSpace(bidderName)) + return; + + var name = bidderName.Trim(); var now = DateTime.Now; if (_bidders.ContainsKey(name)) @@ -1145,29 +1109,11 @@ namespace AutoBidder _bidders[name] = (1, now); } - if (name != "AutoBidder" && _bidders.ContainsKey("AutoBidder")) - { - _bidders.Remove("AutoBidder"); - } - UpdateBiddersGrid(); } catch { } } - private void StopAutomation(string reason) - { - try { _cts?.Cancel(); } catch { } - Dispatcher.Invoke(() => - { - StartButton.IsEnabled = true; - StopButton.IsEnabled = false; - StartButton.Opacity = 1.0; - StopButton.Opacity = 0.5; - }); - Log("⏹️ STOP: " + reason); - } - private void StopButton_Click(object sender, RoutedEventArgs e) { StartButton.Opacity = 1.0; diff --git a/Template/Template.wapproj b/Template/Template.wapproj index 137b197..d636c57 100644 --- a/Template/Template.wapproj +++ b/Template/Template.wapproj @@ -56,7 +56,6 @@ it-IT True $(NoWarn);NU1702 - ..\Mimante\Mimante.csproj False D5FEC70BCE9E14BFEE2C9ABEFA81AA4FEE3A851A SHA256 @@ -65,6 +64,7 @@ True x86|x64|arm|arm64 24 + ..\Mimante\AutoBidder.csproj Always @@ -117,6 +117,6 @@ - + \ No newline at end of file