Conversation
Update NuGet dependencies across all projects Upgraded major and minor NuGet packages in MainCore, MainCore.Test, and WPFUI projects, including ReactiveUI, Splat, Serilog, FluentValidation, HtmlAgilityPack, Humanizer.Core, Polly, Selenium, and related dependencies. Updated packages.lock.json to reflect new and removed dependencies. No code logic changes; only package version updates for improved compatibility and maintenance.
Refactored codebase to use ReactiveUI.Primitives and related packages, replacing System.Reactive dependencies. Updated all usages of Unit to RxVoid, Observable to Signal, and refactored Interaction/ReactiveCommand signatures for RxVoid and RxSchedulers. Replaced RxApp schedulers with RxSchedulers, and updated dialog/file dialog interactions to new async methods in IDialogService/DialogService. Improved null safety in parsers, replaced ObservableExceptionHandler with LoggingExceptionObserver, and updated DI setup to use ConfigureSplatForMicrosoftDependencyResolver. Updated usages of InvokeCommand, Subscribe, Execute, and dialog handlers to new async patterns. Added/updated dependencies in packages.lock.json and MainCore.csproj. Improved null checks, error handling, logging, and UI thread safety.
Replaced all usages of DynamicData (e.g., AddRange) with manual foreach loops for ObservableCollection updates. Removed System.Reactive.Disposables.Fluent using directives where no longer needed. Explicitly imported ReactiveUI.Primitives in several files for compatibility. Updated .csproj and packages.lock.json to remove unused dependencies. Minor refactoring in view models to support these changes.
Replaced all Selenium dependencies and code with Microsoft.Playwright for browser automation. Updated ChromeBrowser.cs to use Playwright APIs for browser, page, and element management. Simplified IChromeBrowser interface to use Playwright types and removed Selenium-specific signatures. Removed ChromeDriverInstaller logic and all Selenium-related package references.
Replaced all HTML parsing logic in Parsers to use Microsoft.Playwright (`IPage`, `ILocator`) instead of HtmlAgilityPack. Refactored methods for async Playwright operations, updated signatures to return Playwright locators or async results, and removed all HtmlAgilityPack dependencies. Introduced regular expressions for class extraction where needed and ensured compatibility with Playwright's locator-based querying and asynchronous model. Updated project references and using statements accordingly. This modernizes the codebase for robust browser automation and dynamic web scraping.
…ing to Playwright page and locator APIs across commands, parsers, and tests. Updated browser helpers, refactored parsers and handlers to be async/page-based, switched logout and sleep flows to Shutdown(), modernized tests to xUnit v3 with shared Playwright fixtures, and removed obsolete dependencies and browser extension startup logic.
Updated `ChromeBrowser.WaitForURLAsync` to use a case-insensitive regex for URL matching reducing exact-match navigation failures.
Added a check in `LoginTask.cs` to detect the CMP consent wrapper on the current page and click the accept button when present before continuing with contextual help and options page navigation.
Added pooled DbContext factory support so the command can create fresh AppDbContext instances on demand. Converted OpenBrowserCommand to an instance handler with injected IChromeBrowser and IDbContextFactory<AppDbContext>. Split account loading and profile path creation into dedicated helpers, and moved last-used timestamp updates to a separate context after navigation completes.
Adapt parsing to the new React DOM structure and simplify CanStartAdventure visibility checks by using element counts instead of IsVisibleAsync().
Consolidate contextual-help handling into `LoginTask`, add cookie-consent detection, and split login into clearer steps with constructor-injected dependencies.
…oving separate command handlers, adding constructor injection, and moving navigation/selection logic into private helpers. Preserve behavior while scheduling the next execution directly via `task.ExecuteAt`.
Consolidate sleep-related handlers into SleepTask, convert it to a sealed class with injected dependencies, move duration lookup into local DbContext helpers, and update the flow to shut down the browser, sleep, reacquire access, and schedule the next run with improved cancellation handling.
Move login workflow into LoginTask, use a short-lived AppDbContext via IDbContextFactory in GetLoginInfo, change DisableContextualHelp to ValueTask<Result>, and accept cookie consent before login.
Consolidate quest navigation and claiming into `ClaimQuestTask` with private helper methods, preserving the existing claim loop and task sequencing.
Move the complete-immediately logic into CompleteImmediatelyTask, inject dependencies, and replace the command call with a shared InstantUpgrade helper while preserving queue handling.
…file to format correctly.Refactor NPC task handling and chaining Refactored NPC handling into instance-based task logic, moved page navigation into `NpcTask` helpers, preserved exchange behavior and overflow checks, and enqueue `UpgradeBuildingTask` after successful runs.
Narrow AdventureParser to the adventure duration section and update StartAdventureTask to wait for the new locator after navigation.
Move farm-list features to constructor-injected partial classes, consolidate start/update task execution and scheduling, and resolve rallypoint navigation internally.
Consolidate troop-training logic into an injected TrainTroopTask, replacing separate command handlers with internal helpers, using DbContextFactory scopes for building lookup and repeat-time calculation, and preserving troop selection, error handling, settings saves, and next-run scheduling.
Move next-execution calculation into UpdateVillageTask, convert village/building tasks to instance-based sealed partial classes with injected dependencies and primary-constructor task records, and clean up SleepTask imports.
Use a primary constructor for `UpgradeBuildingTask.Task`, passing `accountId` and `villageId` directly to `VillageTask` while preserving the `TaskName` override.
Added Chrome launch flags to disable non-proxied UDP WebRTC traffic and force the IP-handling policy, while preserving the existing `--disable-search-engine-choice-screen` argument formatting.
Inject handlers, use per-call DbContexts, serialize job DTOs directly, simplify navigation/build-page logic, fold build-plan validation into GetBuildPlanCommand, and update parsers, quest handling, and task timing.
Async Playwright locator handling now validates the expected 5 resources, splits normal and special building upgrades in `HandleUpgradeCommand` with injected dependencies and helper methods, improves parser selectors and async locator helpers, simplifies location navigation, and removes `GetBuildingSpec` filtering logic from the command.
Refactor the building upgrade flow to use the hero resource transfer UI from the upgrade panel, validate available inventory on the current page, confirm the transfer, and wait for the success toast. Also pass the building type through the command chain, remove the old availability command, normalize building names, and add parser helpers for the fill-up and confirm buttons.
Moved cropland expansion and resource validation into `HandleResourceCommand`, added automatic cropland queuing on `LackOfFreeCrop`, improved the hero-resource click/reload flow, and removed cropland handling from `UpgradeBuildingTask`.
|
Version of this build is 2.12.102 |
Removed the Tribe validation rule from AccountSettingInputValidator and VillageSettingInputValidator, allowing TribeEnums.Any to pass without explicit rejection.
|
Version of this build is 2.12.103 |
Added an MSBuild property group in `MainCore.csproj` to set `PlaywrightPlatform` to `win` for Windows build/runtime configuration.
|
Version of this build is 2.12.104 |
Expand artifact uploads to include hidden files in patch, release, and test workflows
|
Version of this build is 2.12.105 |
Add account and village observables plus invalidation hooks, synchronize village selection with a new coordinator and persistent state store, and update affected view models to clear or reload UI state on context changes.
Replace `ToHotTask()` with direct `await` on `Execute`/`Handle`, update imports to `ReactiveUI.Primitives.Signals`, simplify startup/window usings, and reload `DebugViewModel` tasks on the main thread.
|
Version of this build is 2.12.106 |
Refactor queue handling to use the DbContext factory and injected task manager directly, update notification scheduling, and switch login wait checks to server time.
Resolve `ITaskManager` on demand in `AccountInitHandler` instead of injecting it into `RxQueue`, and wait for the quest task image after navigating to the `tasks` page to improve page-load synchronization.
|
Version of this build is 2.12.107 |
Sort village build queue items by CompleteTime before creating UI list entries so the queue renders in completion order.
Refactor task management to use per-account scheduler actors with ownership validation and account-aware notifications.
|
Version of this build is 2.12.108 |
|
Version of this build is 2.12.109 |
Always set `ExecuteAt` to one hour before the current first queued task when `first` is true and a first task exists in `AddTask` and `UpdateTask`.
Sort tasks by ExecuteAt when consuming them, drop ReOrder methods and internal re-sort logic, and preserve request.ExecuteAt in AccountTaskBehavior.
|
Version of this build is 2.12.110 |
|
Version of this build is 2.12.111 |
|
Version of this build is 2.12.112 |
Make `OnContextInvalidated` async and reset `Buildings`, `Jobs`, `Queue`, and `NormalBuildInput` via `Signal.Start(..., RxSchedulers.MainThreadScheduler)`.
|
Version of this build is 2.12.113 |
Schedule Signal.Start directly on RxSchedulers.MainThreadScheduler in AccountSettingViewModel and VillageSettingViewModel, removing the extra ObserveOn step while preserving main-thread execution.
|
Version of this build is 2.12.114 |
Major update to TBS
You may want to start on new account instead of replace old file
If you don't need above changes, no need to update to this version but before report any bug, please try newest version first.
If you like my work and want to say thanks, or encourage me, you can buy me a coffee!
Thank you!