From 62d27e3fd6448fd07b934b7914d4d269ac37a81a Mon Sep 17 00:00:00 2001 From: soapintheeye Date: Wed, 28 Feb 2024 10:13:23 +0100 Subject: [PATCH] make state a Map of chat Ids with sessions --- src/Bot.ts | 4 +-- src/GrammyAdapter.ts | 44 ++++++++++++++++++++++++++---- src/HandleUserReponse.ts | 59 +++++++++++++++++++++++++++++++--------- src/Messages.ts | 46 +++++++++++++++---------------- src/State.ts | 6 ++-- 5 files changed, 109 insertions(+), 50 deletions(-) diff --git a/src/Bot.ts b/src/Bot.ts index 3b710b3..476d82c 100644 --- a/src/Bot.ts +++ b/src/Bot.ts @@ -11,7 +11,6 @@ if (!process.env.BOT_TOKEN) { export const bot = new Bot(process.env.BOT_TOKEN) bot.command('start', (ctx) => { - state.currentChatId = ctx.chat?.id ctx.reply(messages.welcomeMessage, { reply_markup: { keyboard: [[messages.exercise1, messages.help]], @@ -20,8 +19,7 @@ bot.command('start', (ctx) => { }) bot.on("message:text", (ctx) => { - state.currentChatId = ctx.msg.chat.id - handleResponse(state, ctx.message.text) + handleResponse(ctx.msg.chat.id, state, ctx.message.text) }) bot.start() diff --git a/src/GrammyAdapter.ts b/src/GrammyAdapter.ts index 7b6ee2a..42c443e 100644 --- a/src/GrammyAdapter.ts +++ b/src/GrammyAdapter.ts @@ -3,8 +3,8 @@ import { bot } from './Bot' import { state } from './State' import { Menu } from '@grammyjs/menu' -export function hideKeyboard() { - bot.api.sendMessage(state.currentChatId, messages.bye, { +export function hideKeyboard(chatId: number) { + bot.api.sendMessage(chatId, messages.bye, { reply_markup: { remove_keyboard: true, }, @@ -12,7 +12,8 @@ export function hideKeyboard() { } export function showFirstExercise(chatId: number) { - bot.api.sendMessage(chatId, messages.exercise1, { + const message = messages.exerciseTitle_1 + '\n' + messages.exerciseMessage_1 + bot.api.sendMessage(chatId, message, { reply_markup: { keyboard: [messages.exerciseOptions_1], }, @@ -20,7 +21,8 @@ export function showFirstExercise(chatId: number) { } export function showSecondExercise(chatId: number) { - bot.api.sendMessage(chatId, messages.exerciseTitle_2, { + const message = messages.exerciseTitle_2 + '\n' + messages.exerciseMessage_2 + bot.api.sendMessage(chatId, message, { reply_markup: { keyboard: [messages.exerciseOptions_2], }, @@ -28,7 +30,8 @@ export function showSecondExercise(chatId: number) { } export function showThirdExercise(chatId: number) { - bot.api.sendMessage(chatId, messages.exerciseTitle_3, { + const message = messages.exerciseTitle_3 + '\n' + messages.exerciseMessage_3 + bot.api.sendMessage(chatId, message, { reply_markup: { keyboard: [messages.exerciseOptions_3], }, @@ -36,13 +39,42 @@ export function showThirdExercise(chatId: number) { } export function showFourthExercise(chatId: number) { - bot.api.sendMessage(chatId, messages.exerciseTitle_4, { + const message = messages.exerciseTitle_4 + '\n' + messages.exerciseMessage_4 + bot.api.sendMessage(chatId, message, { reply_markup: { keyboard: [messages.exerciseOptions_4], }, }) } +export function showResults(chatId: number) { + const session = state.sessions.get(chatId) + const resulstString = `Итоги Сессии:\n` + + `Время: ${sessionTime()}\n` + + `Играет волна: ${session!.session.catchingThoughts}\n`+ + `Внутренняя Скорость: ${mapEnergyLevelToText(session!.session.energyLevel)}\n`+ + `Внутренний Компас: ${session!.session.compass}\n`+ + 'Увидимся через пару часов' + bot.api.sendMessage(chatId, resulstString) +} + +function mapEnergyLevelToText(energyLevel: string) { + switch (energyLevel) { + case '+1': + return 'много энергии' + case '0': + return 'внутренний покой' + case '-1': + return 'мало энергии' + default: + return 'ошибка' + } +} + +function sessionTime() { + return new Date().toLocaleTimeString() +} + export const startMenu = new Menu("startMenu") .text(messages.welcomeButton, handleBeginFirstExercise).row() diff --git a/src/HandleUserReponse.ts b/src/HandleUserReponse.ts index 9cb14c2..21da5e3 100644 --- a/src/HandleUserReponse.ts +++ b/src/HandleUserReponse.ts @@ -1,14 +1,19 @@ -import { hideKeyboard, showFirstExercise, showFourthExercise, showSecondExercise, showThirdExercise } from './GrammyAdapter' +import { hideKeyboard, showFirstExercise, showFourthExercise, showResults, showSecondExercise, showThirdExercise } from './GrammyAdapter' import { messages } from './Messages' +type ChatId = number + export type BotState = { - currentExercise: number - currentChatId: number - session: SessionAnswers | undefined, + sessions: Map, } export type SessionAnswers = { catchingThoughts: 'Думаю о себе' | 'Думаю о ком-то' | 'Думаю о делах' | 'Волна тишины', + balanceCoin: 'Да', energyLevel: '+1' | '0' | '-1', compass: 'Созерцание [Развитие]' | 'Поддержание [Сохранение]' | 'Разрушение [Износ]' | 'Наблюдение [Невмешательство]', } @@ -18,28 +23,56 @@ export const STATE_STAGE = { SECOND_EXERCISE: 2, THIRD_EXERCISE: 3, FOURTH_EXERCISE: 4, + SHOW_RESULTS: 5, } as const -export function handleResponse(state: BotState, message: string) { +export function handleResponse(chatId: number, state: BotState, message: string) { + let session = state.sessions.get(chatId) + + if (!session) { + session = { + currentExercise: 0, + currentChatId: chatId, + session: { + catchingThoughts: 'Думаю о себе', + balanceCoin: 'Да', + energyLevel: '+1', + compass: 'Созерцание [Развитие]' + } + } + state.sessions.set(chatId, session) + } + if (message === messages.exit) { - state.currentExercise = 0 - hideKeyboard() + state.sessions.delete(chatId) + hideKeyboard(chatId) return } - state.currentExercise++ - switch (state.currentExercise) { + session.currentExercise++ + switch (session.currentExercise) { case STATE_STAGE.FIRST_EXERCISE: - showFirstExercise(state.currentChatId) + showFirstExercise(session.currentChatId) break case STATE_STAGE.SECOND_EXERCISE: - showSecondExercise(state.currentChatId) + if (session) { + session.session.catchingThoughts = message as SessionAnswers['catchingThoughts'] + } + showSecondExercise(session.currentChatId) break case STATE_STAGE.THIRD_EXERCISE: - showThirdExercise(state.currentChatId) + session.session.balanceCoin = message as SessionAnswers['balanceCoin'] + showThirdExercise(session.currentChatId) break case STATE_STAGE.FOURTH_EXERCISE: - showFourthExercise(state.currentChatId) + session.session.compass = message as SessionAnswers['compass'] + showFourthExercise(session.currentChatId) + break + case STATE_STAGE.SHOW_RESULTS: + session.session.compass = message as SessionAnswers['compass'] + showResults(session.currentChatId) + session.currentExercise = 0 + hideKeyboard(chatId) break } } diff --git a/src/Messages.ts b/src/Messages.ts index 6a83790..26683e9 100644 --- a/src/Messages.ts +++ b/src/Messages.ts @@ -1,42 +1,40 @@ export const messages = { - welcomeMessage: "Это приложение ЧВКР." - + " Оно сделано для того, чтобы помогать поддерживать баланс." - + " Чтобы упростить процесс, мы будем каждые 2 часа присылать уведомление и напоминать об упражнениях." - + "Убедитесь, что уведомления включены в настройках." - + " Чтобы начать заниматься, нажмите клавишу \"Упражнение 1\" ниже", + welcomeMessage: "Это приложение ЧВКР.\n" + + "Оно сделано для того, чтобы помогать поддерживать баланс." + ' ' + + + "Чтобы упростить процесс, мы будем каждые 2 часа присылать уведомление и напоминать об упражнениях." + ' ' + + + "Убедитесь, что уведомления включены в настройках.\n" + + "Чтобы начать заниматься, нажмите клавишу \"Упражнение 1\" ниже", welcomeButton: "Упражнение 1", exercise1: "Упражнение 1", - exerciseTitle_1: 'Упражнение 1. "Ловим Мысли".', + exerciseTitle_1: 'Упражнение 1. "Ловим Мысли"', exerciseMessage_1: 'Какая волна радио играет сейчас? \nВыберите наиболее резонирующий в данный момент ответ:', exerciseOptions_1: ['Думаю о себе', 'Думаю о ком-то', 'Думаю о делах', 'Волна тишины', 'Выход'], exercise2: "Упражнение 2", - exerciseTitle_2: 'Упражнение 2. Монетка на лоб.', + exerciseTitle_2: 'Упражнение 2. "Монетка на лоб"', exerciseMessage_2: 'Базовое упражнение баланса, развивающее технику инертивного отключения сознания.' - + ' Выберите наиболее резонирующий в данный момент ответ:', + + ' Нажмите "Да", когда монетка окажется на Вашем лбу в районе 3-го глаза. К сожалению, суперклей использовать нельзя.', exerciseOptions_2: ['Дa', 'Выход'], exercise3: "Упражнение 3", - exerciseTitle_3: 'Упражнение 3. Внутренняя Скорость.', - exerciseMessage_3: 'Диапазон значений:' - + '+1 [много энергии, много чего хочется]' - + '0 [внутренний покой]' - + '-1 [мало энергии, ничего не хочется]' - + 'Какая внутренняя скорость у Вас прямо сейчас?' - + ' Выберите наиболее резонирующий в данный момент ответ:', + exerciseTitle_3: 'Упражнение 3. "Внутренняя Скорость"', + exerciseMessage_3: 'Диапазон значений:\n' + + '+1 [много энергии, много чего хочется]\n' + + '0 [внутренний покой]\n' + + '-1 [мало энергии, ничего не хочется]\n' + + 'Какая внутренняя скорость у Вас прямо сейчас?', exerciseOptions_3: ['+1 [много энергии]', '0 [внутренний покой]', '-1 [мало энергии]'], exercise4: "Упражнение 4", - exerciseTitle_4: 'Упражнение 4. Внутренний Компас.', - exerciseMessage_4: 'Внутренний Компас - инструмент' - + 'Вашего проявления в реальности. У него могут быть такие разновидности:' - + 'Созерцание (Развитие)' - + 'Наблюдение (Невмешательство)' - + 'Поддержание' - + 'Разрушение' - + 'Куда сейчас смотрит стрелка Вашего компаса?' - + ' Выберите наиболее резонирующий в данный момент ответ:', + exerciseTitle_4: 'Упражнение 4. "Внутренний Компас"', + exerciseMessage_4: 'Внутренний Компас - инструмент Вашего проявления в реальности.\n' + + 'У него могут быть такие разновидности:\n' + + 'Созерцание (Развитие)\n' + + 'Наблюдение (Невмешательство)\n' + + 'Поддержание\n' + + 'Разрушение\n' + + 'Куда сейчас смотрит стрелка Вашего компаса?', exerciseOptions_4: ['Созерцание [Развитие]', 'Поддержание [Сохранение]', 'Разрушение [Износ]', 'Наблюдение [Невмешательство]'], diff --git a/src/State.ts b/src/State.ts index 1a60d07..a225a8f 100644 --- a/src/State.ts +++ b/src/State.ts @@ -1,7 +1,5 @@ -import { BotState } from './HandleUserReponse' +import { BotState, SessionAnswers } from './HandleUserReponse' export const state: BotState = { - currentExercise: 0, - currentChatId: 0, - session: undefined + sessions: new Map(), }