From 8cc0b62e779e498197a09dd706c04bc5684cebeb Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Tue, 19 Jul 2022 19:19:29 +0300 Subject: [PATCH] Add getting random boo by genre --- .../factory/bots/approved/callback_data.ts | 4 ++ src/bots/factory/bots/approved/index.ts | 59 +++++++++++++++++++ src/bots/factory/bots/approved/keyboard.ts | 3 +- .../bots/approved/services/book_library.ts | 18 +++++- 4 files changed, 81 insertions(+), 3 deletions(-) diff --git a/src/bots/factory/bots/approved/callback_data.ts b/src/bots/factory/bots/approved/callback_data.ts index 9ef9636..38200f5 100644 --- a/src/bots/factory/bots/approved/callback_data.ts +++ b/src/bots/factory/bots/approved/callback_data.ts @@ -15,9 +15,13 @@ export const AUTHOR_ANNOTATION_PREFIX = 'b_an_'; export const BOOK_INFO_PREFIX = 'b_i_'; export const RANDOM_BOOK = 'random_book'; +export const RANDOM_BOOK_BY_GENRE_REQUEST = 'random_book_by_genre_request'; +export const RANDOM_BOOK_BY_GENRE = 'random_book_by_genre_'; export const RANDOM_AUTHOR = 'random_author'; export const RANDOM_SEQUENCE = 'random_sequence'; +export const GENRES_PREFIX = 'genres_'; + export const LANG_SETTINGS = 'lang_settings'; export const ENABLE_LANG_PREFIX = 'lang_on_'; export const DISABLE_LANG_PREFIX = 'lang_off_'; diff --git a/src/bots/factory/bots/approved/index.ts b/src/bots/factory/bots/approved/index.ts index 8d29b3c..eba497d 100644 --- a/src/bots/factory/bots/approved/index.ts +++ b/src/bots/factory/bots/approved/index.ts @@ -105,6 +105,65 @@ export async function createApprovedBot(token: string, state: BotState): Promise registerRandomItemCallback(bot, CallbackData.RANDOM_AUTHOR, BookLibrary.getRandomAuthor, formatAuthor); registerRandomItemCallback(bot, CallbackData.RANDOM_SEQUENCE, BookLibrary.getRandomSequence, formatSequence); + bot.action(CallbackData.RANDOM_BOOK_BY_GENRE_REQUEST, async (ctx: Context) => { + if (!ctx.callbackQuery || !('data' in ctx.callbackQuery)) return; + + const metaGenres = await BookLibrary.getGenreMetas(); + + const keyboard = Markup.inlineKeyboard( + metaGenres.map((meta, index) => { + return [Markup.button.callback(meta, `${CallbackData.GENRES_PREFIX}${index}`)]; + }) + ); + + await ctx.editMessageReplyMarkup(keyboard.reply_markup); + }); + + bot.action(new RegExp(CallbackData.GENRES_PREFIX), async (ctx: Context) => { + if (!ctx.callbackQuery || !('data' in ctx.callbackQuery)) return; + + const queryData = ctx.callbackQuery.data.split("_"); + const metaIndex = parseInt(queryData[1]); + + const metaGenres = await BookLibrary.getGenreMetas(); + const meta = metaGenres[metaIndex]; + + const genres = await BookLibrary.getGenres(meta); + + const buttons = genres.items.map((genre) => { + return [Markup.button.callback(genre.description, `${CallbackData.RANDOM_BOOK_BY_GENRE}${genre.id}`)] + }); + buttons.push( + [Markup.button.callback("< Назад >", CallbackData.RANDOM_BOOK_BY_GENRE_REQUEST)] + ); + + const keyboard = Markup.inlineKeyboard(buttons); + + await ctx.editMessageReplyMarkup(keyboard.reply_markup); + }); + + bot.action(new RegExp(CallbackData.RANDOM_BOOK_BY_GENRE), async (ctx: Context) => { + if (!ctx.callbackQuery || !('data' in ctx.callbackQuery)) return; + + const allowedLangs = await getUserOrDefaultLangCodes(ctx.callbackQuery.from.id); + + const queryData = ctx.callbackQuery.data.split("_"); + const genreId = parseInt(queryData[4]); + + const item = await BookLibrary.getRandomBook(allowedLangs, genreId); + const keyboard = Markup.inlineKeyboard([ + [Markup.button.callback("Повторить?", ctx.callbackQuery.data)] + ]); + + try { + await ctx.editMessageReplyMarkup(Markup.inlineKeyboard([]).reply_markup); + } catch (e) {} + + ctx.reply(formatDetailBook(item), { + reply_markup: keyboard.reply_markup, + }); + }); + bot.command(["update_log", `update_log@${me.username}`], async (ctx: Context) => { ctx.reply("Обновление каталога: ", { reply_markup: getUpdateLogKeyboard().reply_markup, diff --git a/src/bots/factory/bots/approved/keyboard.ts b/src/bots/factory/bots/approved/keyboard.ts index 51d9787..ef15170 100644 --- a/src/bots/factory/bots/approved/keyboard.ts +++ b/src/bots/factory/bots/approved/keyboard.ts @@ -3,7 +3,7 @@ import { InlineKeyboardMarkup } from 'typegram'; import moment from 'moment'; import chunkText from 'chunk-text'; -import { RANDOM_BOOK, RANDOM_AUTHOR, RANDOM_SEQUENCE, ENABLE_LANG_PREFIX, DISABLE_LANG_PREFIX, UPDATE_LOG_PREFIX, RATE_PREFIX } from './callback_data'; +import { RANDOM_BOOK, RANDOM_AUTHOR, RANDOM_SEQUENCE, ENABLE_LANG_PREFIX, DISABLE_LANG_PREFIX, UPDATE_LOG_PREFIX, RATE_PREFIX, RANDOM_BOOK_BY_GENRE, RANDOM_BOOK_BY_GENRE_REQUEST } from './callback_data'; import { getLanguages, getUserOrDefaultLangCodes } from './services/user_settings'; import * as BookRating from "./services/book_ratings"; @@ -74,6 +74,7 @@ export function getTextPaginationData(prefix: string, text: string, currentPage: export function getRandomKeyboard(): Markup.Markup { return Markup.inlineKeyboard([ [Markup.button.callback('Книгу', RANDOM_BOOK)], + [Markup.button.callback('Книгу по жанру', RANDOM_BOOK_BY_GENRE_REQUEST)], [Markup.button.callback('Автора', RANDOM_AUTHOR)], [Markup.button.callback('Серию', RANDOM_SEQUENCE)], ]); diff --git a/src/bots/factory/bots/approved/services/book_library.ts b/src/bots/factory/bots/approved/services/book_library.ts index 4f35af2..085a1c2 100644 --- a/src/bots/factory/bots/approved/services/book_library.ts +++ b/src/bots/factory/bots/approved/services/book_library.ts @@ -207,8 +207,14 @@ export async function getSequenceBooks(sequenceId: number | string, page: number return _makeRequest>(`/api/v1/sequences/${sequenceId}/books`, searchParams); } -export async function getRandomBook(allowedLangs: string[]): Promise { - return _makeRequest('/api/v1/books/random', getAllowedLangsSearchParams(allowedLangs)); +export async function getRandomBook(allowedLangs: string[], genre: number | null = null): Promise { + const params = getAllowedLangsSearchParams(allowedLangs); + if (genre) params.append("genre", genre.toString()); + + return _makeRequest( + '/api/v1/books/random', + params, + ); } export async function getRandomAuthor(allowedLangs: string[]): Promise { @@ -218,3 +224,11 @@ export async function getRandomAuthor(allowedLangs: string[]): Promise { export async function getRandomSequence(allowedLangs: string[]): Promise { return _makeRequest('/api/v1/sequences/random', getAllowedLangsSearchParams(allowedLangs)); } + +export async function getGenreMetas(): Promise { + return _makeRequest('/api/v1/genres/metas'); +} + +export async function getGenres(meta: string): Promise> { + return _makeRequest>('/api/v1/genres', {meta}); +}