diff --git a/src/bots/factory/bots/approved/index.ts b/src/bots/factory/bots/approved/index.ts index 3c50288..a4a07fd 100644 --- a/src/bots/factory/bots/approved/index.ts +++ b/src/bots/factory/bots/approved/index.ts @@ -13,7 +13,7 @@ import * as CallbackData from "./callback_data"; import * as BookLibrary from "./services/book_library"; import { createOrUpdateUserSettings, getUserSettings } from './services/user_settings'; import { formatBook, formatAuthor, formatSequence, formatTranslator } from './format'; -import { getPaginatedMessage, registerLanguageSettingsCallback, registerPaginationCommand, registerRandomItemCallback } from './utils'; +import { getCallbackArgs, getPaginatedMessage, getPrefixWithQueryCreator, getSearchArgs, registerLanguageSettingsCallback, registerPaginationCommand, registerRandomItemCallback } from './utils'; import { getRandomKeyboard, getTextPaginationData, getUpdateLogKeyboard, getUserAllowedLangsKeyboard } from './keyboard'; import { sendFile } from './hooks/downloading'; import { setCommands } from './hooks/setCommands'; @@ -64,14 +64,14 @@ export async function createApprovedBot(token: string, state: BotState): Promise bot.command(["help", `help@${me.username}`], async (ctx: Context) => ctx.reply(Messages.HELP_MESSAGE)); - registerPaginationCommand(bot, CallbackData.SEARCH_BOOK_PREFIX, BookLibrary.searchByBookName, formatBook); - registerPaginationCommand(bot, CallbackData.SEARCH_TRANSLATORS_PREFIX, BookLibrary.searchTranslators, formatTranslator); - registerPaginationCommand(bot, CallbackData.SEARCH_AUTHORS_PREFIX, BookLibrary.searchAuthors, formatAuthor); - registerPaginationCommand(bot, CallbackData.SEARCH_SERIES_PREFIX, BookLibrary.searchSequences, formatSequence); + registerPaginationCommand(bot, CallbackData.SEARCH_BOOK_PREFIX, getSearchArgs, null, BookLibrary.searchByBookName, formatBook); + registerPaginationCommand(bot, CallbackData.SEARCH_TRANSLATORS_PREFIX, getSearchArgs, null, BookLibrary.searchTranslators, formatTranslator); + registerPaginationCommand(bot, CallbackData.SEARCH_AUTHORS_PREFIX, getSearchArgs, null, BookLibrary.searchAuthors, formatAuthor); + registerPaginationCommand(bot, CallbackData.SEARCH_SERIES_PREFIX, getSearchArgs, null, BookLibrary.searchSequences, formatSequence); - registerPaginationCommand(bot, CallbackData.AUTHOR_BOOKS_PREFIX, BookLibrary.getAuthorBooks, formatBook); - registerPaginationCommand(bot, CallbackData.TRANSLATOR_BOOKS_PREFIX, BookLibrary.getTranslatorBooks, formatBook); - registerPaginationCommand(bot, CallbackData.SEQUENCE_BOOKS_PREFIX, BookLibrary.getSequenceBooks, formatBook); + registerPaginationCommand(bot, CallbackData.AUTHOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.AUTHOR_BOOKS_PREFIX), BookLibrary.getAuthorBooks, formatBook); + registerPaginationCommand(bot, CallbackData.TRANSLATOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.TRANSLATOR_BOOKS_PREFIX), BookLibrary.getTranslatorBooks, formatBook); + registerPaginationCommand(bot, CallbackData.SEQUENCE_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.SEQUENCE_BOOKS_PREFIX), BookLibrary.getSequenceBooks, formatBook); bot.command(["random", `random@${me.username}`], async (ctx: Context) => { ctx.reply("Что хотим получить?", { @@ -248,7 +248,7 @@ export async function createApprovedBot(token: string, state: BotState): Promise const userSettings = await getUserSettings(ctx.message.from.id); const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code); - const pMessage = await getPaginatedMessage(CallbackData.AUTHOR_BOOKS_PREFIX, parseInt(authorId), 1, allowedLangs, BookLibrary.getAuthorBooks, formatBook); + const pMessage = await getPaginatedMessage(`${CallbackData.AUTHOR_BOOKS_PREFIX}${authorId}_`, parseInt(authorId), 1, allowedLangs, BookLibrary.getAuthorBooks, formatBook); await ctx.reply(pMessage.message, { reply_markup: pMessage.keyboard.reply_markup @@ -265,7 +265,7 @@ export async function createApprovedBot(token: string, state: BotState): Promise const userSettings = await getUserSettings(ctx.message.from.id); const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code); - const pMessage = await getPaginatedMessage(CallbackData.TRANSLATOR_BOOKS_PREFIX, parseInt(translatorId), 1, allowedLangs, BookLibrary.getTranslatorBooks, formatBook); + const pMessage = await getPaginatedMessage(`${CallbackData.TRANSLATOR_BOOKS_PREFIX}${translatorId}_`, parseInt(translatorId), 1, allowedLangs, BookLibrary.getTranslatorBooks, formatBook); await ctx.reply(pMessage.message, { reply_markup: pMessage.keyboard.reply_markup @@ -282,7 +282,7 @@ export async function createApprovedBot(token: string, state: BotState): Promise const userSettings = await getUserSettings(ctx.message.from.id); const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code); - const pMessage = await getPaginatedMessage(CallbackData.SEQUENCE_BOOKS_PREFIX, parseInt(sequenceId), 1, allowedLangs, BookLibrary.getSequenceBooks, formatBook); + const pMessage = await getPaginatedMessage(`${CallbackData.SEQUENCE_BOOKS_PREFIX}${sequenceId}_`, parseInt(sequenceId), 1, allowedLangs, BookLibrary.getSequenceBooks, formatBook); await ctx.reply(pMessage.message, { reply_markup: pMessage.keyboard.reply_markup @@ -294,20 +294,18 @@ export async function createApprovedBot(token: string, state: BotState): Promise return; } - const query = ctx.message.text.replaceAll("_", " ").substring(0, 64 - 7).toLowerCase(); - let keyboard = Markup.inlineKeyboard([ [ - Markup.button.callback('Книгу', `${CallbackData.SEARCH_BOOK_PREFIX}${query}_1`) + Markup.button.callback('Книгу', `${CallbackData.SEARCH_BOOK_PREFIX}1`) ], [ - Markup.button.callback('Автора', `${CallbackData.SEARCH_AUTHORS_PREFIX}${query}_1`), + Markup.button.callback('Автора', `${CallbackData.SEARCH_AUTHORS_PREFIX}1`), ], [ - Markup.button.callback('Серию', `${CallbackData.SEARCH_SERIES_PREFIX}${query}_1`), + Markup.button.callback('Серию', `${CallbackData.SEARCH_SERIES_PREFIX}1`), ], [ - Markup.button.callback('Переводчика', `${CallbackData.SEARCH_TRANSLATORS_PREFIX}${query}_1`), + Markup.button.callback('Переводчика', `${CallbackData.SEARCH_TRANSLATORS_PREFIX}1`), ] ]); diff --git a/src/bots/factory/bots/approved/keyboard.ts b/src/bots/factory/bots/approved/keyboard.ts index 2f592ec..64123f9 100644 --- a/src/bots/factory/bots/approved/keyboard.ts +++ b/src/bots/factory/bots/approved/keyboard.ts @@ -21,10 +21,10 @@ export function getPaginationKeyboard(prefix: string, query: string | number, pa const row = []; if (page - delta > 0) { - row.push(Markup.button.callback(getButtonLabel(delta, 'left'), `${prefix}${query}_${page - delta}`)); + row.push(Markup.button.callback(getButtonLabel(delta, 'left'), `${prefix}${page - delta}`)); } if (page + delta <= totalPages) { - row.push(Markup.button.callback(getButtonLabel(delta, 'right'), `${prefix}${query}_${page + delta}`)); + row.push(Markup.button.callback(getButtonLabel(delta, 'right'), `${prefix}${page + delta}`)); } return row; diff --git a/src/bots/factory/bots/approved/services/book_library.ts b/src/bots/factory/bots/approved/services/book_library.ts index ee2c6f7..1f4c593 100644 --- a/src/bots/factory/bots/approved/services/book_library.ts +++ b/src/bots/factory/bots/approved/services/book_library.ts @@ -173,7 +173,7 @@ export async function getAuthorAnnotation(authorId: number): Promise> { +export async function getAuthorBooks(authorId: number | string, page: number, allowedLangs: string[]): Promise> { const searchParams = getAllowedLangsSearchParams(allowedLangs); searchParams.append('page', page.toString()); searchParams.append('size', PAGE_SIZE.toString()); @@ -182,7 +182,7 @@ export async function getAuthorBooks(authorId: number, page: number, allowedLang } -export async function getTranslatorBooks(translatorId: number, page: number, allowedLangs: string[]): Promise> { +export async function getTranslatorBooks(translatorId: number | string, page: number, allowedLangs: string[]): Promise> { const searchParams = getAllowedLangsSearchParams(allowedLangs); searchParams.append('page', page.toString()); searchParams.append('size', PAGE_SIZE.toString()); @@ -191,7 +191,7 @@ export async function getTranslatorBooks(translatorId: number, page: number, all } -export async function getSequenceBooks(sequenceId: number, page: number, allowedLangs: string[]): Promise> { +export async function getSequenceBooks(sequenceId: number | string, page: number, allowedLangs: string[]): Promise> { const searchParams = getAllowedLangsSearchParams(allowedLangs); searchParams.append('page', page.toString()); searchParams.append('size', PAGE_SIZE.toString()); diff --git a/src/bots/factory/bots/approved/utils.ts b/src/bots/factory/bots/approved/utils.ts index 16bbd37..fbbea45 100644 --- a/src/bots/factory/bots/approved/utils.ts +++ b/src/bots/factory/bots/approved/utils.ts @@ -35,21 +35,29 @@ export async function getPaginatedMessage( } -export function registerPaginationCommand( +export function registerPaginationCommand( bot: Telegraf, prefix: string, - itemsGetter: (data: any, page: number, allowedLangs: string[]) => Promise>, + argsGetter: (ctx: Context) => { query: Q, page: number } | null, + prefixCreator: ((query: Q) => string) | null, + itemsGetter: (data: Q, page: number, allowedLangs: string[]) => Promise>, itemFormater: (item: T) => string, ) { bot.action(new RegExp(prefix), async (ctx: Context) => { - if (!ctx.callbackQuery || !('data' in ctx.callbackQuery)) return; + if (!ctx.callbackQuery) return; - const [_, query, sPage] = ctx.callbackQuery.data.split('_'); + const args = argsGetter(ctx); + + if (args === null) return; + + const { query, page } = args; const userSettings = await getUserSettings(ctx.callbackQuery.from.id); const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code); - const pMessage = await getPaginatedMessage(prefix, query, parseInt(sPage), allowedLangs, itemsGetter, itemFormater); + const tPrefix = prefixCreator ? prefixCreator(query) : prefix; + + const pMessage = await getPaginatedMessage(tPrefix, query, page, allowedLangs, itemsGetter, itemFormater); try { await ctx.editMessageText(pMessage.message, { @@ -137,3 +145,58 @@ export function getAllowedLangsSearchParams(allowedLangs: string[]): URLSearchPa allowedLangs.forEach((lang) => sp.append('allowed_langs', lang)); return sp; } + + +const fail = (ctx: Context) => ctx.reply("Ошибка! Повторите поиск :("); + + +export function getSearchArgs(ctx: Context): { query: string, page: number } | null { + if (!ctx.callbackQuery || !('data' in ctx.callbackQuery)) { + fail(ctx) + return null; + } + if (!ctx.callbackQuery.message || !('reply_to_message' in ctx.callbackQuery.message)) { + fail(ctx); + return null; + } + + if (!ctx.callbackQuery.message.reply_to_message || !('text' in ctx.callbackQuery.message.reply_to_message)) { + fail(ctx) + return null; + } + + const page = parseInt(ctx.callbackQuery.data.split('_')[1]); + + if (isNaN(page)) { + fail(ctx) + return null; + } + + const query = ctx.callbackQuery.message.reply_to_message.text; + + return { query, page }; +} + +export function getCallbackArgs(ctx: Context): { query: string, page: number} | null { + if (!ctx.callbackQuery || !('data' in ctx.callbackQuery)) { + fail(ctx) + return null; + } + + const [ _, query, sPage ] = ctx.callbackQuery.data.split('_'); + + console.log(_, query, sPage); + + const page = parseInt(sPage); + + if (isNaN(page)) { + fail(ctx) + return null; + } + + return { query, page }; +} + +export function getPrefixWithQueryCreator(prefix: string) { + return (query: string) => `${prefix}${query}_`; +}