mirror of
https://github.com/flibusta-apps/book_bot.git
synced 2025-12-06 07:25:36 +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));
|
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
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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 = "Серии не найдены.";
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user