64 lines
2.4 KiB
TypeScript
64 lines
2.4 KiB
TypeScript
import {Injectable, Logger} from '@nestjs/common';
|
|
import {Cron} from '@nestjs/schedule';
|
|
import {StateService} from '../state/state.service';
|
|
import {QuizService} from '../quiz/quiz.service';
|
|
import {GiftsService} from '../gifts/gifts.service';
|
|
import {SharedService} from '../shared/shared.service';
|
|
import {FeatureflagService} from "../featureflag/featureflag.service";
|
|
import {FeatureFlagsConsts} from "../Consts/FeatureFlags.consts";
|
|
import {CommandBus} from "@nestjs/cqrs";
|
|
import {GameStateConsts} from "../Consts/game-state.consts";
|
|
import {IStateInfo} from "../Consts/types";
|
|
import {ClientNotificationType} from "../socket/socket.gateway";
|
|
|
|
@Injectable()
|
|
export class SchedulerService {
|
|
private readonly logger = new Logger(SchedulerService.name);
|
|
|
|
private state;
|
|
|
|
constructor(
|
|
private stateService: StateService,
|
|
private giftsService: GiftsService,
|
|
private quizService: QuizService,
|
|
private sharedService: SharedService,
|
|
private featureFlagService: FeatureflagService,
|
|
private commandBus: CommandBus,
|
|
) {}
|
|
|
|
@Cron('* * * * *')
|
|
async handleCron() {
|
|
await this.updateState();
|
|
}
|
|
|
|
|
|
|
|
async finishGame() {
|
|
if(await this.featureFlagService.getFeatureFlag(FeatureFlagsConsts.EnableEndgamePoints)) {
|
|
this.logger.verbose(`Feature flag ${FeatureFlagsConsts.EnableEndgamePoints} is enabled`);
|
|
const endgamePoints = await this.quizService.calculateEndgamePoints();
|
|
const state = await this.stateService.setState(GameStateConsts.Main, GameStateConsts.EndgamePoints);
|
|
this.sharedService.notifyAllClients<IStateInfo>(ClientNotificationType.StateChanged, state);
|
|
} else {
|
|
const state = await this.stateService.setState('main', 'finish');
|
|
this.sharedService.notifyAllClients<IStateInfo>(ClientNotificationType.StateChanged, state);
|
|
this.logger.warn(`Gifts is ended, finishing game`);
|
|
}
|
|
}
|
|
|
|
private async updateState() {
|
|
this.state = (await this.stateService.getState('main')).value;
|
|
this.logger.verbose(`Game state is: ${this.state}`);
|
|
}
|
|
@Cron('* * * * *')
|
|
async gameStatus() {
|
|
const giftsLeft = await this.giftsService.getRemainingPrizeCount();
|
|
if (giftsLeft === 0) {
|
|
await this.finishGame();
|
|
}
|
|
const questionsLeft = await this.quizService.getRemainQuestionCount();
|
|
this.logger.verbose(
|
|
`Gifts left ${giftsLeft}, Questions without answer: ${questionsLeft}`,
|
|
);
|
|
}
|
|
}
|