Skip to content

Commit

Permalink
Merge pull request #1 from krystlepalace/search
Browse files Browse the repository at this point in the history
New feature - Search
  • Loading branch information
krystlepalace authored Sep 17, 2023
2 parents 6701cba + bd96881 commit 71f1930
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 10 deletions.
33 changes: 27 additions & 6 deletions handlers/callbacks/char_menu_callback.py
Original file line number Diff line number Diff line change
@@ -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()
Expand All @@ -15,20 +17,39 @@ 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:
await callback.answer()
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()
1 change: 1 addition & 0 deletions handlers/callbacks/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ class CharacterCallback(CallbackData, prefix='char'):

class PaginationCallback(CallbackData, prefix='page'):
page: int
type: str
24 changes: 24 additions & 0 deletions handlers/search.py
Original file line number Diff line number Diff line change
@@ -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())
26 changes: 24 additions & 2 deletions keyboards/choose_character.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 2 additions & 1 deletion main.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -15,6 +15,7 @@ async def main():
dp = Dispatcher()

dp.include_routers(base.router,
search.router,
chatting.router,
char_menu_callback.router,
)
Expand Down
6 changes: 5 additions & 1 deletion utils/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ async def set_commands(bot: Bot):
BotCommand(
command="character",
description="Menu with characters"
)
),
BotCommand(
command="search",
description="<query> - search characters"
),
]

await bot.set_my_commands(default_commands, BotCommandScopeDefault())

0 comments on commit 71f1930

Please sign in to comment.