From 666240dfb84ef94407306b9608ec61839bc5f8bb Mon Sep 17 00:00:00 2001 From: Kirill Ivlev Date: Wed, 13 Nov 2024 03:33:03 +0400 Subject: [PATCH] Versus fixes --- .../begin-versus-command.handler.ts | 13 +++++ src/game/commands/begin-versus.command.ts | 6 +++ src/game/entities/cards.entities.ts | 47 +++++++++++++++++-- src/game/entities/debuffs.consts.ts | 1 + src/game/game.module.ts | 9 +++- ...eck-if-another-versus-in-progress.query.ts | 3 ++ ...k-if-another-versus-in-progress.handler.ts | 13 +++++ src/game/versus/versus.service.ts | 10 +++- .../send-between-rounds-actions.command.ts | 2 +- .../handlers/get-guest-query.handler.ts | 1 - 10 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 src/game/comand-handlers/begin-versus-command.handler.ts create mode 100644 src/game/commands/begin-versus.command.ts create mode 100644 src/game/queries/check-if-another-versus-in-progress.query.ts create mode 100644 src/game/queries/handlers/check-if-another-versus-in-progress.handler.ts diff --git a/src/game/comand-handlers/begin-versus-command.handler.ts b/src/game/comand-handlers/begin-versus-command.handler.ts new file mode 100644 index 0000000..be114ef --- /dev/null +++ b/src/game/comand-handlers/begin-versus-command.handler.ts @@ -0,0 +1,13 @@ +import {CommandHandler, ICommandHandler} from "@nestjs/cqrs"; +import {BeginVersusCommand} from "../commands/begin-versus.command"; +import {VersusService} from "../versus/versus.service"; + +@CommandHandler(BeginVersusCommand) +export class BeginVersusCommandHandler implements ICommandHandler { + constructor(private versusService:VersusService) { + } + execute(command: BeginVersusCommand): Promise { + return this.versusService.beginVersus(command.sourceId,command.destinationId); + } + +} \ No newline at end of file diff --git a/src/game/commands/begin-versus.command.ts b/src/game/commands/begin-versus.command.ts new file mode 100644 index 0000000..6019beb --- /dev/null +++ b/src/game/commands/begin-versus.command.ts @@ -0,0 +1,6 @@ + +export class BeginVersusCommand { + constructor(public sourceId: number, public destinationId: number) { + + } +} \ No newline at end of file diff --git a/src/game/entities/cards.entities.ts b/src/game/entities/cards.entities.ts index a6751d2..27f2b44 100644 --- a/src/game/entities/cards.entities.ts +++ b/src/game/entities/cards.entities.ts @@ -19,8 +19,9 @@ import {SetGuestPropertyCommand} from "../../guests/command/set-guest-property.c import {StringHelper} from "../../helpers/stringhelper"; import {GetGuestQuery} from "../../guests/queries/getguest.query"; import {CardsSetChangedEvent} from "../events/cards-events/cards-set-changed.event"; -import {GetGuestPropertyQuery} from "../../guests/command/get-guest-property.handler"; import {GuestPropertiesConsts} from "../../schemas/properties.consts"; +import {BeginVersusCommand} from "../commands/begin-versus.command"; +import {CheckIfAnotherVersusInProgressQuery} from "../queries/check-if-another-versus-in-progress.query"; export interface IGameCard { setupHandlers(eventBus: EventBus, commandBus: CommandBus, queryBus: QueryBus): void; @@ -74,7 +75,7 @@ export class DoubleTreasureCard extends GameCard { await this.commandBus.execute( new GiveOutAPrizeCommand(this.telegramId), ); - const userSrc = await this.queryBus.execute(new GetGuestQuery(this.telegramId));; + const userSrc = await this.queryBus.execute(new GetGuestQuery(this.telegramId)); const subjcaseFrom = userSrc.get(StringHelper.getPropertyName(GuestPropertiesConsts.NameSubjectiveCase)); const message = `${subjcaseFrom} решает удвоить приз!`; await this.commandBus.execute(new SendToastCommand(message, 8000)); @@ -174,6 +175,45 @@ export class AvoidPenaltyCard extends GameCard { } } + +@Injectable() +export class VersusCard extends GameCard { + dealOnStart = true; + name = VersusCard.name; + chance = 10; + emoji = '🆚'; + description = 'Поединок'; + mightBePlayed = QuizAnswerStateEnum.betweenRounds; + async setupHandlers(eventBus: EventBus, commandBus: CommandBus, queryBus: QueryBus) { + super.setupHandlers(eventBus, commandBus, queryBus); + eventBus.pipe( + ofType(DebuffCardPlayedEvent), + filter(x => x.debufName == DebuffsConsts.versus)) + .subscribe(async (r) =>{ + const versusInProgress = await queryBus.execute(new CheckIfAnotherVersusInProgressQuery()); + this.logger.verbose(`versusInProgress ${versusInProgress}`); + if(versusInProgress) { + this.logger.warn(`another versus in progress`); + + return; + } + const destUser = await queryBus.execute(new GetGuestQuery(r.dest)) + const sourceUser = await queryBus.execute(new GetGuestQuery(r.from)); + await commandBus.execute(new BeginVersusCommand(sourceUser.telegramId, destUser.telegramId)); + }); + //eventBus.pipe(ofType(DebuffCardPlayedEvent)).subscribe(r => console.log(r)); + } + async handle() { + await this.commandBus.execute( + new SelectTargetPlayerCommand(this.telegramId, DebuffsConsts.versus, 0) + ) + await this.queryBus.execute(new FilterGuestsWithPropertyQuery(null,null,null)); + this.eventBus.subscribe((data) =>{ + this.logger.verbose(`Response from cmdBus: ${data}`); + }); + } +} + @Injectable() export class BanPlayer extends GameCard { dealOnStart = true; @@ -227,5 +267,6 @@ export const gameCards: typeof GameCard[] = [ ShitCard, LuckyCard, AvoidPenaltyCard, - BanPlayer + BanPlayer, + VersusCard, ]; diff --git a/src/game/entities/debuffs.consts.ts b/src/game/entities/debuffs.consts.ts index 50162fd..ffd14fd 100644 --- a/src/game/entities/debuffs.consts.ts +++ b/src/game/entities/debuffs.consts.ts @@ -1,3 +1,4 @@ export class DebuffsConsts { static bannedFor = 'bannedFor'; + static versus = 'versus'; } \ No newline at end of file diff --git a/src/game/game.module.ts b/src/game/game.module.ts index bbb4d25..3e55e32 100644 --- a/src/game/game.module.ts +++ b/src/game/game.module.ts @@ -20,6 +20,8 @@ import {GuestsModule} from "../guests/guests.module"; import { VersusService } from './versus/versus.service'; import { VersusController } from './versus/versus.controller'; import {Versus, VersusSchema} from "../schemas/versus.schema"; +import {BeginVersusCommandHandler} from "./comand-handlers/begin-versus-command.handler"; +import {CheckIfAnotherVersusInProgressHandler} from "./queries/handlers/check-if-another-versus-in-progress.handler"; const eventHandlers = [ @@ -37,8 +39,11 @@ const commandHandlers = [ GamePrizeChanceIncreasedEventHandler, GameProceedGameQueueCommandHandler, SelectTargetPlayerHandler, - SendBetweenRoundsActionsHandler + SendBetweenRoundsActionsHandler, + BeginVersusCommandHandler, ]; + +const queryHandlers = [CheckIfAnotherVersusInProgressHandler]; @Global() @Module({ imports: [ @@ -49,7 +54,7 @@ const commandHandlers = [ ]), forwardRef(() => GuestsModule) ], - providers: [GameService, ConfigService, ...eventHandlers, ...commandHandlers, VersusService], + providers: [GameService, ConfigService, ...eventHandlers, ...commandHandlers,...queryHandlers, VersusService], exports: [GameService], controllers: [GameController, VersusController], }) diff --git a/src/game/queries/check-if-another-versus-in-progress.query.ts b/src/game/queries/check-if-another-versus-in-progress.query.ts new file mode 100644 index 0000000..91b6288 --- /dev/null +++ b/src/game/queries/check-if-another-versus-in-progress.query.ts @@ -0,0 +1,3 @@ +export class CheckIfAnotherVersusInProgressQuery { + +} \ No newline at end of file diff --git a/src/game/queries/handlers/check-if-another-versus-in-progress.handler.ts b/src/game/queries/handlers/check-if-another-versus-in-progress.handler.ts new file mode 100644 index 0000000..6089b25 --- /dev/null +++ b/src/game/queries/handlers/check-if-another-versus-in-progress.handler.ts @@ -0,0 +1,13 @@ +import {IQueryHandler, QueryHandler} from "@nestjs/cqrs"; +import {CheckIfAnotherVersusInProgressQuery} from "../check-if-another-versus-in-progress.query"; +import {VersusService} from "../../versus/versus.service"; + +@QueryHandler(CheckIfAnotherVersusInProgressQuery) +export class CheckIfAnotherVersusInProgressHandler implements IQueryHandler { + constructor(private versusService: VersusService) { + } + async execute(query: CheckIfAnotherVersusInProgressHandler): Promise { + return await this.versusService.checkIfAnotherVersusInProgress(); + } + +} \ No newline at end of file diff --git a/src/game/versus/versus.service.ts b/src/game/versus/versus.service.ts index a607acc..b554d5f 100644 --- a/src/game/versus/versus.service.ts +++ b/src/game/versus/versus.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import {Injectable, Logger} from '@nestjs/common'; import {SocketEvents} from "../../shared/events.consts"; import {GuestsService} from "../../guests/guests.service"; import {SharedService} from "../../shared/shared.service"; @@ -14,6 +14,7 @@ import {IncreasePlayerWinningRateCommand} from "../commands/increase-player-winn export class VersusService { static configKeyCurrentAction = 'current_action'; static configKeyActiveVersus = 'active_versus'; + private logger = new Logger(VersusService.name); constructor( private guestService: GuestsService, private sharedService: SharedService, @@ -95,4 +96,11 @@ export class VersusService { return item; } + + async checkIfAnotherVersusInProgress() { + this.logger.debug(`checkIfAnotherVersusInProgress enter`) + const currentAction = await this.sharedService.getConfig(VersusService.configKeyCurrentAction); + return currentAction.value !== ''; + + } } diff --git a/src/guests/command/send-between-rounds-actions.command.ts b/src/guests/command/send-between-rounds-actions.command.ts index 5ef3973..292e312 100644 --- a/src/guests/command/send-between-rounds-actions.command.ts +++ b/src/guests/command/send-between-rounds-actions.command.ts @@ -3,7 +3,7 @@ import {Promise} from "mongoose"; import {GuestsService} from "../guests.service"; export class SendBetweenRoundsActionsCommand { - constructor(public user: number, public inline: boolean = false) { + constructor(public user: number, public inline: boolean = true) { } } diff --git a/src/guests/queries/handlers/get-guest-query.handler.ts b/src/guests/queries/handlers/get-guest-query.handler.ts index 247aaf6..d9c1883 100644 --- a/src/guests/queries/handlers/get-guest-query.handler.ts +++ b/src/guests/queries/handlers/get-guest-query.handler.ts @@ -1,6 +1,5 @@ import {IQueryHandler, QueryHandler} from "@nestjs/cqrs"; import {GetGuestQuery} from "../getguest.query"; -import {Promise} from "mongoose"; import {GuestsService} from "../../guests.service"; @QueryHandler(GetGuestQuery)