mirror of
https://github.com/flibusta-apps/book_bot.git
synced 2025-12-06 15:35:35 +01:00
Add book detail
This commit is contained in:
@@ -12,6 +12,8 @@ export const SEQUENCE_BOOKS_PREFIX = 'bs_';
|
||||
export const BOOK_ANNOTATION_PREFIX = 'a_an_';
|
||||
export const AUTHOR_ANNOTATION_PREFIX = 'b_an_';
|
||||
|
||||
export const BOOK_INFO_PREFIX = 'b_i_';
|
||||
|
||||
export const RANDOM_BOOK = 'random_book';
|
||||
export const RANDOM_AUTHOR = 'random_author';
|
||||
export const RANDOM_SEQUENCE = 'random_sequence';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { AuthorBook, TranslatorBook, Book, Author, Sequence, BookAuthor } from './services/book_library';
|
||||
import { AuthorBook, TranslatorBook, Book, Author, Sequence, BookAuthor, DetailBook } from './services/book_library';
|
||||
|
||||
|
||||
type AllBookTypes = Book | AuthorBook | TranslatorBook;
|
||||
@@ -19,33 +19,31 @@ export function formatBook(book: AllBookTypes, short: boolean = false): string {
|
||||
|
||||
response.push(`📖 ${book.title} | ${book.lang}`);
|
||||
|
||||
// if (book.annotation_exists) {
|
||||
// response.push(`📝 Аннотация: /b_an_${book.id}`)
|
||||
// }
|
||||
response.push(`Информация: /b_i_${book.id}`);
|
||||
|
||||
const pushAuthorOrTranslator = (author: BookAuthor) => response.push(
|
||||
`͏👤 ${author.last_name} ${author.first_name} ${author.middle_name}`
|
||||
);
|
||||
|
||||
if (isTranslatorBook(book) && book.authors.length > 0) {
|
||||
response.push('Авторы:')
|
||||
|
||||
const pushAuthor = (author: BookAuthor) => response.push(`͏👤 ${author.last_name} ${author.first_name} ${author.middle_name}`);
|
||||
|
||||
if (short && book.authors.length >= 5) {
|
||||
book.authors.slice(0, 5).forEach(pushAuthor);
|
||||
book.authors.slice(0, 5).forEach(pushAuthorOrTranslator);
|
||||
response.push(" и другие.");
|
||||
} else {
|
||||
book.authors.forEach(pushAuthor);
|
||||
book.authors.forEach(pushAuthorOrTranslator);
|
||||
}
|
||||
}
|
||||
|
||||
if (isAuthorBook(book) && book.translators.length > 0) {
|
||||
response.push('Переводчики:');
|
||||
|
||||
const pushTranslator = (author: BookAuthor) => response.push(`͏👤 ${author.last_name} ${author.first_name} ${author.middle_name}`);
|
||||
|
||||
if (short && book.translators.length >= 5) {
|
||||
book.translators.slice(0, 5).forEach(pushTranslator);
|
||||
book.translators.slice(0, 5).forEach(pushAuthorOrTranslator);
|
||||
response.push(" и другие.")
|
||||
} else {
|
||||
book.translators.forEach(pushTranslator);
|
||||
book.translators.forEach(pushAuthorOrTranslator);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +52,56 @@ export function formatBook(book: AllBookTypes, short: boolean = false): string {
|
||||
return response.join('\n');
|
||||
}
|
||||
|
||||
export function formatDetailBook(book: DetailBook): string {
|
||||
let response: string[] = [];
|
||||
|
||||
const addEmptyLine = () => response.push("");
|
||||
|
||||
response.push(`📖 ${book.title} | ${book.lang}`);
|
||||
addEmptyLine();
|
||||
|
||||
if (book.annotation_exists) {
|
||||
response.push(`📝 Аннотация: /b_an_${book.id}`)
|
||||
addEmptyLine();
|
||||
}
|
||||
|
||||
if (book.authors.length > 0) {
|
||||
response.push('Авторы:')
|
||||
|
||||
const pushAuthor = (author: BookAuthor) => response.push(
|
||||
`͏👤 ${author.last_name} ${author.first_name} ${author.middle_name} /a_${author.id}`
|
||||
);
|
||||
book.authors.forEach(pushAuthor);
|
||||
addEmptyLine();
|
||||
}
|
||||
|
||||
if (book.translators.length > 0) {
|
||||
response.push('Переводчики:');
|
||||
|
||||
const pushTranslator = (author: BookAuthor) => response.push(
|
||||
`͏👤 ${author.last_name} ${author.first_name} ${author.middle_name} /t_${author.id}`
|
||||
);
|
||||
book.translators.forEach(pushTranslator);
|
||||
addEmptyLine();
|
||||
}
|
||||
|
||||
if (book.sequences.length > 0) {
|
||||
response.push('Серии:');
|
||||
|
||||
const pushSequence = (sequence: Sequence) => response.push(
|
||||
`📚 ${sequence.name} /s_${sequence.id}`
|
||||
);
|
||||
book.sequences.forEach(pushSequence);
|
||||
addEmptyLine();
|
||||
}
|
||||
|
||||
response.push("Скачать: ")
|
||||
book.available_types.forEach(a_type => response.push(`📥 ${a_type}: /d_${a_type}_${book.id}`));
|
||||
|
||||
return response.join('\n');
|
||||
}
|
||||
|
||||
|
||||
export function formatBookShort(book: AllBookTypes): string {
|
||||
return formatBook(book, true);
|
||||
}
|
||||
@@ -65,9 +113,9 @@ export function formatAuthor(author: Author): string {
|
||||
response.push(`👤 ${author.last_name} ${author.first_name} ${author.middle_name}`);
|
||||
response.push(`/a_${author.id}`);
|
||||
|
||||
// if (author.annotation_exists) {
|
||||
// response.push(`📝 Аннотация: /a_an_${author.id}`);
|
||||
// }
|
||||
if (author.annotation_exists) {
|
||||
response.push(`📝 Аннотация: /a_an_${author.id}`);
|
||||
}
|
||||
|
||||
return response.join('\n');
|
||||
}
|
||||
@@ -79,9 +127,9 @@ export function formatTranslator(author: Author): string {
|
||||
response.push(`👤 ${author.last_name} ${author.first_name} ${author.middle_name}`);
|
||||
response.push(`/t_${author.id}`);
|
||||
|
||||
// if (author.annotation_exists) {
|
||||
// response.push(`📝 Аннотация: /a_an_${author.id}`);
|
||||
// }
|
||||
if (author.annotation_exists) {
|
||||
response.push(`📝 Аннотация: /a_an_${author.id}`);
|
||||
}
|
||||
|
||||
return response.join('\n');
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ import * as CallbackData from "./callback_data";
|
||||
import * as BookLibrary from "./services/book_library";
|
||||
import UsersCounter from '@/analytics/users_counter';
|
||||
import { createOrUpdateUserSettings, getUserSettings } from './services/user_settings';
|
||||
import { formatBook, formatBookShort, formatAuthor, formatSequence, formatTranslator } from './format';
|
||||
import { formatBook, formatBookShort, formatAuthor, formatSequence, formatTranslator, formatDetailBook } from './format';
|
||||
import { getCallbackArgs, getPaginatedMessage, getPrefixWithQueryCreator, getSearchArgs, registerLanguageSettingsCallback, registerPaginationCommand, registerRandomItemCallback } from './utils';
|
||||
import { getRandomKeyboard, getTextPaginationData, getUpdateLogKeyboard, getUserAllowedLangsKeyboard } from './keyboard';
|
||||
import { sendFile } from './hooks/downloading';
|
||||
@@ -102,7 +102,7 @@ export async function createApprovedBot(token: string, state: BotState): Promise
|
||||
})
|
||||
});
|
||||
|
||||
registerRandomItemCallback(bot, CallbackData.RANDOM_BOOK, BookLibrary.getRandomBook, formatBook);
|
||||
registerRandomItemCallback(bot, CallbackData.RANDOM_BOOK, BookLibrary.getRandomBook, formatDetailBook);
|
||||
registerRandomItemCallback(bot, CallbackData.RANDOM_AUTHOR, BookLibrary.getRandomAuthor, formatAuthor);
|
||||
registerRandomItemCallback(bot, CallbackData.RANDOM_SEQUENCE, BookLibrary.getRandomSequence, formatSequence);
|
||||
|
||||
@@ -343,7 +343,7 @@ export async function createApprovedBot(token: string, state: BotState): Promise
|
||||
return;
|
||||
}
|
||||
|
||||
const sequenceId = ctx.message.text.split('_')[1];
|
||||
const sequenceId = ctx.message.text.split("@")[0].split('_')[1];
|
||||
|
||||
const userSettings = await getUserSettings(ctx.message.from.id);
|
||||
const allowedLangs = userSettings.allowed_langs.map((lang) => lang.code);
|
||||
@@ -358,6 +358,20 @@ export async function createApprovedBot(token: string, state: BotState): Promise
|
||||
});
|
||||
});
|
||||
|
||||
bot.hears(new RegExp(`^/b_i_[\\d]+(@${me.username})*$`), async (ctx: Context) => {
|
||||
if (!ctx.message || !('text' in ctx.message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const bookId = ctx.message.text.split("@")[0].split('_')[2];
|
||||
|
||||
const book = await BookLibrary.getBookById(parseInt(bookId));
|
||||
|
||||
await ctx.reply(formatDetailBook(book), {
|
||||
reply_to_message_id: ctx.message.message_id,
|
||||
});
|
||||
});
|
||||
|
||||
bot.on("message", async (ctx: Context) => {
|
||||
if (!ctx.message || !('text' in ctx.message)) {
|
||||
return;
|
||||
|
||||
@@ -58,6 +58,7 @@ export interface Source {
|
||||
|
||||
|
||||
export interface DetailBook extends Book {
|
||||
sequences: Sequence[];
|
||||
source: Source;
|
||||
remote_id: number;
|
||||
is_deleted: boolean;
|
||||
@@ -199,8 +200,8 @@ export async function getSequenceBooks(sequenceId: number | string, page: number
|
||||
return _makeRequest<Page<Book>>(`/api/v1/sequences/${sequenceId}/books`, searchParams);
|
||||
}
|
||||
|
||||
export async function getRandomBook(allowedLangs: string[]): Promise<Book> {
|
||||
return _makeRequest<Book>('/api/v1/books/random', getAllowedLangsSearchParams(allowedLangs));
|
||||
export async function getRandomBook(allowedLangs: string[]): Promise<DetailBook> {
|
||||
return _makeRequest<DetailBook>('/api/v1/books/random', getAllowedLangsSearchParams(allowedLangs));
|
||||
}
|
||||
|
||||
export async function getRandomAuthor(allowedLangs: string[]): Promise<Author> {
|
||||
|
||||
Reference in New Issue
Block a user