import { Command, Ctx, Hears, Start, Update, Sender, Help, On, Message, } from 'nestjs-telegraf'; import { UpdateType as TelegrafUpdateType } from 'telegraf/typings/telegram-types'; import { Context } from './context.interface'; import { ExtraReplyMessage } from 'telegraf/typings/telegram-types'; import { Markup } from 'telegraf'; import { QUIZ_SCENE, REGISTER_PHOTO_SCENE, REGISTER_SCENE_ID, } from './scenes/scenes.const'; import { Messages } from './tg.text'; import { GlobalCommands } from './global-commands'; import {Inject, Logger} from "@nestjs/common"; import AppConsts from "../constants"; import {ClientProxy} from "@nestjs/microservices"; import {catchError} from "rxjs"; @Update() export class BotUpdate { readonly numbers = Messages.answerNumbers; private readonly logger = new Logger(BotUpdate.name); constructor( @Inject(AppConsts.GameServiceName) private gameService: ClientProxy, private globalCmd: GlobalCommands, ) { } @Start() async startCommand(@Ctx() ctx: Context) { this.logger.verbose(`Sending GuestInfo to MQTT for ${ctx.message.from.first_name} / ${ctx.message.from.id}`); this.gameService.send({cmd: 'GuestInfo'}, {user: ctx.from.id}) .pipe(catchError((val) => { console.log(val); return 'Error'; }),) .subscribe(async (result) => { if (result) { await ctx.reply( `🤟 Все путем, ты уже зарегистрирован, расслабься и жди указаний\r\nМожет быть`, ); this.globalCmd.printCommands(ctx); } else { let reply = `👋 Привет, ${ctx.message.from.first_name}\\!\r\n`; reply += 'Я не вижу тебя в списке зарегистрированных участников, пройдем регистрацию?'; await ctx.replyWithMarkdownV2(reply, { reply_markup: { keyboard: [[{text: Messages.IM_IN}]], }, }); } }); } @Hears(Messages.IM_IN) async onRegisterCommand(@Ctx() ctx: Context): Promise { await ctx.scene.enter(REGISTER_SCENE_ID); } @Hears(Messages.GO) async onGoCommand(@Ctx() ctx: Context) { await ctx.scene.enter(QUIZ_SCENE); } @Command('photo') async onPhotoCommand(@Ctx() ctx: Context) { await ctx.scene.enter(REGISTER_PHOTO_SCENE); } @Command('cards') async onCardCommand(@Ctx() ctx: Context) { this.gameService.emit({ cmd: 'GetCards'}, { user: ctx.from.id, inline: false}); } @Command('question') async onQuestionCommand(@Ctx() ctx: Context) { this.gameService.emit({ cmd: 'GetQuestion'}, { 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 }) } } @On('callback_query') async onInlineQuery(@Ctx() ctx: any) { let data = undefined; try { data = JSON.parse(ctx.update.callback_query.data); } catch(error) { this.logger.verbose(`[onInlineQuery]: can't parse json callback, checking content for other payload`); } if(data) { this.gameService.emit({ cmd: 'ApplyDebuff'}, { ...ctx.callbackQuery, from: ctx.from.id }); await ctx.editMessageReplyMarkup(undefined); await ctx.editMessageText("ответ принят!"); } if(ctx.update.callback_query.message.text.indexOf('Внимание') !== -1) { const answer =ctx.update.callback_query.data; this.gameService.emit({ cmd: "QuestionAnswer"}, { user: ctx.from.id, answer: answer, name: ctx.from.first_name }); await ctx.editMessageReplyMarkup(undefined); await ctx.editMessageText("ответ принят!"); } else if(ctx.update.callback_query.data.startsWith('card/')) { const cardtoplay = ctx.update.callback_query.data.substring('card/'.length); this.gameService.emit({cmd: 'CardPlayed'}, {text: cardtoplay, user: ctx.update.callback_query.from.id}) await ctx.editMessageReplyMarkup(undefined); await ctx.editMessageText("карта выбрана"); } else { //console.log(ctx.update); } } @Hears(Messages.CHANGE_PHOTO) onChangePhoto(@Ctx() ctx: Context) { ctx.scene.enter(REGISTER_PHOTO_SCENE); } @On('text') async onMsg(@Message('text') msg: string, @Ctx() ctx: Context) { const chars = [...msg]; if (['1', '2', '3', '4'].includes(chars[0])) { ctx.scene.enter(QUIZ_SCENE, { answering: true }, false); } if (msg.includes(Messages.EMOJI_CARD)) { ctx.scene.enter(QUIZ_SCENE, { answering: true}, false); } } @On("callback_query") async onQuery(@Ctx() ctx: Context) { console.log(ctx); } } /* @Help() async helpCommand(@Ctx() ctx: Context) { await ctx.reply('ты пидор'); } @On('sticker') async onSticker(@Ctx() ctx: Context) { console.log(ctx.message.from); await ctx.reply('👍'); } */