mirror of
https://github.com/flibusta-apps/book_bot.git
synced 2025-12-06 15:35:35 +01:00
Fix large queries
This commit is contained in:
@@ -13,7 +13,7 @@ import * as CallbackData from "./callback_data";
|
|||||||
import * as BookLibrary from "./services/book_library";
|
import * as BookLibrary from "./services/book_library";
|
||||||
import { createOrUpdateUserSettings, getUserSettings } from './services/user_settings';
|
import { createOrUpdateUserSettings, getUserSettings } from './services/user_settings';
|
||||||
import { formatBook, formatAuthor, formatSequence, formatTranslator } from './format';
|
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 { getRandomKeyboard, getTextPaginationData, getUpdateLogKeyboard, getUserAllowedLangsKeyboard } from './keyboard';
|
||||||
import { sendFile } from './hooks/downloading';
|
import { sendFile } from './hooks/downloading';
|
||||||
import { setCommands } from './hooks/setCommands';
|
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));
|
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_BOOK_PREFIX, getSearchArgs, null, BookLibrary.searchByBookName, formatBook);
|
||||||
registerPaginationCommand(bot, CallbackData.SEARCH_TRANSLATORS_PREFIX, BookLibrary.searchTranslators, formatTranslator);
|
registerPaginationCommand(bot, CallbackData.SEARCH_TRANSLATORS_PREFIX, getSearchArgs, null, BookLibrary.searchTranslators, formatTranslator);
|
||||||
registerPaginationCommand(bot, CallbackData.SEARCH_AUTHORS_PREFIX, BookLibrary.searchAuthors, formatAuthor);
|
registerPaginationCommand(bot, CallbackData.SEARCH_AUTHORS_PREFIX, getSearchArgs, null, BookLibrary.searchAuthors, formatAuthor);
|
||||||
registerPaginationCommand(bot, CallbackData.SEARCH_SERIES_PREFIX, BookLibrary.searchSequences, formatSequence);
|
registerPaginationCommand(bot, CallbackData.SEARCH_SERIES_PREFIX, getSearchArgs, null, BookLibrary.searchSequences, formatSequence);
|
||||||
|
|
||||||
registerPaginationCommand(bot, CallbackData.AUTHOR_BOOKS_PREFIX, BookLibrary.getAuthorBooks, formatBook);
|
registerPaginationCommand(bot, CallbackData.AUTHOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.AUTHOR_BOOKS_PREFIX), BookLibrary.getAuthorBooks, formatBook);
|
||||||
registerPaginationCommand(bot, CallbackData.TRANSLATOR_BOOKS_PREFIX, BookLibrary.getTranslatorBooks, formatBook);
|
registerPaginationCommand(bot, CallbackData.TRANSLATOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.TRANSLATOR_BOOKS_PREFIX), BookLibrary.getTranslatorBooks, formatBook);
|
||||||
registerPaginationCommand(bot, CallbackData.SEQUENCE_BOOKS_PREFIX, BookLibrary.getSequenceBooks, 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) => {
|
bot.command(["random", `random@${me.username}`], async (ctx: Context) => {
|
||||||
ctx.reply("Что хотим получить?", {
|
ctx.reply("Что хотим получить?", {
|
||||||
@@ -248,7 +248,7 @@ export async function createApprovedBot(token: string, state: BotState): Promise
|
|||||||
const userSettings = await getUserSettings(ctx.message.from.id);
|
const userSettings = await getUserSettings(ctx.message.from.id);
|
||||||
const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code);
|
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, {
|
await ctx.reply(pMessage.message, {
|
||||||
reply_markup: pMessage.keyboard.reply_markup
|
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 userSettings = await getUserSettings(ctx.message.from.id);
|
||||||
const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code);
|
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, {
|
await ctx.reply(pMessage.message, {
|
||||||
reply_markup: pMessage.keyboard.reply_markup
|
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 userSettings = await getUserSettings(ctx.message.from.id);
|
||||||
const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code);
|
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, {
|
await ctx.reply(pMessage.message, {
|
||||||
reply_markup: pMessage.keyboard.reply_markup
|
reply_markup: pMessage.keyboard.reply_markup
|
||||||
@@ -294,20 +294,18 @@ export async function createApprovedBot(token: string, state: BotState): Promise
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const query = ctx.message.text.replaceAll("_", " ").substring(0, 64 - 7).toLowerCase();
|
|
||||||
|
|
||||||
let keyboard = Markup.inlineKeyboard([
|
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`),
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ export function getPaginationKeyboard(prefix: string, query: string | number, pa
|
|||||||
const row = [];
|
const row = [];
|
||||||
|
|
||||||
if (page - delta > 0) {
|
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) {
|
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;
|
return row;
|
||||||
|
|||||||
@@ -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);
|
const searchParams = getAllowedLangsSearchParams(allowedLangs);
|
||||||
searchParams.append('page', page.toString());
|
searchParams.append('page', page.toString());
|
||||||
searchParams.append('size', PAGE_SIZE.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);
|
const searchParams = getAllowedLangsSearchParams(allowedLangs);
|
||||||
searchParams.append('page', page.toString());
|
searchParams.append('page', page.toString());
|
||||||
searchParams.append('size', PAGE_SIZE.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);
|
const searchParams = getAllowedLangsSearchParams(allowedLangs);
|
||||||
searchParams.append('page', page.toString());
|
searchParams.append('page', page.toString());
|
||||||
searchParams.append('size', PAGE_SIZE.toString());
|
searchParams.append('size', PAGE_SIZE.toString());
|
||||||
|
|||||||
@@ -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,
|
bot: Telegraf,
|
||||||
prefix: string,
|
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,
|
itemFormater: (item: T) => string,
|
||||||
) {
|
) {
|
||||||
bot.action(new RegExp(prefix), async (ctx: Context) => {
|
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 userSettings = await getUserSettings(ctx.callbackQuery.from.id);
|
||||||
const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code);
|
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 {
|
try {
|
||||||
await ctx.editMessageText(pMessage.message, {
|
await ctx.editMessageText(pMessage.message, {
|
||||||
@@ -137,3 +145,58 @@ export function getAllowedLangsSearchParams(allowedLangs: string[]): URLSearchPa
|
|||||||
allowedLangs.forEach((lang) => sp.append('allowed_langs', lang));
|
allowedLangs.forEach((lang) => sp.append('allowed_langs', lang));
|
||||||
return sp;
|
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}_`;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user