mirror of
https://github.com/flibusta-apps/book_bot.git
synced 2025-12-06 15:35:35 +01:00
Fix pagination
This commit is contained in:
@@ -66,14 +66,32 @@ 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, 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.SEARCH_BOOK_PREFIX, getSearchArgs, null, BookLibrary.searchByBookName, formatBook, undefined, Messages.BOOKS_NOT_FOUND
|
||||
);
|
||||
registerPaginationCommand(
|
||||
bot, CallbackData.SEARCH_TRANSLATORS_PREFIX, getSearchArgs, null, BookLibrary.searchTranslators, formatTranslator,
|
||||
undefined, Messages.TRANSLATORS_NOT_FOUND
|
||||
);
|
||||
registerPaginationCommand(
|
||||
bot, CallbackData.SEARCH_AUTHORS_PREFIX, getSearchArgs, null, BookLibrary.searchAuthors, formatAuthor, undefined, Messages.AUTHORS_NOT_FOUND
|
||||
);
|
||||
registerPaginationCommand(
|
||||
bot, CallbackData.SEARCH_SERIES_PREFIX, getSearchArgs, null, BookLibrary.searchSequences, formatSequence, undefined, Messages.SEQUENCES_NOT_FOUND
|
||||
);
|
||||
|
||||
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);
|
||||
registerPaginationCommand(
|
||||
bot, CallbackData.AUTHOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.AUTHOR_BOOKS_PREFIX),
|
||||
BookLibrary.getAuthorBooks, formatBook, undefined, Messages.BOOKS_NOT_FOUND,
|
||||
);
|
||||
registerPaginationCommand(
|
||||
bot, CallbackData.TRANSLATOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.TRANSLATOR_BOOKS_PREFIX),
|
||||
BookLibrary.getTranslatorBooks, formatBook, undefined, Messages.BOOKS_NOT_FOUND,
|
||||
);
|
||||
registerPaginationCommand(
|
||||
bot, CallbackData.SEQUENCE_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.SEQUENCE_BOOKS_PREFIX),
|
||||
BookLibrary.getSequenceBooks, formatBook, undefined, Messages.BOOKS_NOT_FOUND,
|
||||
);
|
||||
|
||||
bot.command(["random", `random@${me.username}`], async (ctx: Context) => {
|
||||
ctx.reply("Что хотим получить?", {
|
||||
@@ -102,12 +120,15 @@ export async function createApprovedBot(token: string, state: BotState): Promise
|
||||
|
||||
const arg = `${data[2]}_${data[3]}`;
|
||||
|
||||
const header = `Обновление каталога (${moment(data[2]).format("DD.MM.YYYY")} - ${moment(data[3]).format("DD.MM.YYYY")}):\n\n`
|
||||
const header = `Обновление каталога (${moment(data[2]).format("DD.MM.YYYY")} - ${moment(data[3]).format("DD.MM.YYYY")}):\n\n`;
|
||||
const noItemsMessage = 'Нет новых книг за этот период.';
|
||||
|
||||
const pMessage = await getPaginatedMessage(`${CallbackData.UPDATE_LOG_PREFIX}${arg}_`, arg, page, allowedLangs, BookLibrary.getBooks, formatBook, header);
|
||||
const pMessage = await getPaginatedMessage(
|
||||
`${CallbackData.UPDATE_LOG_PREFIX}${arg}_`, arg, page, allowedLangs, BookLibrary.getBooks, formatBook, header, noItemsMessage,
|
||||
);
|
||||
|
||||
await ctx.editMessageText(pMessage.message, {
|
||||
reply_markup: pMessage.keyboard.reply_markup
|
||||
reply_markup: pMessage.keyboard?.reply_markup
|
||||
});
|
||||
});
|
||||
|
||||
@@ -268,10 +289,13 @@ 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}${authorId}_`, parseInt(authorId), 1, allowedLangs, BookLibrary.getAuthorBooks, formatBook);
|
||||
const pMessage = await getPaginatedMessage(
|
||||
`${CallbackData.AUTHOR_BOOKS_PREFIX}${authorId}_`, parseInt(authorId), 1,
|
||||
allowedLangs, BookLibrary.getAuthorBooks, formatBook, undefined, Messages.BOOKS_NOT_FOUND
|
||||
);
|
||||
|
||||
await ctx.reply(pMessage.message, {
|
||||
reply_markup: pMessage.keyboard.reply_markup
|
||||
reply_markup: pMessage.keyboard?.reply_markup
|
||||
});
|
||||
});
|
||||
|
||||
@@ -285,10 +309,13 @@ 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}${translatorId}_`, parseInt(translatorId), 1, allowedLangs, BookLibrary.getTranslatorBooks, formatBook);
|
||||
const pMessage = await getPaginatedMessage(
|
||||
`${CallbackData.TRANSLATOR_BOOKS_PREFIX}${translatorId}_`, parseInt(translatorId), 1,
|
||||
allowedLangs, BookLibrary.getTranslatorBooks, formatBook, undefined, Messages.BOOKS_NOT_FOUND
|
||||
);
|
||||
|
||||
await ctx.reply(pMessage.message, {
|
||||
reply_markup: pMessage.keyboard.reply_markup
|
||||
reply_markup: pMessage.keyboard?.reply_markup
|
||||
});
|
||||
});
|
||||
|
||||
@@ -302,10 +329,13 @@ 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}${sequenceId}_`, parseInt(sequenceId), 1, allowedLangs, BookLibrary.getSequenceBooks, formatBook);
|
||||
const pMessage = await getPaginatedMessage(
|
||||
`${CallbackData.SEQUENCE_BOOKS_PREFIX}${sequenceId}_`, parseInt(sequenceId), 1, allowedLangs,
|
||||
BookLibrary.getSequenceBooks, formatBook, undefined, Messages.BOOKS_NOT_FOUND,
|
||||
);
|
||||
|
||||
await ctx.reply(pMessage.message, {
|
||||
reply_markup: pMessage.keyboard.reply_markup
|
||||
reply_markup: pMessage.keyboard?.reply_markup
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -3,11 +3,16 @@ export const START_MESSAGE = 'Привет, {name}! \n' +
|
||||
'Узнать, как со мной работать /help.\n' +
|
||||
'Настройки языков для поиска /settings.\n';
|
||||
|
||||
// export const HELP_MESSAGE = 'Лучше один раз увидеть, чем сто раз услышать.\n' +
|
||||
// 'https://youtu.be/HV6Wm87D6_A';
|
||||
|
||||
export const HELP_MESSAGE = 'Пока пусто :(';
|
||||
|
||||
export const SETTINGS_MESSAGE = 'Настройки:';
|
||||
|
||||
export const SEARCH_MESSAGE = 'Что ищем?';
|
||||
|
||||
export const BOOKS_NOT_FOUND = "Книги для не найдены.";
|
||||
|
||||
export const AUTHORS_NOT_FOUND = "Авторы не найдены.";
|
||||
|
||||
export const TRANSLATORS_NOT_FOUND = "Переводчики не найдены.";
|
||||
|
||||
export const SEQUENCES_NOT_FOUND = "Серии не найдены.";
|
||||
|
||||
@@ -9,7 +9,7 @@ import { createOrUpdateUserSettings, getUserSettings } from './services/user_set
|
||||
|
||||
interface PreparedMessage {
|
||||
message: string;
|
||||
keyboard: Markup.Markup<InlineKeyboardMarkup>;
|
||||
keyboard?: Markup.Markup<InlineKeyboardMarkup>;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,10 +20,21 @@ export async function getPaginatedMessage<T, D extends string | number>(
|
||||
allowedLangs: string[],
|
||||
itemsGetter: (data: D, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>,
|
||||
itemFormater: (item: T) => string,
|
||||
header: string = ""
|
||||
header: string = "",
|
||||
noItemsMessage: string = "",
|
||||
): Promise<PreparedMessage> {
|
||||
const itemsPage = await itemsGetter(data, page, allowedLangs);
|
||||
|
||||
if (itemsPage.total_pages === 0) {
|
||||
return {
|
||||
message: noItemsMessage,
|
||||
}
|
||||
}
|
||||
|
||||
if (page > itemsPage.total_pages) {
|
||||
return getPaginatedMessage(prefix, data, page, allowedLangs, itemsGetter, itemFormater, header, noItemsMessage);
|
||||
}
|
||||
|
||||
const formatedItems = itemsPage.items.map(itemFormater).join('\n\n\n');
|
||||
const message = header + formatedItems + `\n\nСтраница ${page}/${itemsPage.total_pages}`;
|
||||
|
||||
@@ -43,6 +54,8 @@ export function registerPaginationCommand<T, Q extends string | number>(
|
||||
prefixCreator: ((query: Q) => string) | null,
|
||||
itemsGetter: (data: Q, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>,
|
||||
itemFormater: (item: T) => string,
|
||||
headers?: string,
|
||||
noItemsMessage?: string,
|
||||
) {
|
||||
bot.action(new RegExp(prefix), async (ctx: Context) => {
|
||||
if (!ctx.callbackQuery) return;
|
||||
@@ -58,11 +71,13 @@ export function registerPaginationCommand<T, Q extends string | number>(
|
||||
|
||||
const tPrefix = prefixCreator ? prefixCreator(query) : prefix;
|
||||
|
||||
const pMessage = await getPaginatedMessage(tPrefix, query, page, allowedLangs, itemsGetter, itemFormater);
|
||||
const pMessage = await getPaginatedMessage(
|
||||
tPrefix, query, page, allowedLangs, itemsGetter, itemFormater, headers, noItemsMessage,
|
||||
);
|
||||
|
||||
try {
|
||||
await ctx.editMessageText(pMessage.message, {
|
||||
reply_markup: pMessage.keyboard.reply_markup
|
||||
reply_markup: pMessage.keyboard?.reply_markup
|
||||
});
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
|
||||
Reference in New Issue
Block a user