From cd7d9f08003e2bf92e5b3c4674495bf9a5ecdc71 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Wed, 29 Apr 2020 20:30:26 +0300 Subject: [PATCH] Use dependency container --- src/Container.ts | 50 +++++++++++++++++++++++++++++++++ src/Queue/TaskQueue.ts | 63 +++++++++++++++++++++++++++++------------- src/Scheduler.ts | 10 +++---- src/index.js | 10 +++---- 4 files changed, 103 insertions(+), 30 deletions(-) create mode 100644 src/Container.ts diff --git a/src/Container.ts b/src/Container.ts new file mode 100644 index 0000000..59396c0 --- /dev/null +++ b/src/Container.ts @@ -0,0 +1,50 @@ +import { Scheduler } from './Scheduler'; +import { DataStorageTaskProvider, TaskQueue } from './Queue/TaskQueue'; +import { ConsoleLogger } from './Logger'; +import { ActionQueue } from './Queue/ActionQueue'; +import { Executor } from './Executor'; +import { ControlPanel } from './ControlPanel'; + +export class Container { + private readonly version: string; + + constructor(version: string) { + this.version = version; + } + + private _scheduler; + + get scheduler(): Scheduler { + this._scheduler = + this._scheduler || + (() => { + const taskProvider = DataStorageTaskProvider.create(); + const taskQueue = new TaskQueue(taskProvider, new ConsoleLogger(TaskQueue.name)); + const actionQueue = new ActionQueue(); + return new Scheduler(taskQueue, actionQueue, new ConsoleLogger(Scheduler.name)); + })(); + return this._scheduler; + } + + private _executor; + + get executor(): Executor { + this._executor = + this._executor || + (() => { + return new Executor(this.version, this.scheduler); + })(); + return this._executor; + } + + private _controlPanel; + + get controlPanel(): ControlPanel { + this._controlPanel = + this._controlPanel || + (() => { + return new ControlPanel(this.version, this.scheduler); + })(); + return this._controlPanel; + } +} diff --git a/src/Queue/TaskQueue.ts b/src/Queue/TaskQueue.ts index 4133495..b50b30d 100644 --- a/src/Queue/TaskQueue.ts +++ b/src/Queue/TaskQueue.ts @@ -1,5 +1,5 @@ import { uniqId } from '../utils'; -import { ConsoleLogger, Logger } from '../Logger'; +import { Logger } from '../Logger'; import { DataStorage } from '../DataStorage'; import { Args } from './Args'; @@ -39,13 +39,48 @@ type TaskList = Array; export type ImmutableTaskList = ReadonlyArray; -export class TaskQueue { - private readonly logger: Logger; +export interface TaskProvider { + getTasks(): TaskList; + setTasks(tasks: TaskList): void; +} + +export class DataStorageTaskProvider implements TaskProvider { private storage: DataStorage; - constructor() { - this.storage = new DataStorage(NAMESPACE); - this.logger = new ConsoleLogger(this.constructor.name); + constructor(storage: DataStorage) { + this.storage = storage; + } + + static create() { + return new DataStorageTaskProvider(new DataStorage(NAMESPACE)); + } + + getTasks(): TaskList { + const serialized = this.storage.get(QUEUE_NAME); + if (!Array.isArray(serialized)) { + return []; + } + + const storedItems = serialized as Array<{ [key: string]: any }>; + + return storedItems.map(i => { + const task = new Task(uniqId(), 0, '', {}); + return Object.assign(task, i); + }); + } + + setTasks(tasks: TaskList): void { + this.storage.set(QUEUE_NAME, tasks); + } +} + +export class TaskQueue { + private provider: TaskProvider; + private readonly logger: Logger; + + constructor(provider: TaskProvider, logger: Logger) { + this.provider = provider; + this.logger = logger; } push(name: string, args: Args, ts: number): Task { @@ -105,21 +140,11 @@ export class TaskQueue { } private getItems(): TaskList { - const serialized = this.storage.get(QUEUE_NAME); - if (!Array.isArray(serialized)) { - return []; - } - - const storedItems = serialized as Array<{ [key: string]: any }>; - - return storedItems.map(i => { - const task = new Task(uniqId(), 0, '', {}); - return Object.assign(task, i); - }); + return this.provider.getTasks(); } private flushItems(items: TaskList): void { - const normalized = items.sort((x, y) => x.ts - y.ts || x.id.localeCompare(y.id)); - this.storage.set(QUEUE_NAME, normalized); + items.sort((x, y) => x.ts - y.ts || x.id.localeCompare(y.id)); + this.provider.setTasks(items); } } diff --git a/src/Scheduler.ts b/src/Scheduler.ts index fbc5c61..86d229b 100644 --- a/src/Scheduler.ts +++ b/src/Scheduler.ts @@ -3,7 +3,7 @@ import { UpgradeBuildingTask } from './Task/UpgradeBuildingTask'; import { ImmutableTaskList, Task, TaskId, TaskQueue } from './Queue/TaskQueue'; import { SendOnAdventureTask } from './Task/SendOnAdventureTask'; import { BalanceHeroResourcesTask } from './Task/BalanceHeroResourcesTask'; -import { ConsoleLogger, Logger } from './Logger'; +import { Logger } from './Logger'; import { BuildBuildingTask } from './Task/BuildBuildingTask'; import { GrabVillageState } from './Task/GrabVillageState'; import { ActionQueue, Action, ImmutableActionList } from './Queue/ActionQueue'; @@ -18,10 +18,10 @@ export class Scheduler { private actionQueue: ActionQueue; private logger: Logger; - constructor() { - this.taskQueue = new TaskQueue(); - this.actionQueue = new ActionQueue(); - this.logger = new ConsoleLogger(this.constructor.name); + constructor(taskQueue: TaskQueue, actionQueue: ActionQueue, logger: Logger) { + this.taskQueue = taskQueue; + this.actionQueue = actionQueue; + this.logger = logger; // this.taskQueue.push(GrabVillageState.name, {}, timestamp()); // this.taskQueue.push(UpdateResourceContracts.name, {}, timestamp()); diff --git a/src/index.js b/src/index.js index a640303..b6dcd24 100644 --- a/src/index.js +++ b/src/index.js @@ -1,26 +1,24 @@ import { ConsoleLogger } from './Logger'; import { ModeDetector } from './ModeDetector'; -import { Scheduler } from './Scheduler'; -import { Executor } from './Executor'; -import { ControlPanel } from './ControlPanel'; import TxtVersion from '!!raw-loader!./version.txt'; +import { Container } from './Container'; function main() { const logger = new ConsoleLogger('Travian'); logger.log('TRAVIAN AUTOMATION', TxtVersion); + const container = new Container(TxtVersion); const modeDetector = new ModeDetector(); - const scheduler = new Scheduler(); if (modeDetector.isAuto()) { modeDetector.setAuto(); logger.log('AUTO MANAGEMENT ON'); - const executor = new Executor(TxtVersion, scheduler); + const executor = container.executor; executor.run(); } else { logger.log('NORMAL MODE'); - const controlPanel = new ControlPanel(TxtVersion, scheduler); + const controlPanel = container.controlPanel; controlPanel.run(); } }