Use dependency container

This commit is contained in:
Anton Vakhrushev 2020-04-29 20:30:26 +03:00
parent d5f780197f
commit cd7d9f0800
4 changed files with 103 additions and 30 deletions

50
src/Container.ts Normal file
View File

@ -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;
}
}

View File

@ -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<Task>;
export type ImmutableTaskList = ReadonlyArray<Task>;
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);
}
}

View File

@ -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());

View File

@ -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();
}
}