diff --git a/src/hh/bot-commands.ts b/src/hh/bot-commands.ts index e7735b1..1f1190b 100644 --- a/src/hh/bot-commands.ts +++ b/src/hh/bot-commands.ts @@ -3,7 +3,7 @@ import bot from '@bot' import prisma from '@prisma' import cron, { type ScheduledTask } from 'node-cron' import { applyToJobs, checkIsAuth, listResumes, login, NoResumeError, saveResume } from './scraper.js' -import { BACK_MARKUP, BTN, createStatusReporter, escapeHtml, LOGIN_REPLY_KEYBOARD, MAIN_REPLY_KEYBOARD, NO_RESUME_MARKUP, safeEdit } from './ui.js' +import { BACK_MARKUP, BTN, createStatusReporter, escapeHtml, INFO_REPLY_KEYBOARD, LOGIN_REPLY_KEYBOARD, MAIN_REPLY_KEYBOARD, NO_RESUME_MARKUP, safeEdit, SETTINGS_REPLY_KEYBOARD } from './ui.js' interface UserState { autoCron: ScheduledTask | null @@ -397,26 +397,33 @@ export function registerHHCommands() { await bot.sendMessage(chatId, '🔢 Введи максимальное количество откликов (1-50):') break - case BTN.AUTO_ON: { + case BTN.AUTO_TOGGLE: { const s = getState(chatId) if (s.autoCron) { - await bot.sendMessage(chatId, '⚠️ Авто уже запущено') - break + s.autoCron.stop() + s.autoCron = null + await bot.sendMessage(chatId, '⛔ Авто остановлен', { reply_markup: SETTINGS_REPLY_KEYBOARD }) + } + else { + s.autoCron = cron.schedule('0 10 * * 1-5', async () => { + await bot.sendMessage(chatId, '⏰ Авто-отклик...') + }) + await bot.sendMessage(chatId, '✅ Авто включён (пн-пт, 10:00)', { reply_markup: SETTINGS_REPLY_KEYBOARD }) } - s.autoCron = cron.schedule('0 10 * * 1-5', async () => { - await bot.sendMessage(chatId, '⏰ Авто-отклик...') - }) - await bot.sendMessage(chatId, '✅ Авто включён (пн-пт, 10:00)') break } - case BTN.AUTO_OFF: { - const s = getState(chatId) - s.autoCron?.stop() - s.autoCron = null - await bot.sendMessage(chatId, '⛔ Авто остановлен') + case BTN.SETTINGS: + await bot.sendMessage(chatId, '⚙️ Настройки:', { reply_markup: SETTINGS_REPLY_KEYBOARD }) + break + + case BTN.INFO: + await bot.sendMessage(chatId, 'ℹ️ Информация:', { reply_markup: INFO_REPLY_KEYBOARD }) + break + + case BTN.BACK: + await bot.sendMessage(chatId, '🤖 HH Auto-Apply', { reply_markup: MAIN_REPLY_KEYBOARD }) break - } case BTN.LOGIN: await handleLogin(chatId) diff --git a/src/hh/ui.ts b/src/hh/ui.ts index e75ac14..cf16126 100644 --- a/src/hh/ui.ts +++ b/src/hh/ui.ts @@ -4,13 +4,15 @@ export const BTN = { APPLY: '🚀 Откликнуться', STATUS: '⚙️ Статус', QUERY: '🔍 Изменить запрос', - MAX: '🔢 Макс откликов', - AUTO_ON: '⏰ Авто вкл', - AUTO_OFF: '⛔ Авто выкл', + MAX: '🔢 Макс. откликов', + AUTO_TOGGLE: '⏰ Авто', LOGIN: '🔑 Войти на hh.ru', RESUME_LIST: '📄 Выбрать резюме', MY_RESUME: '📋 Моё резюме', - SKIPPED: '🚫 Проблемные', + SKIPPED: '🚫 Проблемные вакансии', + SETTINGS: '⚙️ Настройки', + INFO: 'ℹ️ Информация', + BACK: '◀️ Назад', } as const export const LOGIN_REPLY_KEYBOARD = { @@ -21,11 +23,29 @@ export const LOGIN_REPLY_KEYBOARD = { export const MAIN_REPLY_KEYBOARD = { keyboard: [ - [{ text: BTN.APPLY }, { text: BTN.STATUS }], - [{ text: BTN.QUERY }, { text: BTN.MAX }], - [{ text: BTN.AUTO_ON }, { text: BTN.AUTO_OFF }], - [{ text: BTN.LOGIN }, { text: BTN.RESUME_LIST }], - [{ text: BTN.MY_RESUME }, { text: BTN.SKIPPED }], + [{ text: BTN.APPLY }], + [{ text: BTN.SETTINGS }, { text: BTN.INFO }], + ], + resize_keyboard: true, + persistent: true, +} + +export const SETTINGS_REPLY_KEYBOARD = { + keyboard: [ + [{ text: BTN.MAX }, { text: BTN.QUERY }], + [{ text: BTN.AUTO_TOGGLE }, { text: BTN.RESUME_LIST }], + [{ text: BTN.LOGIN }], + [{ text: BTN.BACK }], + ], + resize_keyboard: true, + persistent: true, +} + +export const INFO_REPLY_KEYBOARD = { + keyboard: [ + [{ text: BTN.STATUS }, { text: BTN.MY_RESUME }], + [{ text: BTN.SKIPPED }], + [{ text: BTN.BACK }], ], resize_keyboard: true, persistent: true, @@ -54,8 +74,9 @@ export async function safeEdit( if (e instanceof Error && ( e.message.includes('message is not modified') || e.message.includes('message to edit not found') - )) + )) { return + } throw e }) }