import { Command, Ctx, Message, On, Scene, SceneEnter } from 'nestjs-telegraf'; import { QUIZ_SCENE } from './scenes.const'; import { GlobalCommands } from '../global-commands'; import {Inject, Logger} from '@nestjs/common'; import { Messages } from '../tg.text'; import {Context} from "../context.interface"; import AppConsts from "../../constants"; import {ClientProxy} from "@nestjs/microservices"; @Scene(QUIZ_SCENE) export class QuizScene { private readonly logger = new Logger(QuizScene.name); constructor( private globalCmd: GlobalCommands, @Inject(AppConsts.GameServiceName) private gameService: ClientProxy, ) {} @SceneEnter() async onSceneEnter(@Ctx() ctx: Context, @Message('text') text: string) { if (ctx.session.__scenes.state.hasOwnProperty('answering')) { return this.onText(text, ctx); } await ctx.reply( 'Ответы на вопросы будут появляться туть, кто первый тот победил', ); } @Command('leave') async onLeaveScene(@Ctx() ctx: Context) { await ctx.scene.leave(); } @Command('cards') async onCardCommand(@Ctx() ctx: Context) { this.logger.verbose(`cards command (quiz)`); this.gameService.emit({ cmd: 'GetCards'}, { user: ctx.from.id, inline: false}); } @Command('next') async onNextCommand(@Ctx() ctx: Context) { if(ctx.from.id === 11178819) { this.gameService.emit({ cmd: 'CompleteQueue'}, { user: ctx.from.id }) } } @Command('start') async onCommandStart(@Ctx() ctx: Context) { await ctx.scene.leave(); this.globalCmd.printCommands(ctx); } @On('callback_query') async onInlineQuery(@Ctx() ctx: Context) { this.gameService.emit({ cmd: 'ApplyDebuff'}, { ...ctx.callbackQuery, from: ctx.from.id }); this.logger.verbose(`emit callback for ${ctx.callbackQuery}`); } @On('text') async onText(@Message('text') text: string, @Ctx() ctx: Context) { console.log(text); //console.log(JSON.stringify(ctx)); if(text.startsWith('/')) { await ctx.scene.leave(); return; } if (text.includes(Messages.EMOJI_CARD)) { this.gameService.emit({ cmd: 'CardPlayed'}, { text, user: ctx.message.from.id }) return; } if (text.includes(Messages.EMOJI_PLAYER)) { this.gameService.emit({ cmd: 'PLayerSelected' }, { text, user: ctx.message.from.id }); return; } this.logger.verbose(`Answer from: ${ctx.message.from.first_name}, validating`); this.gameService.send( { cmd: 'ValidateAnswer'}, { answer: text, user: ctx.message.from.id, name: ctx.message.from.first_name }) .subscribe( (res) => { if(res.valid) { ctx.replyWithMarkdownV2('Верно', { reply_markup: { remove_keyboard: true, }, }); return; } ctx.replyWithMarkdownV2('Ответ неверный', { reply_markup: { remove_keyboard: true, }, }); } ) } }