From abb41dc86c42ecc090c58df8462bdeffd7582cf4 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 27 Apr 2020 10:54:21 +0300 Subject: [PATCH] Improve resources to level task --- src/Action/ClickButtonAction.ts | 4 +++ src/Action/GoToPageAction.ts | 4 +++ src/Action/UpgradeResourceToLevel.ts | 43 +++++++++++++++------------- src/Command.ts | 4 ++- src/Task/ResourcesToLevel.ts | 17 ++++------- src/utils.ts | 19 ++++++------ 6 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/Action/ClickButtonAction.ts b/src/Action/ClickButtonAction.ts index 0e06ec8..22aca99 100644 --- a/src/Action/ClickButtonAction.ts +++ b/src/Action/ClickButtonAction.ts @@ -1,10 +1,14 @@ import { ActionController, registerAction } from './ActionController'; import { Args } from '../Command'; import { Task } from '../Queue/TaskQueue'; +import { AbortTaskError } from '../Errors'; @registerAction export class ClickButtonAction extends ActionController { async run(args: Args, task: Task): Promise { + if (!args.selector) { + throw new AbortTaskError('No selector'); + } const el = jQuery(args.selector); if (el.length === 1) { console.log('CLICK BUTTON', el); diff --git a/src/Action/GoToPageAction.ts b/src/Action/GoToPageAction.ts index ef6ded6..27ab8ee 100644 --- a/src/Action/GoToPageAction.ts +++ b/src/Action/GoToPageAction.ts @@ -1,10 +1,14 @@ import { ActionController, registerAction } from './ActionController'; import { Args } from '../Command'; import { Task } from '../Queue/TaskQueue'; +import { AbortTaskError } from '../Errors'; @registerAction export class GoToPageAction extends ActionController { async run(args: Args, task: Task): Promise { + if (!args.path) { + throw new AbortTaskError('No path'); + } window.location.assign(args.path); } } diff --git a/src/Action/UpgradeResourceToLevel.ts b/src/Action/UpgradeResourceToLevel.ts index ae03e7c..4c6ff1b 100644 --- a/src/Action/UpgradeResourceToLevel.ts +++ b/src/Action/UpgradeResourceToLevel.ts @@ -1,11 +1,11 @@ import { ActionController, registerAction } from './ActionController'; import { Args } from '../Command'; -import { ActionError, TryLaterError } from '../Errors'; +import { AbortTaskError, ActionError, TryLaterError } from '../Errors'; import { Task } from '../Queue/TaskQueue'; import { grabResourceDeposits } from '../Page/SlotBlock'; import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask'; import { ResourceDeposit } from '../Game'; -import { aroundMinutes } from '../utils'; +import { aroundMinutes, getNumber } from '../utils'; @registerAction export class UpgradeResourceToLevel extends ActionController { @@ -16,35 +16,38 @@ export class UpgradeResourceToLevel extends ActionController { } const villageId = args.villageId; - const requiredLevel = args.level; - const tasks = this.scheduler.getTaskItems(); + if (villageId === undefined) { + throw new AbortTaskError('No village id'); + } - const allUpgraded = deposits.reduce((memo, dep) => memo && dep.level >= requiredLevel, true); + const requiredLevel = getNumber(args.level); - if (allUpgraded) { + const notUpgraded = deposits.filter(dep => requiredLevel > dep.level); + + if (notUpgraded.length === 0) { this.scheduler.removeTask(task.id); return; } - const isDepositTaskNotInQueue = (dep: ResourceDeposit) => + const firstNotUpgraded = notUpgraded.sort((x, y) => x.level - y.level).shift(); + + if (firstNotUpgraded && this.isTaskNotInQueue(villageId, firstNotUpgraded)) { + this.scheduler.scheduleTask(UpgradeBuildingTask.name, { villageId, buildId: firstNotUpgraded.buildId }); + } + + throw new TryLaterError(aroundMinutes(10), 'Sleep for next round'); + } + + private isTaskNotInQueue(villageId: number, dep: ResourceDeposit): boolean { + const tasks = this.scheduler.getTaskItems(); + return ( undefined === tasks.find( task => task.name === UpgradeBuildingTask.name && task.args.villageId === villageId && task.args.buildId === dep.buildId - ); - - const notUpgraded = deposits.sort((x, y) => x.level - y.level).filter(isDepositTaskNotInQueue); - - if (notUpgraded.length === 0) { - throw new TryLaterError(aroundMinutes(10), 'No available deposits'); - } - - for (let dep of notUpgraded) { - this.scheduler.scheduleTask(UpgradeBuildingTask.name, { villageId, buildId: dep.buildId }); - } - - throw new TryLaterError(aroundMinutes(10), 'Sleep for next round'); + ) + ); } } diff --git a/src/Command.ts b/src/Command.ts index 55ec20e..d3161ab 100644 --- a/src/Command.ts +++ b/src/Command.ts @@ -15,7 +15,9 @@ export interface Args { trainCount?: number; resources?: ResourcesInterface; coordinates?: CoordinatesInterface; - [name: string]: any; + level?: number; + selector?: string; + path?: string; } export class Command { diff --git a/src/Task/ResourcesToLevel.ts b/src/Task/ResourcesToLevel.ts index 3559b83..454a27b 100644 --- a/src/Task/ResourcesToLevel.ts +++ b/src/Task/ResourcesToLevel.ts @@ -1,6 +1,6 @@ import { Args, Command } from '../Command'; import { Task } from '../Queue/TaskQueue'; -import { TaskController, registerTask } from './TaskController'; +import { TaskController, registerTask, ActionDefinition } from './TaskController'; import { GoToPageAction } from '../Action/GoToPageAction'; import { CompleteTaskAction } from '../Action/CompleteTaskAction'; import { path } from '../utils'; @@ -8,15 +8,10 @@ import { UpgradeResourceToLevel } from '../Action/UpgradeResourceToLevel'; @registerTask export class ResourcesToLevel extends TaskController { - async run(task: Task) { - const args: Args = { ...task.args, taskId: task.id }; - this.scheduler.scheduleActions([ - new Command(GoToPageAction.name, { - ...args, - path: path('/dorf1.php', { newdid: args.villageId }), - }), - new Command(UpgradeResourceToLevel.name, args), - new Command(CompleteTaskAction.name, args), - ]); + defineActions(task: Task): Array { + return [ + [GoToPageAction.name, { path: path('/dorf1.php', { newdid: task.args.villageId }) }], + [UpgradeResourceToLevel.name, {}], + ]; } } diff --git a/src/utils.ts b/src/utils.ts index 61a0b35..b608c00 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -4,25 +4,28 @@ export function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } +function randomInRange(from: number, to: number): number { + const delta = to - from; + const variation = Math.random() * delta; + return from + variation; +} + export async function sleepMicro() { - let ms = 2000 + Math.random() * 500; - return await sleep(ms); + return await sleep(randomInRange(2000, 2500)); } export async function sleepShort() { - let ms = 3000 + Math.random() * 1000; - return await sleep(ms); + return await sleep(randomInRange(3000, 4000)); } export async function sleepLong() { - let ms = 120_000 + Math.random() * 300_000; - return await sleep(ms); + return await sleep(randomInRange(120_000, 420_00)); } export function aroundMinutes(minutes: number) { const seconds = minutes * 60; - const delta = Math.floor(seconds * 0.9); - return seconds - delta + Math.floor(Math.random() * 2 * delta); + const delta = Math.floor(seconds * 0.1); + return randomInRange(seconds - delta, seconds + delta); } export async function waitForLoad() {