private async Task Fish(CancellationToken cancellationToken) { m_mouth.Say(Translate.GetTranslate("manager", "LABEL_CASTING")); await m_hands.Cast(cancellationToken); if (!m_eyes.CheckBobber(cancellationToken)) { m_mouth.Say(Translate.GetTranslate("manager", "LABEL_FINDING")); bool didFindFish = await m_eyes.LookForBobber(cancellationToken); if (!didFindFish) { m_fishingStats.RecordBobberNotFound(); return; } } // Update UI with wait status var uiUpdateCancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); var uiUpdateCancelToken = uiUpdateCancelTokenSource.Token; var progress = new Progress <long>(msecs => { if (!uiUpdateCancelToken.IsCancellationRequested && !cancellationToken.IsCancellationRequested) { m_mouth.Say(Translate.GetTranslate( "manager", "LABEL_WAITING", msecs / SECOND, Properties.Settings.Default.FishWait / SECOND)); } }); var uiUpdateTask = Task.Run( async() => await UpdateUIWhileWaitingToHearFish(progress, uiUpdateCancelToken), uiUpdateCancelToken); bool fishHeard = await m_ears.Listen( Properties.Settings.Default.FishWait, cancellationToken); uiUpdateCancelTokenSource.Cancel(); try { uiUpdateTask.GetAwaiter().GetResult(); // Wait & Unwrap // https://github.com/StephenCleary/AsyncEx/blob/dc54d22b06566c76db23af06afcd0727cac625ef/Source/Nito.AsyncEx%20(NET45%2C%20Win8%2C%20WP8%2C%20WPA81)/Synchronous/TaskExtensions.cs#L18 } catch (TaskCanceledException) { } finally { uiUpdateCancelTokenSource.Dispose(); } if (!fishHeard) { m_fishingStats.RecordNotHeard(); return; } m_mouth.Say(Translate.GetTranslate("manager", "LABEL_HEAR_FISH")); await m_hands.Loot(); m_fishingStats.RecordSuccess(); }
private async Task Fish(CancellationToken cancellationToken) { m_mouth.Say(Translate.GetTranslate("manager", "LABEL_CASTING")); m_eyes.updateBackground(); await m_hands.Cast(cancellationToken); m_mouth.Say(Translate.GetTranslate("manager", "LABEL_FINDING")); // Make bobber found async, so can check fishing sound in parallel, the result only important when we hear fish. // The position used for repositioning. CancellationTokenSource eyeCancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); CancellationToken eyeCancelToken = eyeCancelTokenSource.Token; Task <Win32.Point> eyeTask = Task.Run(async() => await m_eyes.LookForBobber(eyeCancelToken)); // Update UI with wait status CancellationTokenSource uiUpdateCancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); CancellationToken uiUpdateCancelToken = uiUpdateCancelTokenSource.Token; var progress = new Progress <long>(msecs => { if (!uiUpdateCancelToken.IsCancellationRequested && !cancellationToken.IsCancellationRequested) { m_mouth.Say(Translate.GetTranslate( "manager", "LABEL_WAITING", msecs / SECOND, a_FishWait / SECOND)); } }); var uiUpdateTask = Task.Run( async() => await UpdateUIWhileWaitingToHearFish(progress, uiUpdateCancelToken), uiUpdateCancelToken); Random rnd = new Random(); a_FishWait = rnd.Next(Properties.Settings.Default.FishWaitLow, Properties.Settings.Default.FishWaitHigh); bool fishHeard = await m_ears.Listen( a_FishWait, cancellationToken); //Log.Information("Ear result: "+a_FishWait.ToString()); uiUpdateCancelTokenSource.Cancel(); try { uiUpdateTask.GetAwaiter().GetResult(); // Wait & Unwrap // https://github.com/StephenCleary/AsyncEx/blob/dc54d22b06566c76db23af06afcd0727cac625ef/Source/Nito.AsyncEx%20(NET45%2C%20Win8%2C%20WP8%2C%20WPA81)/Synchronous/TaskExtensions.cs#L18 } catch (TaskCanceledException) { } finally { uiUpdateCancelTokenSource.Dispose(); } if (!fishHeard) { m_fishingStats.RecordNotHeard(); m_fishErrorLength++; return; } // We heard the fish, let's check bobbers position if (!eyeTask.IsCompleted) { // the search is not finished yet, but fish is heard, we have 2 seconds left to find and hook it eyeTask.Wait(2000, cancellationToken); eyeCancelTokenSource.Cancel(); } eyeCancelTokenSource.Dispose(); if (eyeTask.IsCompleted) { // search is ended what's the result? Win32.Point bobberPos = eyeTask.Result; if (bobberPos.x != 0 && bobberPos.y != 0) { // bobber found if (await m_eyes.SetMouseToBobber(bobberPos, cancellationToken)) { // bobber is still there Log.Information("Bobber databl: ({bx},{by})", bobberPos.x, bobberPos.y); await m_hands.Loot(); m_mouth.Say(Translate.GetTranslate("manager", "LABEL_HEAR_FISH")); m_fishingStats.RecordSuccess(); m_fishErrorLength = 0; Log.Information("Fish success"); return; } } } m_fishingStats.RecordBobberNotFound(); m_fishErrorLength++; }