Skip to content

Commit 701337c

Browse files
authored
Merge pull request #101 from Erol444/fix-16-04-2022
Fix 16 04 2022
2 parents b7cf81b + c425f67 commit 701337c

File tree

6 files changed

+69
-63
lines changed

6 files changed

+69
-63
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ jobs:
4646
- name: Upload a Build Artifact
4747
uses: actions/upload-artifact@v2
4848
with:
49-
name: TBS-Build
49+
name: TBS-Build-${{ github.sha }}
5050
path: TravBotSharp\bin\Release
5151
if-no-files-found: error
5252

TbsCore/Helpers/AccountHelper.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using System.Threading.Tasks;
34
using TbsCore.Models.AccModels;
45
using TbsCore.Models.VillageModels;
56
using TbsCore.Tasks.LowLevel;
@@ -9,6 +10,8 @@ namespace TbsCore.Helpers
910
{
1011
public static class AccountHelper
1112
{
13+
private static Random rnd = new Random();
14+
1215
public static Village GetMainVillage(Account acc)
1316
{
1417
var main = acc.Villages.FirstOrDefault(x => x.Id == acc.Settings.MainVillage);
@@ -46,15 +49,14 @@ public static Village GetQuestsClaimVillage(Account acc)
4649
}
4750

4851
/// <summary>
49-
/// Returns a random delay (click delay, ~0.5-1.6sec).
52+
/// Returns a random
53+
///
54+
/// (click delay, ~0.5-1.6sec).
5055
/// </summary>
5156
/// <returns>Random delay in milliseconds</returns>
52-
public static int Delay(Account acc)
53-
{
54-
//Return random delay
55-
Random rnd = new Random();
56-
return rnd.Next(acc.Settings.DelayClickingMin, acc.Settings.DelayClickingMax);
57-
}
57+
public static int Delay(Account acc) => rnd.Next(acc.Settings.DelayClickingMin, acc.Settings.DelayClickingMax);
58+
59+
public static Task DelayWait(Account acc) => Task.Delay(Delay(acc));
5860

5961
public static void StartAccountTasks(Account acc)
6062
{

TbsCore/Helpers/DriverHelper.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,11 @@ public static async Task WaitPageLoaded(Account acc, double delay = 1)
213213
public static async Task WaitPageChange(Account acc, string part, double delay = 1)
214214
{
215215
var wait = new WebDriverWait(acc.Wb.Driver, TimeSpan.FromMinutes(delay));
216-
wait.Until(driver => driver.Url.Contains(part));
216+
try
217+
{
218+
wait.Until(driver => driver.Url.Contains(part));
219+
}
220+
catch { }
217221
await WaitPageLoaded(acc, delay);
218222
}
219223
}

TbsCore/Helpers/NavigationHelper.cs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using OpenQA.Selenium;
1+
using HtmlAgilityPack;
2+
using OpenQA.Selenium;
23
using System;
34
using System.Linq;
45
using System.Threading.Tasks;
@@ -125,37 +126,29 @@ internal static async Task<bool> ToConstructionTab(Account acc, BuildingEnum bui
125126
classCategoryNode = "";
126127
break;
127128
}
128-
string classFirstNode;
129+
HtmlNode node;
129130
switch (acc.AccInfo.ServerVersion)
130131
{
131132
case ServerVersionEnum.TTwars:
132-
classFirstNode = "container";
133+
node = acc.Wb.Html.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("container") && x.HasClass(classCategoryNode));
133134
break;
134135

135136
case ServerVersionEnum.T4_5:
136-
classFirstNode = "tabItem";
137+
node = acc.Wb.Html.DocumentNode.Descendants("a").FirstOrDefault(x => x.HasClass("tabItem") && x.HasClass(classCategoryNode));
137138

138139
break;
139140

140141
default:
141-
classFirstNode = "";
142+
node = null;
142143
break;
143144
}
144-
var node = acc.Wb.Html.DocumentNode.Descendants("a").FirstOrDefault(x => x.HasClass(classFirstNode) && x.HasClass(classCategoryNode));
145145
if (node == null) return false;
146146

147147
var element = acc.Wb.Driver.FindElement(By.XPath(node.XPath));
148148
if (element == null) return false;
149149
element.Click();
150150
acc.Logger.Information($"Waitting tab change");
151-
try
152-
{
153-
await DriverHelper.WaitPageChange(acc, "category", 0.5);
154-
}
155-
catch
156-
{
157-
await DriverHelper.WaitPageLoaded(acc);
158-
}
151+
await DriverHelper.WaitPageChange(acc, "category");
159152
return true;
160153
}
161154

TbsCore/Parsers/ResourceParser.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,5 @@ public static Resources ParseResourcesMerchants(HtmlNode node)
9292
};
9393
return res;
9494
}
95-
96-
public static Resources ParseResourcesNeed(HtmlNode node)
97-
{
98-
var resWrapper = node.Descendants().FirstOrDefault(x => x.HasClass("resourceWrapper"));
99-
return GetResourceCost(resWrapper);
100-
}
10195
}
10296
}

TbsCore/Tasks/LowLevel/UpgradeBuilding.cs

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public override async Task<TaskRes> Execute(Account acc)
5353
if (acc.AccInfo.ServerVersion == ServerVersionEnum.TTwars && !_buildingTask.ConstructNew)
5454
{
5555
acc.Logger.Information("Try using TTWars fast build method", this);
56+
await Task.Delay(AccountHelper.Delay(acc));
5657
var fastUpgrade = await TTWarsTryFastUpgrade(acc, $"{acc.AccInfo.ServerUrl}/build.php?id={_buildingTask.BuildingId}");
5758
if (fastUpgrade) continue;
5859
acc.Logger.Information("Using TTWars fast build method failed. Continue normal method", this);
@@ -99,11 +100,19 @@ private async Task<bool> Construct(Account acc)
99100
// Check for prerequisites
100101
if (button == null)
101102
{
103+
Retry(acc, "Button disappear.");
102104
return false;
103105
}
104106

105-
await DriverHelper.ClickById(acc, button.Id);
106-
107+
await AccountHelper.DelayWait(acc);
108+
acc.Logger.Information($"Starting contruct {_buildingTask.Building} in {Vill.Name}");
109+
var element = acc.Wb.Driver.FindElement(By.XPath(button.XPath));
110+
if (element == null)
111+
{
112+
Retry(acc, "Button disappear.");
113+
return false;
114+
}
115+
element.Click();
107116
_buildingTask.ConstructNew = false;
108117

109118
acc.Logger.Warning($"Started construction of {_buildingTask.Building} in {Vill.Name}");
@@ -123,17 +132,7 @@ private async Task<bool> Construct(Account acc)
123132
private async Task<bool> Upgrade(Account acc)
124133
{
125134
acc.Wb.UpdateHtml();
126-
HtmlNode node = null;
127-
switch (acc.AccInfo.ServerVersion)
128-
{
129-
case ServerVersionEnum.TTwars:
130-
node = acc.Wb.Html.GetElementbyId($"contract_building{(int)_buildingTask.Building}");
131-
break;
132-
133-
case ServerVersionEnum.T4_5:
134-
node = acc.Wb.Html.GetElementbyId("build");
135-
break;
136-
}
135+
HtmlNode node = acc.Wb.Html.GetElementbyId("build");
137136
(var buildingEnum, var lvl) = InfrastructureParser.UpgradeBuildingGetInfo(node);
138137

139138
if (buildingEnum == BuildingEnum.Site || lvl == -1)
@@ -156,7 +155,7 @@ private async Task<bool> Upgrade(Account acc)
156155

157156
if (lvl >= _buildingTask.Level)
158157
{
159-
acc.Logger.Information($"{_buildingTask.Building} is already level {lvl} in village {Vill.Name}. Will be removed from the queue.");
158+
acc.Logger.Information($"{_buildingTask.Building} is already level {lvl} in village {Vill.Name}. Will be removed from the queue.", this);
160159
RemoveCurrentTask();
161160
return false;
162161
}
@@ -165,7 +164,7 @@ private async Task<bool> Upgrade(Account acc)
165164
var buttons = container?.Descendants("button");
166165
if (buttons == null)
167166
{
168-
acc.Logger.Warning($"We wanted to upgrade {_buildingTask.Building}, but no 'upgrade' button was found! Url={acc.Wb.CurrentUrl}");
167+
acc.Logger.Information($"We wanted to upgrade {_buildingTask.Building}, but no 'upgrade' button was found! Url={acc.Wb.CurrentUrl}", this);
169168
return false;
170169
}
171170

@@ -178,34 +177,47 @@ private async Task<bool> Upgrade(Account acc)
178177

179178
if (upgradeButton == null)
180179
{
181-
acc.Logger.Warning($"We wanted to upgrade {_buildingTask.Building}, but no 'upgrade' button was found!");
180+
Retry(acc, $"We wanted to upgrade {_buildingTask.Building}, but no 'upgrade' button was found!");
182181
return false;
183182
}
184183

185184
// Not enough resources?
186185
if (acc.AccInfo.ServerVersion == ServerVersionEnum.T4_5 && errorMessage != null)
187186
{
188-
acc.Logger.Warning($"We wanted to upgrade {_buildingTask.Building}, but there was an error message:\n{errorMessage.InnerText}");
187+
Retry(acc, $"We wanted to upgrade {_buildingTask.Building}, but there was an error message:\n{errorMessage.InnerText}");
189188
return false;
190189
}
191190

192191
var buildDuration = InfrastructureParser.GetBuildDuration(container, acc.AccInfo.ServerVersion);
193192

194-
acc.Logger.Information($"Started upgrading {_buildingTask.Building} to level {lvl + 1} in {Vill.Name}");
193+
acc.Logger.Information("Complete checking", this);
194+
acc.Logger.Information($"Upgrading {_buildingTask.Building} to level {lvl + 1} in {Vill.Name}", this);
195195

196196
var watchAd = false;
197197
if (acc.AccInfo.ServerVersion == ServerVersionEnum.T4_5 && buildDuration.TotalMinutes > acc.Settings.WatchAdAbove)
198198
{
199199
// watchAd = await TryFastUpgrade(acc);
200+
acc.Logger.Information("Try using watch ads upgrade button", this);
201+
acc.Logger.Information("Watch ads function is disable because of bugs from Chrome. We cannot do anything about this", this);
200202
}
201203

202204
if (!watchAd)
203205
{
206+
await AccountHelper.DelayWait(acc);
207+
acc.Logger.Information("Using normal upgrade button");
208+
204209
upgradeButton = buttons.FirstOrDefault(x => x.HasClass("build"));
205-
await DriverHelper.ClickById(acc, upgradeButton.Id); // Normal upgrade
210+
211+
var element = acc.Wb.Driver.FindElement(By.XPath(upgradeButton.XPath));
212+
if (element == null)
213+
{
214+
Retry(acc, "Button disappear.");
215+
return false;
216+
}
217+
element.Click();
206218
}
207219

208-
acc.Logger.Information($"Upgraded {_buildingTask.Building} to level {lvl + 1} in {Vill.Name}");
220+
acc.Logger.Information($"Upgraded {_buildingTask.Building} to level {lvl + 1} in {Vill.Name}", this);
209221
if (_buildingTask.Level == lvl + 1)
210222
{
211223
RemoveCurrentTask();
@@ -449,11 +461,13 @@ private async Task<bool> FreeCropCondition(Account acc)
449461

450462
private async Task MoveIntoBuilding(Account acc)
451463
{
464+
await AccountHelper.DelayWait(acc);
452465
acc.Logger.Information($"Move into building {_buildingTask.Building}", this);
453466
await NavigationHelper.EnterBuilding(acc, Vill, (int)_buildingTask.BuildingId);
454467
var build = Vill.Build.Buildings.FirstOrDefault(x => x.Id == _buildingTask.BuildingId);
455468
if (build.Type == BuildingEnum.Site)
456469
{
470+
await AccountHelper.DelayWait(acc);
457471
acc.Logger.Information($"This is contruct task, choose correct tab for building {_buildingTask.Building}", this);
458472
await NavigationHelper.ToConstructionTab(acc, _buildingTask.Building);
459473
}
@@ -493,31 +507,30 @@ private async Task<bool> IsEnoughRes(Account acc)
493507

494508
acc.Wb.UpdateHtml();
495509
HtmlNode contractNode = null;
496-
switch (acc.AccInfo.ServerVersion)
510+
if (construct)
497511
{
498-
case ServerVersionEnum.TTwars:
499-
contractNode = acc.Wb.Html.GetElementbyId($"contract_building{(int)_buildingTask.Building}");
500-
break;
501-
502-
case ServerVersionEnum.T4_5:
503-
contractNode = acc.Wb.Html.GetElementbyId("contract");
504-
break;
512+
contractNode = acc.Wb.Html.GetElementbyId($"contract_building{(int)_buildingTask.Building}");
513+
}
514+
else
515+
{
516+
contractNode = acc.Wb.Html.GetElementbyId("contract");
505517
}
506-
var cost = ResourceParser.ParseResourcesNeed(contractNode);
507-
acc.Logger.Information($"Need {cost}");
518+
519+
var resWrapper = contractNode.Descendants().FirstOrDefault(x => x.HasClass("resourceWrapper"));
520+
var cost = ResourceParser.GetResourceCost(resWrapper);
521+
522+
acc.Logger.Information($"Need {cost}", this);
508523

509524
if (!ResourcesHelper.IsEnoughRes(Vill, cost.ToArray()))
510525
{
511526
if (ResourcesHelper.IsStorageTooLow(acc, Vill, cost))
512527
{
513-
acc.Logger.Warning($"Storage is too low to build {_buildingTask.Building} - Level {_buildingTask.Level}! Needed {cost}. Need upgrade storage first", this);
514-
acc.Logger.Information("Now bot CANNOT add upgrade storage task, please do it manually.", this);
515-
StopFlag = true;
528+
acc.Logger.Warning($"Storage is too low. Added storage upgrade.", this);
516529
return false;
517530
}
518531

519532
var stillNeededRes = ResourcesHelper.SubtractResources(cost.ToArray(), Vill.Res.Stored.Resources.ToArray(), true);
520-
acc.Logger.Information("Not enough resources to build.");
533+
acc.Logger.Information("Not enough resources to build.", this);
521534
if (Vill.Settings.UseHeroRes && acc.AccInfo.ServerVersion == ServerVersionEnum.T4_5) // Only T4.5 has resources in hero inv
522535
{
523536
var heroRes = HeroHelper.GetHeroResources(acc);

0 commit comments

Comments
 (0)