Skip to content

Commit

Permalink
make state a Map of chat Ids with sessions
Browse files Browse the repository at this point in the history
  • Loading branch information
opiruyan committed Feb 28, 2024
1 parent 66e23c0 commit 62d27e3
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 50 deletions.
4 changes: 1 addition & 3 deletions src/Bot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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]],
Expand All @@ -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()
Expand Down
44 changes: 38 additions & 6 deletions src/GrammyAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,46 +3,78 @@ 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,
},
})
}

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],
},
})
}

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],
},
})
}

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],
},
})
}

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()

Expand Down
59 changes: 46 additions & 13 deletions src/HandleUserReponse.ts
Original file line number Diff line number Diff line change
@@ -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<ChatId, {
currentExercise: number
currentChatId: number
session: SessionAnswers,
}>,
}

export type SessionAnswers = {
catchingThoughts: 'Думаю о себе' | 'Думаю о ком-то' | 'Думаю о делах' | 'Волна тишины',
balanceCoin: 'Да',
energyLevel: '+1' | '0' | '-1',
compass: 'Созерцание [Развитие]' | 'Поддержание [Сохранение]' | 'Разрушение [Износ]' | 'Наблюдение [Невмешательство]',
}
Expand All @@ -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
}
}
46 changes: 22 additions & 24 deletions src/Messages.ts
Original file line number Diff line number Diff line change
@@ -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: ['Созерцание [Развитие]', 'Поддержание [Сохранение]', 'Разрушение [Износ]', 'Наблюдение [Невмешательство]'],


Expand Down
6 changes: 2 additions & 4 deletions src/State.ts
Original file line number Diff line number Diff line change
@@ -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(),
}

0 comments on commit 62d27e3

Please sign in to comment.