From 58cf16e18303980ffd7cab4db4f8cdf07da7e67d Mon Sep 17 00:00:00 2001 From: Fvbvke Date: Sun, 17 Sep 2023 23:43:54 +0300 Subject: [PATCH 1/6] Refactor due to new feature --- handlers/callbacks/char_menu_callback.py | 33 +++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/handlers/callbacks/char_menu_callback.py b/handlers/callbacks/char_menu_callback.py index c59ba55..336a8a5 100644 --- a/handlers/callbacks/char_menu_callback.py +++ b/handlers/callbacks/char_menu_callback.py @@ -1,8 +1,10 @@ from aiogram import Router, F +from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery from handlers.callbacks.factories import CharacterCallback, PaginationCallback +from handlers.search import SearchQuery from utils import character -from keyboards.choose_character import characters_builder +from keyboards.choose_character import characters_builder, search_results import main router = Router() @@ -15,12 +17,13 @@ async def process_choose_character(callback: CallbackQuery, await char.change_char(callback_data.id) info = await main.client.character.info(callback_data.id) - await callback.message.edit_text(f"You have choosed character {info['character']['name']}") + await callback.message.edit_text( + f"You have choosed character {info['character']['name']}") await callback.message.answer(info['character']['greeting']) await callback.answer() -@router.callback_query(PaginationCallback.filter(F.page >= -1)) +@router.callback_query(PaginationCallback.filter(F.type == "characters")) async def process_change_page(callback: CallbackQuery, callback_data: PaginationCallback): if callback_data.page < 0: @@ -28,7 +31,25 @@ async def process_change_page(callback: CallbackQuery, return await callback.message.edit_reply_markup(reply_markup=characters_builder( - page=callback_data.page - ).as_markup() - ) + page=callback_data.page + ).as_markup() + ) + await callback.answer() + + +@router.callback_query(PaginationCallback.filter(F.type == "search")) +async def process_change_page(callback: CallbackQuery, + callback_data: PaginationCallback, + state: FSMContext): + if callback_data.page < 0: + await callback.answer() + return + + await state.set_state(SearchQuery.results) + result_state = await state.get_data() + await callback.message.edit_reply_markup(reply_markup=search_results( + page=callback_data.page, + results=result_state + ).as_markup() + ) await callback.answer() From b06d4c685b86b932d9dcbe9f84f5c5ba651af115 Mon Sep 17 00:00:00 2001 From: Fvbvke Date: Sun, 17 Sep 2023 23:44:06 +0300 Subject: [PATCH 2/6] Refactor --- handlers/callbacks/factories.py | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/callbacks/factories.py b/handlers/callbacks/factories.py index 719b6f2..70e417f 100644 --- a/handlers/callbacks/factories.py +++ b/handlers/callbacks/factories.py @@ -7,3 +7,4 @@ class CharacterCallback(CallbackData, prefix='char'): class PaginationCallback(CallbackData, prefix='page'): page: int + type: str From 7cc2be0e9983dcb71bbf1721bf457c9bc737c053 Mon Sep 17 00:00:00 2001 From: Fvbvke Date: Sun, 17 Sep 2023 23:44:35 +0300 Subject: [PATCH 3/6] Create search.py Handler for handling search queries from user --- handlers/search.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 handlers/search.py diff --git a/handlers/search.py b/handlers/search.py new file mode 100644 index 0000000..0e7e0a5 --- /dev/null +++ b/handlers/search.py @@ -0,0 +1,24 @@ +from aiogram import Router, F +from aiogram.fsm.context import FSMContext +from aiogram.fsm.state import StatesGroup, State +from aiogram.types import Message +from aiogram.filters import Command, CommandObject +import main +from keyboards.choose_character import search_results + +router = Router() + + +class SearchQuery(StatesGroup): + results = State() + + +@router.message(Command("search")) +async def search_cmd(message: Message, command: CommandObject, state: FSMContext): + query = command.args + result = await main.client.character.search(query) + + await state.set_state(SearchQuery.results) + await state.set_data(result["characters"]) + await message.reply(text=f"Search for '{query}'", + reply_markup=search_results(result["characters"]).as_markup()) From 95e357b9de3942bdb8e74f6f7fa90f98293770bd Mon Sep 17 00:00:00 2001 From: Fvbvke Date: Sun, 17 Sep 2023 23:45:05 +0300 Subject: [PATCH 4/6] New keyboard for search results --- keyboards/choose_character.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/keyboards/choose_character.py b/keyboards/choose_character.py index f6a9b7e..bc41701 100644 --- a/keyboards/choose_character.py +++ b/keyboards/choose_character.py @@ -27,12 +27,34 @@ def characters_builder(page=0): builder.button( text="<", - callback_data=PaginationCallback(page=page-1).pack() + callback_data=PaginationCallback(page=page-1, type="characters").pack() ) builder.button( text=">", - callback_data=PaginationCallback(page=page+1).pack() + callback_data=PaginationCallback(page=page+1, type="characters").pack() ) builder.adjust(*[1 for i in range(len(characters[page]))], 2) return builder + + +def search_results(results, page=0): + builder = InlineKeyboardBuilder() + paginated_results = [results[i:i + 5] for i in range(0, len(results), 5)] + for char in paginated_results[page]: + builder.button( + text=char['participant__name'], + callback_data=CharacterCallback(id=char["external_id"]).pack() + ) + + builder.button( + text="<", + callback_data=PaginationCallback(page=page-1, type="search").pack() + ) + builder.button( + text=">", + callback_data=PaginationCallback(page=page+1, type="search").pack() + ) + builder.adjust(*[1 for i in range(len(paginated_results[page]))], 2) + + return builder From 61303431f511eee76b917f06db45caa6d7fe0610 Mon Sep 17 00:00:00 2001 From: Fvbvke Date: Sun, 17 Sep 2023 23:45:18 +0300 Subject: [PATCH 5/6] Update main.py --- main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index e6790f7..8a53461 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,7 @@ import asyncio from aiogram import Bot, Dispatcher from config import CONFIG -from handlers import base, chatting +from handlers import base, chatting, search from handlers.callbacks import char_menu_callback from utils.commands import set_commands from characterai import PyAsyncCAI @@ -15,6 +15,7 @@ async def main(): dp = Dispatcher() dp.include_routers(base.router, + search.router, chatting.router, char_menu_callback.router, ) From bd96881f165f9fb8f9bf6e791efe4be86b1609a7 Mon Sep 17 00:00:00 2001 From: Fvbvke Date: Sun, 17 Sep 2023 23:49:04 +0300 Subject: [PATCH 6/6] Update commands.py --- utils/commands.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/utils/commands.py b/utils/commands.py index 6591c87..153adbb 100644 --- a/utils/commands.py +++ b/utils/commands.py @@ -15,7 +15,11 @@ async def set_commands(bot: Bot): BotCommand( command="character", description="Menu with characters" - ) + ), + BotCommand( + command="search", + description=" - search characters" + ), ] await bot.set_my_commands(default_commands, BotCommandScopeDefault()) \ No newline at end of file