Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions MainCore.Test/Behaviors/ErrorLoggingBehaviorTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,6 @@ public async Task ErrorLoggingBehaviorShouldLogCorrectErrorMessage(Result result
new List<object[]>
{
new object[] { Result.Fail(Cancel.Error), "Pause button is pressed" },
new object[] { Result.Fail(Skip.VillageNotFound), "Village not found" },
new object[] { Result.Fail(Stop.EnglishRequired("abcxyz")), "Cannot parse abcxyz. Is language English ?. Bot must stop" },
};
}
}
4 changes: 2 additions & 2 deletions MainCore/Behaviors/AccountTaskBehavior.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ public override async ValueTask<TResponse> HandleAsync(TRequest request, Cancell
{
if (!LoginParser.IsLoginPage(_browser.Html))
{
return (TResponse)Stop.NotTravianPage;
return (TResponse)Stop.Error.WithError("Travian is not ingame nor login page. Please check browser");
}

if (request is not LoginTask.Task)
{
_taskManager.AddOrUpdate<LoginTask.Task>(new(accountId), first: true);
request.ExecuteAt = request.ExecuteAt.AddSeconds(1);
return (TResponse)Skip.AccountLogout;
return (TResponse)Skip.Error.WithError("Account is logout. Re-login now");
}
}

Expand Down
16 changes: 12 additions & 4 deletions MainCore/Commands/Features/ClaimQuest/ClaimQuestCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,22 @@ private static async ValueTask<Result> HandleAsync(
quest = QuestParser.GetQuestCollectButton(browser.Html);
if (quest is null) return Result.Ok();

result = await browser.Click(By.XPath(quest.XPath), cancellationToken);
var (_, isFailed, element, errors) = await browser.GetElement(By.XPath(quest.XPath), cancellationToken);
if (isFailed) return Result.Fail(errors);

result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;
continue;
}
else
{
var (_, isFailed, element, errors) = await browser.GetElement(By.XPath(quest.XPath), cancellationToken);
if (isFailed) return Result.Fail(errors);

result = await browser.Click(By.XPath(quest.XPath), cancellationToken);
if (result.IsFailed) return result;
await delayService.DelayClick(cancellationToken);
result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;
await delayService.DelayClick(cancellationToken);
}
}
while (QuestParser.IsQuestClaimable(browser.Html));

Expand Down
13 changes: 6 additions & 7 deletions MainCore/Commands/Features/ClaimQuest/ToQuestPageCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,19 @@ private static async ValueTask<Result> HandleAsync(
IChromeBrowser browser,
CancellationToken cancellationToken)
{
var adventure = QuestParser.GetQuestMaster(browser.Html);
if (adventure is null) return Retry.ButtonNotFound("quest master");
var (_, isFailed, element, errors) = await browser.GetElement(doc => QuestParser.GetQuestMaster(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

static bool TableShow(IWebDriver driver)
{
var doc = new HtmlDocument();
doc.LoadHtml(driver.PageSource);
return QuestParser.IsQuestPage(doc);
}

var result = await browser.Click(By.XPath(adventure.XPath), cancellationToken);
if (result.IsFailed) return result;

result = await browser.WaitPageChanged("tasks", TableShow, cancellationToken);
result = await browser.Wait(TableShow, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,16 @@ private static async ValueTask<Result> HandleAsync(

if (oldQueueCount == 0) return Result.Ok();

var completeNowButton = CompleteImmediatelyParser.GetCompleteButton(browser.Html);
if (completeNowButton is null) return Retry.ButtonNotFound("complete now");
var (_, isFailed, element, errors) = await browser.GetElement(doc => CompleteImmediatelyParser.GetCompleteButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(By.XPath(completeNowButton.XPath), cancellationToken);
var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

static bool ConfirmShown(IWebDriver driver)
{
var doc = new HtmlDocument();
doc.LoadHtml(driver.PageSource);
var confirmButton = CompleteImmediatelyParser.GetConfirmButton(doc);
return confirmButton is not null;
}
result = await browser.Wait(ConfirmShown, cancellationToken);
if (result.IsFailed) return result;

var confirmButton = CompleteImmediatelyParser.GetConfirmButton(browser.Html);
if (confirmButton is null) return Retry.ButtonNotFound("confirm complete now");
(_, isFailed, element, errors) = await browser.GetElement(doc => CompleteImmediatelyParser.GetConfirmButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

result = await browser.Click(By.XPath(confirmButton.XPath), cancellationToken);
result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

static bool QueueDifferent(IWebDriver driver, int oldQueueCount)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ private static async ValueTask<Result> HandleAsync(
CancellationToken cancellationToken
)
{
var option = OptionParser.GetHideContextualHelpOption(browser.Html);
if (option is null) return Retry.NotFound("hide contextual help", "option");
var (_, isFailed, element, errors) = await browser.GetElement(doc => OptionParser.GetHideContextualHelpOption(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(By.XPath(option.XPath), cancellationToken);
var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

var button = OptionParser.GetSubmitButton(browser.Html);
if (button is null) return Retry.ButtonNotFound("submit");
(_, isFailed, element, errors) = await browser.GetElement(doc => OptionParser.GetSubmitButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

result = await browser.Click(By.XPath(button.XPath), cancellationToken);
result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ private static async ValueTask<Result> HandleAsync(
CancellationToken cancellationToken
)
{
var button = OptionParser.GetOptionButton(browser.Html);
if (button is null) return Retry.ButtonNotFound("options");
var (_, isFailed, element, errors) = await browser.GetElement(doc => OptionParser.GetOptionButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(By.XPath(button.XPath), cancellationToken);
var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
Expand Down
23 changes: 13 additions & 10 deletions MainCore/Commands/Features/LoginCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,25 @@ private static async ValueTask<Result> HandleAsync(
{
if (LoginParser.IsIngamePage(browser.Html)) return Result.Ok();

var buttonNode = LoginParser.GetLoginButton(browser.Html);
if (buttonNode is null) return Retry.ButtonNotFound("login");
var usernameNode = LoginParser.GetUsernameInput(browser.Html);
if (usernameNode is null) return Retry.TextboxNotFound("username");
var passwordNode = LoginParser.GetPasswordInput(browser.Html);
if (passwordNode is null) return Retry.TextboxNotFound("password");

var (username, password) = GetLoginInfo(command.AccountId, context);

Result result;
result = await browser.Input(By.XPath(usernameNode.XPath), username, cancellationToken);

var (_, isFailed, element, errors) = await browser.GetElement(doc => LoginParser.GetUsernameInput(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);
result = await browser.Input(element, username, cancellationToken);
if (result.IsFailed) return result;
result = await browser.Input(By.XPath(passwordNode.XPath), password, cancellationToken);

(_, isFailed, element, errors) = await browser.GetElement(doc => LoginParser.GetPasswordInput(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);
result = await browser.Input(element, password, cancellationToken);
if (result.IsFailed) return result;
result = await browser.Click(By.XPath(buttonNode.XPath), cancellationToken);

(_, isFailed, element, errors) = await browser.GetElement(doc => LoginParser.GetLoginButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);
result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

result = await browser.WaitPageChanged("dorf", cancellationToken);
if (result.IsFailed) return result;

Expand Down
54 changes: 15 additions & 39 deletions MainCore/Commands/Features/NpcResource/NpcResourceCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,6 @@ private static async ValueTask<Result> HandleAsync(
if (result.IsFailed) return result;

await Task.Delay(5000);
result = await browser.WaitPageLoaded(cancellationToken);
if (result.IsFailed) return result;

browser.Logger.Information("After NPC:");
LogResource(browser);
Expand Down Expand Up @@ -116,8 +114,11 @@ private static bool CanStart(IChromeBrowser browser, AppDbContext context, Villa

private static async Task<Result> OpenNPCDialog(IChromeBrowser browser, CancellationToken cancellationToken)
{
var button = NpcResourceParser.GetExchangeResourcesButton(browser.Html);
if (button is null) return Retry.ButtonNotFound("Exchange resources");
var (_, isFailed, element, errors) = await browser.GetElement(doc => NpcResourceParser.GetExchangeResourcesButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

static bool DialogShown(IWebDriver driver)
{
Expand All @@ -126,9 +127,6 @@ static bool DialogShown(IWebDriver driver)
return NpcResourceParser.IsNpcDialog(doc);
}

var result = await browser.Click(By.XPath(button.XPath), cancellationToken);
if (result.IsFailed) return result;

result = await browser.Wait(DialogShown, cancellationToken);
if (result.IsFailed) return result;

Expand All @@ -141,7 +139,10 @@ private static async Task<Result> InputAmount(IChromeBrowser browser, long[] val

for (var i = 0; i < 4; i++)
{
var result = await browser.Input(By.XPath(inputs[i].XPath), $"{values[i]}", cancellationToken);
var (_, isFailed, element, errors) = await browser.GetElement(By.XPath(inputs[i].XPath), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Input(element, $"{values[i]}", cancellationToken);
if (result.IsFailed) return result;
}

Expand Down Expand Up @@ -183,46 +184,21 @@ private static long[] GetRatio(Dictionary<VillageSettingEnums, int> settings)

private static async Task<Result> Distribute(IChromeBrowser browser, CancellationToken cancellationToken)
{
var result = await browser.Wait(driver =>
{
var doc = new HtmlDocument();
doc.LoadHtml(driver.PageSource);
var button = NpcResourceParser.GetDistributeButton(browser.Html);
if (button is null) return false;
var (_, isFailed, element, errors) = await browser.GetElement(doc => NpcResourceParser.GetDistributeButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var elements = driver.FindElements(By.XPath(button.XPath));
return elements.Count > 0 && elements[0].Enabled;
}, cancellationToken);
if (result.IsFailed) return result;

var button = NpcResourceParser.GetDistributeButton(browser.Html);
if (button is null) return Retry.ButtonNotFound("distribute");

result = await browser.Click(By.XPath(button.XPath), cancellationToken);
var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
}

private static async Task<Result> Redeem(IChromeBrowser browser, CancellationToken cancellationToken)
{
var result = await browser.Wait(driver =>
{
var doc = new HtmlDocument();
doc.LoadHtml(driver.PageSource);
var button = NpcResourceParser.GetRedeemButton(doc);

if (button is null) return false;

var elements = driver.FindElements(By.XPath(button.XPath));
return elements.Count > 0 && elements[0].Enabled;
}, cancellationToken);
if (result.IsFailed) return result;

var button = NpcResourceParser.GetRedeemButton(browser.Html);
if (button is null) return Retry.ButtonNotFound("redeem");
var (_, isFailed, element, errors) = await browser.GetElement(doc => NpcResourceParser.GetRedeemButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

result = await browser.Click(By.XPath(button.XPath), cancellationToken);
var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,28 @@ private static async ValueTask<Result> HandleAsync(
ILogger logger,
CancellationToken cancellationToken)
{
if (!AdventureParser.CanStartAdventure(browser.Html)) return Skip.NoAdventure;
if (!AdventureParser.CanStartAdventure(browser.Html)) return Skip.Error.WithError("No adventure available");

var adventureButton = AdventureParser.GetAdventureButton(browser.Html);
if (adventureButton is null) return Retry.ButtonNotFound("adventure");
if (adventureButton is null) return Retry.Error.WithError($"Failed to find adventure button");

logger.Information("Start adventure {Adventure}", AdventureParser.GetAdventureInfo(adventureButton));

var (_, isFailed, element, errors) = await browser.GetElement(By.XPath(adventureButton.XPath), cancellationToken);
if (isFailed) return Result.Fail(errors).WithError($"Failed to find adventure button [{adventureButton.XPath}]");

var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

static bool ContinueShow(IWebDriver driver)
{
var doc = new HtmlDocument();
doc.LoadHtml(driver.PageSource);
var continueButton = AdventureParser.GetContinueButton(doc);
return continueButton is not null;
}

var result = await browser.Click(By.XPath(adventureButton.XPath), cancellationToken);
if (result.IsFailed) return result;

result = await browser.Wait(ContinueShow, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,19 @@ private static async ValueTask<Result> HandleAsync(
IChromeBrowser browser,
CancellationToken cancellationToken)
{
var adventure = AdventureParser.GetHeroAdventureButton(browser.Html);
if (adventure is null) return Retry.ButtonNotFound("hero adventure");
var (_, isFailed, element, errors) = await browser.GetElement(doc => AdventureParser.GetHeroAdventureButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

static bool TableShow(IWebDriver driver)
{
var doc = new HtmlDocument();
doc.LoadHtml(driver.PageSource);
return AdventureParser.IsAdventurePage(doc);
}

var result = await browser.Click(By.XPath(adventure.XPath), cancellationToken);
if (result.IsFailed) return result;

result = await browser.WaitPageChanged("adventures", TableShow, cancellationToken);
result = await browser.Wait(TableShow, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ private static async ValueTask<Result> HandleAsync(
.Where(x => x.IsActive)
.Select(x => new FarmId(x.Id))
.ToList();
if (farmLists.Count == 0) return Skip.NoActiveFarmlist;
if (farmLists.Count == 0) return Skip.Error.WithError("No farmlist is active");

foreach (var farmList in farmLists)
{
var startButton = FarmListParser.GetStartButton(browser.Html, farmList);
if (startButton is null) return Retry.ButtonNotFound($"Start farm {farmList}");
var (_, isFailed, element, errors) = await browser.GetElement(doc => FarmListParser.GetStartButton(doc, farmList), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(By.XPath(startButton.XPath), cancellationToken);
var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

await delayService.DelayClick(cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ private static async ValueTask<Result> HandleAsync(
CancellationToken cancellationToken
)
{
var startAllButton = FarmListParser.GetStartAllButton(browser.Html);
if (startAllButton is null) return Retry.ButtonNotFound("Start all farms");
var (_, isFailed, element, errors) = await browser.GetElement(doc => FarmListParser.GetStartAllButton(doc), cancellationToken);
if (isFailed) return Result.Fail(errors);

var result = await browser.Click(By.XPath(startAllButton.XPath), cancellationToken);
var result = await browser.Click(element, cancellationToken);
if (result.IsFailed) return result;

return Result.Ok();
Expand Down
Loading
Loading