Fix large queries

This commit is contained in:
2022-01-29 16:42:08 +03:00
parent 279ed0dd4b
commit 9ceb6ed350
4 changed files with 88 additions and 27 deletions

View File

@@ -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`),
]
]);

View File

@@ -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;

View File

@@ -173,7 +173,7 @@ export async function getAuthorAnnotation(authorId: number): Promise<AuthorAnnno
}
export async function getAuthorBooks(authorId: number, page: number, allowedLangs: string[]): Promise<Page<AuthorBook>> {
export async function getAuthorBooks(authorId: number | string, page: number, allowedLangs: string[]): Promise<Page<AuthorBook>> {
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<Page<AuthorBook>> {
export async function getTranslatorBooks(translatorId: number | string, page: number, allowedLangs: string[]): Promise<Page<AuthorBook>> {
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<Page<Book>> {
export async function getSequenceBooks(sequenceId: number | string, page: number, allowedLangs: string[]): Promise<Page<Book>> {
const searchParams = getAllowedLangsSearchParams(allowedLangs);
searchParams.append('page', page.toString());
searchParams.append('size', PAGE_SIZE.toString());

View File

@@ -35,21 +35,29 @@ export async function getPaginatedMessage<T, D extends string | number>(
}
export function registerPaginationCommand<T>(
export function registerPaginationCommand<T, Q extends string | number>(
bot: Telegraf,
prefix: string,
itemsGetter: (data: any, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>,
argsGetter: (ctx: Context) => { query: Q, page: number } | null,
prefixCreator: ((query: Q) => string) | null,
itemsGetter: (data: Q, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>,
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}_`;
}