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 { uniqId } from '../utils';
|
||||||
import { ConsoleLogger, Logger } from '../Logger';
|
import { Logger } from '../Logger';
|
||||||
import { DataStorage } from '../DataStorage';
|
import { DataStorage } from '../DataStorage';
|
||||||
import { Args } from './Args';
|
import { Args } from './Args';
|
||||||
|
|
||||||
@ -39,13 +39,48 @@ type TaskList = Array<Task>;
|
|||||||
|
|
||||||
export type ImmutableTaskList = ReadonlyArray<Task>;
|
export type ImmutableTaskList = ReadonlyArray<Task>;
|
||||||
|
|
||||||
export class TaskQueue {
|
export interface TaskProvider {
|
||||||
private readonly logger: Logger;
|
getTasks(): TaskList;
|
||||||
|
setTasks(tasks: TaskList): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DataStorageTaskProvider implements TaskProvider {
|
||||||
private storage: DataStorage;
|
private storage: DataStorage;
|
||||||
|
|
||||||
constructor() {
|
constructor(storage: DataStorage) {
|
||||||
this.storage = new DataStorage(NAMESPACE);
|
this.storage = storage;
|
||||||
this.logger = new ConsoleLogger(this.constructor.name);
|
}
|
||||||
|
|
||||||
|
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 {
|
push(name: string, args: Args, ts: number): Task {
|
||||||
@ -105,21 +140,11 @@ export class TaskQueue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private getItems(): TaskList {
|
private getItems(): TaskList {
|
||||||
const serialized = this.storage.get(QUEUE_NAME);
|
return this.provider.getTasks();
|
||||||
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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private flushItems(items: TaskList): void {
|
private flushItems(items: TaskList): void {
|
||||||
const normalized = items.sort((x, y) => x.ts - y.ts || x.id.localeCompare(y.id));
|
items.sort((x, y) => x.ts - y.ts || x.id.localeCompare(y.id));
|
||||||
this.storage.set(QUEUE_NAME, normalized);
|
this.provider.setTasks(items);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ import { UpgradeBuildingTask } from './Task/UpgradeBuildingTask';
|
|||||||
import { ImmutableTaskList, Task, TaskId, TaskQueue } from './Queue/TaskQueue';
|
import { ImmutableTaskList, Task, TaskId, TaskQueue } from './Queue/TaskQueue';
|
||||||
import { SendOnAdventureTask } from './Task/SendOnAdventureTask';
|
import { SendOnAdventureTask } from './Task/SendOnAdventureTask';
|
||||||
import { BalanceHeroResourcesTask } from './Task/BalanceHeroResourcesTask';
|
import { BalanceHeroResourcesTask } from './Task/BalanceHeroResourcesTask';
|
||||||
import { ConsoleLogger, Logger } from './Logger';
|
import { Logger } from './Logger';
|
||||||
import { BuildBuildingTask } from './Task/BuildBuildingTask';
|
import { BuildBuildingTask } from './Task/BuildBuildingTask';
|
||||||
import { GrabVillageState } from './Task/GrabVillageState';
|
import { GrabVillageState } from './Task/GrabVillageState';
|
||||||
import { ActionQueue, Action, ImmutableActionList } from './Queue/ActionQueue';
|
import { ActionQueue, Action, ImmutableActionList } from './Queue/ActionQueue';
|
||||||
@ -18,10 +18,10 @@ export class Scheduler {
|
|||||||
private actionQueue: ActionQueue;
|
private actionQueue: ActionQueue;
|
||||||
private logger: Logger;
|
private logger: Logger;
|
||||||
|
|
||||||
constructor() {
|
constructor(taskQueue: TaskQueue, actionQueue: ActionQueue, logger: Logger) {
|
||||||
this.taskQueue = new TaskQueue();
|
this.taskQueue = taskQueue;
|
||||||
this.actionQueue = new ActionQueue();
|
this.actionQueue = actionQueue;
|
||||||
this.logger = new ConsoleLogger(this.constructor.name);
|
this.logger = logger;
|
||||||
|
|
||||||
// this.taskQueue.push(GrabVillageState.name, {}, timestamp());
|
// this.taskQueue.push(GrabVillageState.name, {}, timestamp());
|
||||||
// this.taskQueue.push(UpdateResourceContracts.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 { ConsoleLogger } from './Logger';
|
||||||
import { ModeDetector } from './ModeDetector';
|
import { ModeDetector } from './ModeDetector';
|
||||||
import { Scheduler } from './Scheduler';
|
|
||||||
import { Executor } from './Executor';
|
|
||||||
import { ControlPanel } from './ControlPanel';
|
|
||||||
import TxtVersion from '!!raw-loader!./version.txt';
|
import TxtVersion from '!!raw-loader!./version.txt';
|
||||||
|
import { Container } from './Container';
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
const logger = new ConsoleLogger('Travian');
|
const logger = new ConsoleLogger('Travian');
|
||||||
|
|
||||||
logger.log('TRAVIAN AUTOMATION', TxtVersion);
|
logger.log('TRAVIAN AUTOMATION', TxtVersion);
|
||||||
|
|
||||||
|
const container = new Container(TxtVersion);
|
||||||
const modeDetector = new ModeDetector();
|
const modeDetector = new ModeDetector();
|
||||||
const scheduler = new Scheduler();
|
|
||||||
|
|
||||||
if (modeDetector.isAuto()) {
|
if (modeDetector.isAuto()) {
|
||||||
modeDetector.setAuto();
|
modeDetector.setAuto();
|
||||||
logger.log('AUTO MANAGEMENT ON');
|
logger.log('AUTO MANAGEMENT ON');
|
||||||
const executor = new Executor(TxtVersion, scheduler);
|
const executor = container.executor;
|
||||||
executor.run();
|
executor.run();
|
||||||
} else {
|
} else {
|
||||||
logger.log('NORMAL MODE');
|
logger.log('NORMAL MODE');
|
||||||
const controlPanel = new ControlPanel(TxtVersion, scheduler);
|
const controlPanel = container.controlPanel;
|
||||||
controlPanel.run();
|
controlPanel.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user