Improve resources to level task
This commit is contained in:
		| @@ -1,10 +1,14 @@ | |||||||
| import { ActionController, registerAction } from './ActionController'; | import { ActionController, registerAction } from './ActionController'; | ||||||
| import { Args } from '../Command'; | import { Args } from '../Command'; | ||||||
| import { Task } from '../Queue/TaskQueue'; | import { Task } from '../Queue/TaskQueue'; | ||||||
|  | import { AbortTaskError } from '../Errors'; | ||||||
|  |  | ||||||
| @registerAction | @registerAction | ||||||
| export class ClickButtonAction extends ActionController { | export class ClickButtonAction extends ActionController { | ||||||
|     async run(args: Args, task: Task): Promise<any> { |     async run(args: Args, task: Task): Promise<any> { | ||||||
|  |         if (!args.selector) { | ||||||
|  |             throw new AbortTaskError('No selector'); | ||||||
|  |         } | ||||||
|         const el = jQuery(args.selector); |         const el = jQuery(args.selector); | ||||||
|         if (el.length === 1) { |         if (el.length === 1) { | ||||||
|             console.log('CLICK BUTTON', el); |             console.log('CLICK BUTTON', el); | ||||||
|   | |||||||
| @@ -1,10 +1,14 @@ | |||||||
| import { ActionController, registerAction } from './ActionController'; | import { ActionController, registerAction } from './ActionController'; | ||||||
| import { Args } from '../Command'; | import { Args } from '../Command'; | ||||||
| import { Task } from '../Queue/TaskQueue'; | import { Task } from '../Queue/TaskQueue'; | ||||||
|  | import { AbortTaskError } from '../Errors'; | ||||||
|  |  | ||||||
| @registerAction | @registerAction | ||||||
| export class GoToPageAction extends ActionController { | export class GoToPageAction extends ActionController { | ||||||
|     async run(args: Args, task: Task): Promise<any> { |     async run(args: Args, task: Task): Promise<any> { | ||||||
|  |         if (!args.path) { | ||||||
|  |             throw new AbortTaskError('No path'); | ||||||
|  |         } | ||||||
|         window.location.assign(args.path); |         window.location.assign(args.path); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| import { ActionController, registerAction } from './ActionController'; | import { ActionController, registerAction } from './ActionController'; | ||||||
| import { Args } from '../Command'; | import { Args } from '../Command'; | ||||||
| import { ActionError, TryLaterError } from '../Errors'; | import { AbortTaskError, ActionError, TryLaterError } from '../Errors'; | ||||||
| import { Task } from '../Queue/TaskQueue'; | import { Task } from '../Queue/TaskQueue'; | ||||||
| import { grabResourceDeposits } from '../Page/SlotBlock'; | import { grabResourceDeposits } from '../Page/SlotBlock'; | ||||||
| import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask'; | import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask'; | ||||||
| import { ResourceDeposit } from '../Game'; | import { ResourceDeposit } from '../Game'; | ||||||
| import { aroundMinutes } from '../utils'; | import { aroundMinutes, getNumber } from '../utils'; | ||||||
|  |  | ||||||
| @registerAction | @registerAction | ||||||
| export class UpgradeResourceToLevel extends ActionController { | export class UpgradeResourceToLevel extends ActionController { | ||||||
| @@ -16,35 +16,38 @@ export class UpgradeResourceToLevel extends ActionController { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         const villageId = args.villageId; |         const villageId = args.villageId; | ||||||
|         const requiredLevel = args.level; |         if (villageId === undefined) { | ||||||
|         const tasks = this.scheduler.getTaskItems(); |             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); |             this.scheduler.removeTask(task.id); | ||||||
|             return; |             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 === |             undefined === | ||||||
|             tasks.find( |             tasks.find( | ||||||
|                 task => |                 task => | ||||||
|                     task.name === UpgradeBuildingTask.name && |                     task.name === UpgradeBuildingTask.name && | ||||||
|                     task.args.villageId === villageId && |                     task.args.villageId === villageId && | ||||||
|                     task.args.buildId === dep.buildId |                     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'); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -15,7 +15,9 @@ export interface Args { | |||||||
|     trainCount?: number; |     trainCount?: number; | ||||||
|     resources?: ResourcesInterface; |     resources?: ResourcesInterface; | ||||||
|     coordinates?: CoordinatesInterface; |     coordinates?: CoordinatesInterface; | ||||||
|     [name: string]: any; |     level?: number; | ||||||
|  |     selector?: string; | ||||||
|  |     path?: string; | ||||||
| } | } | ||||||
|  |  | ||||||
| export class Command { | export class Command { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import { Args, Command } from '../Command'; | import { Args, Command } from '../Command'; | ||||||
| import { Task } from '../Queue/TaskQueue'; | import { Task } from '../Queue/TaskQueue'; | ||||||
| import { TaskController, registerTask } from './TaskController'; | import { TaskController, registerTask, ActionDefinition } from './TaskController'; | ||||||
| import { GoToPageAction } from '../Action/GoToPageAction'; | import { GoToPageAction } from '../Action/GoToPageAction'; | ||||||
| import { CompleteTaskAction } from '../Action/CompleteTaskAction'; | import { CompleteTaskAction } from '../Action/CompleteTaskAction'; | ||||||
| import { path } from '../utils'; | import { path } from '../utils'; | ||||||
| @@ -8,15 +8,10 @@ import { UpgradeResourceToLevel } from '../Action/UpgradeResourceToLevel'; | |||||||
|  |  | ||||||
| @registerTask | @registerTask | ||||||
| export class ResourcesToLevel extends TaskController { | export class ResourcesToLevel extends TaskController { | ||||||
|     async run(task: Task) { |     defineActions(task: Task): Array<ActionDefinition> { | ||||||
|         const args: Args = { ...task.args, taskId: task.id }; |         return [ | ||||||
|         this.scheduler.scheduleActions([ |             [GoToPageAction.name, { path: path('/dorf1.php', { newdid: task.args.villageId }) }], | ||||||
|             new Command(GoToPageAction.name, { |             [UpgradeResourceToLevel.name, {}], | ||||||
|                 ...args, |         ]; | ||||||
|                 path: path('/dorf1.php', { newdid: args.villageId }), |  | ||||||
|             }), |  | ||||||
|             new Command(UpgradeResourceToLevel.name, args), |  | ||||||
|             new Command(CompleteTaskAction.name, args), |  | ||||||
|         ]); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/utils.ts
									
									
									
									
									
								
							| @@ -4,25 +4,28 @@ export function sleep(ms: number) { | |||||||
|     return new Promise(resolve => setTimeout(resolve, ms)); |     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() { | export async function sleepMicro() { | ||||||
|     let ms = 2000 + Math.random() * 500; |     return await sleep(randomInRange(2000, 2500)); | ||||||
|     return await sleep(ms); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export async function sleepShort() { | export async function sleepShort() { | ||||||
|     let ms = 3000 + Math.random() * 1000; |     return await sleep(randomInRange(3000, 4000)); | ||||||
|     return await sleep(ms); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export async function sleepLong() { | export async function sleepLong() { | ||||||
|     let ms = 120_000 + Math.random() * 300_000; |     return await sleep(randomInRange(120_000, 420_00)); | ||||||
|     return await sleep(ms); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export function aroundMinutes(minutes: number) { | export function aroundMinutes(minutes: number) { | ||||||
|     const seconds = minutes * 60; |     const seconds = minutes * 60; | ||||||
|     const delta = Math.floor(seconds * 0.9); |     const delta = Math.floor(seconds * 0.1); | ||||||
|     return seconds - delta + Math.floor(Math.random() * 2 * delta); |     return randomInRange(seconds - delta, seconds + delta); | ||||||
| } | } | ||||||
|  |  | ||||||
| export async function waitForLoad() { | export async function waitForLoad() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user