Fix pagination

This commit is contained in:
2022-02-06 13:21:09 +03:00
parent abc6891156
commit a1d8245572
3 changed files with 73 additions and 23 deletions

View File

@@ -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)); 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(
registerPaginationCommand(bot, CallbackData.SEARCH_TRANSLATORS_PREFIX, getSearchArgs, null, BookLibrary.searchTranslators, formatTranslator); bot, CallbackData.SEARCH_BOOK_PREFIX, getSearchArgs, null, BookLibrary.searchByBookName, formatBook, undefined, Messages.BOOKS_NOT_FOUND
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_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(
registerPaginationCommand(bot, CallbackData.TRANSLATOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.TRANSLATOR_BOOKS_PREFIX), BookLibrary.getTranslatorBooks, formatBook); bot, CallbackData.AUTHOR_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.AUTHOR_BOOKS_PREFIX),
registerPaginationCommand(bot, CallbackData.SEQUENCE_BOOKS_PREFIX, getCallbackArgs, getPrefixWithQueryCreator(CallbackData.SEQUENCE_BOOKS_PREFIX), BookLibrary.getSequenceBooks, formatBook); 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) => { bot.command(["random", `random@${me.username}`], async (ctx: Context) => {
ctx.reply("Что хотим получить?", { ctx.reply("Что хотим получить?", {
@@ -102,12 +120,15 @@ export async function createApprovedBot(token: string, state: BotState): Promise
const arg = `${data[2]}_${data[3]}`; 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, { 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 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}${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, { 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 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}${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, { 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 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}${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, { await ctx.reply(pMessage.message, {
reply_markup: pMessage.keyboard.reply_markup reply_markup: pMessage.keyboard?.reply_markup
}); });
}); });

View File

@@ -3,11 +3,16 @@ export const START_MESSAGE = 'Привет, {name}! \n' +
'Узнать, как со мной работать /help.\n' + 'Узнать, как со мной работать /help.\n' +
'Настройки языков для поиска /settings.\n'; 'Настройки языков для поиска /settings.\n';
// export const HELP_MESSAGE = 'Лучше один раз увидеть, чем сто раз услышать.\n' +
// 'https://youtu.be/HV6Wm87D6_A';
export const HELP_MESSAGE = 'Пока пусто :('; export const HELP_MESSAGE = 'Пока пусто :(';
export const SETTINGS_MESSAGE = 'Настройки:'; export const SETTINGS_MESSAGE = 'Настройки:';
export const SEARCH_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 = "Серии не найдены.";

View File

@@ -9,7 +9,7 @@ import { createOrUpdateUserSettings, getUserSettings } from './services/user_set
interface PreparedMessage { interface PreparedMessage {
message: string; 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[], allowedLangs: string[],
itemsGetter: (data: D, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>, itemsGetter: (data: D, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>,
itemFormater: (item: T) => string, itemFormater: (item: T) => string,
header: string = "" header: string = "",
noItemsMessage: string = "",
): Promise<PreparedMessage> { ): Promise<PreparedMessage> {
const itemsPage = await itemsGetter(data, page, allowedLangs); 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 formatedItems = itemsPage.items.map(itemFormater).join('\n\n\n');
const message = header + formatedItems + `\n\nСтраница ${page}/${itemsPage.total_pages}`; 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, prefixCreator: ((query: Q) => string) | null,
itemsGetter: (data: Q, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>, itemsGetter: (data: Q, page: number, allowedLangs: string[]) => Promise<BookLibrary.Page<T>>,
itemFormater: (item: T) => string, itemFormater: (item: T) => string,
headers?: string,
noItemsMessage?: string,
) { ) {
bot.action(new RegExp(prefix), async (ctx: Context) => { bot.action(new RegExp(prefix), async (ctx: Context) => {
if (!ctx.callbackQuery) return; if (!ctx.callbackQuery) return;
@@ -58,11 +71,13 @@ export function registerPaginationCommand<T, Q extends string | number>(
const tPrefix = prefixCreator ? prefixCreator(query) : prefix; 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 { try {
await ctx.editMessageText(pMessage.message, { await ctx.editMessageText(pMessage.message, {
reply_markup: pMessage.keyboard.reply_markup reply_markup: pMessage.keyboard?.reply_markup
}); });
} catch (err) { } catch (err) {
console.log(err); console.log(err);