Use dependency container
This commit is contained in:
parent
d5f780197f
commit
cd7d9f0800
50
src/Container.ts
Normal file
50
src/Container.ts
Normal 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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
|
10
src/index.js
10
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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user