diff --git a/bot/app/bot.py b/bot/app/bot.py index c4eeb5d..eb412fe 100644 --- a/bot/app/bot.py +++ b/bot/app/bot.py @@ -41,6 +41,24 @@ def get_queue_stats_text(queue: Queue) -> str: s = textbook.queue_stats.format(name=queue.name, count=len(queue.users)) return s +async def get_queue_from_state_data(call: types.CallbackQuery) -> Queue: + async with bot.retrieve_data( + user_id=call.from_user.id, chat_id=call.message.chat.id + ) as state_data: + queue_id = state_data.get("queue_id", None) + if not queue_id: + await bot.answer_callback_query( + callback_query_id=call.id, text=textbook.queue_operational_error + ) + return None + queue = session.query(Queue).filter_by(id=queue_id).first() + if queue.owner.id != call.from_user.id: + await bot.answer_callback_query( + callback_query_id=call.id, text=textbook.queue_operational_error + ) + return None + return queue + @bot.message_handler(commands=["start"]) async def start(msg: Message): @@ -58,7 +76,25 @@ async def start(msg: Message): await asyncio.sleep(2) await bot.set_state(user_id=msg.from_user.id, state=States.default) if len(msg.text.split()) > 1: - pass + command, queue_id = msg.text.split() + if queue := session.query(Queue).filter_by(id=queue_id).first(): + last_user = session.query(QueueUser).filter_by(queue_id=queue.id).order_by(QueueUser.position).first() + if last_user: + position = last_user.position + 1 + else: + position = 0 + queue_user = QueueUser( + user_id=msg.from_user.id, + queue_id=queue.id, + position=position + ) + session.add(queue_user) + session.commit() + await bot.send_message( + chat_id=msg.chat.id, + text=textbook.joined_queue.format(name=queue.name, position=queue_user.position), + parse_mode='html', + ) else: await bot.send_message( chat_id=msg.chat.id, @@ -135,39 +171,22 @@ async def queue_handler(call: types.CallbackQuery, queue_id: str = None): @bot.callback_query_handler(func=lambda c: c.data == "edit_queue_name") async def edit_queue_name_handler(call: types.CallbackQuery): - async with bot.retrieve_data( - user_id=call.from_user.id, chat_id=call.message.chat.id - ) as state_data: - queue_id = state_data.get("queue_id", None) - if not queue_id: - await bot.answer_callback_query( - callback_query_id=call.id, text=textbook.queue_operational_error + if await get_queue_from_state_data(call): + await bot.set_state(user_id=call.from_user.id, state=States.changing_queue_name) + await bot.edit_message_text( + chat_id=call.message.chat.id, + message_id=call.message.id, + text=textbook.edit_name, + reply_markup=keyboards.edit_name(), ) - return None - queue = session.query(Queue).filter_by(id=queue_id).first() - if queue.owner.id != call.from_user.id: - await bot.answer_callback_query( - callback_query_id=call.id, text=textbook.queue_operational_error - ) - return None - await bot.set_state(user_id=call.from_user.id, state=States.changing_queue_name) - await bot.edit_message_text( - chat_id=call.message.chat.id, - message_id=call.message.id, - text=textbook.edit_name, - reply_markup=keyboards.edit_name(), - ) @bot.callback_query_handler( func=lambda c: c.data == "cancel", state=States.changing_queue_name ) async def edit_queue_name_cancel_handler(call: types.CallbackQuery): - async with bot.retrieve_data( - user_id=call.from_user.id, chat_id=call.message.chat.id - ) as state_data: - queue_id = state_data.get("queue_id", None) - await queue_handler(call, queue_id) + if queue := get_queue_from_state_data(call): + await queue_handler(call, queue.id) @bot.message_handler(content_types=["text"], state=States.changing_queue_name) @@ -195,6 +214,43 @@ async def update_queue_name(msg: Message): parse_mode="html", ) +@bot.callback_query_handler(func=lambda c: c.data == "get_queue_users") +async def get_queue_users_handler(call: types.CallbackQuery): + if queue := await get_queue_from_state_data(call): + queue_users = session.query(QueueUser).filter_by(queue_id=queue.id).order_by(QueueUser.position).all() + users_str = "\n".join([f"{qu.position}. {qu.user.name}" for qu in queue_users]) + await bot.edit_message_text( + chat_id=call.message.chat.id, + message_id=call.message.id, + text=textbook.queue_users_list.format(name=queue.name, users_str=users_str), + reply_markup=keyboards.queue_users(queue.id), + parse_mode='html', + ) + await bot.answer_callback_query(callback_query_id=call.id) + + +@bot.callback_query_handler(func=lambda c: c.data == "get_queue_link") +async def get_queue_link_handler(call: types.CallbackQuery): + if queue := await get_queue_from_state_data(call): + await bot.send_message( + chat_id=call.message.chat.id, + text=textbook.link_template.format(link=queue.id) + ) + await bot.answer_callback_query(callback_query_id=call.id) + + +@bot.callback_query_handler(func=lambda c: c.data == "delete_queue") +async def delete_queue_handler(call: types.CallbackQuery): + if queue := await get_queue_from_state_data(call): + await bot.edit_message_text( + chat_id=call.message.chat.id, + message_id=call.message.id, + text=textbook.queue_users_list.format(name=queue.name, users_str=users_str), + reply_markup=keyboards.queue_users(queue.id), + parse_mode='html', + ) + await bot.answer_callback_query(callback_query_id=call.id) + @bot.callback_query_handler(func=lambda c: c.data == "settings") async def settings(call: types.CallbackQuery): diff --git a/bot/app/keyboards.py b/bot/app/keyboards.py index 08db791..4ca4a01 100644 --- a/bot/app/keyboards.py +++ b/bot/app/keyboards.py @@ -25,8 +25,9 @@ def my_queues(queues: list[Queue]) -> keyboard: def queue_menu() -> keyboard: return keyboard( keyboard=[ + [button(text="🔗 Ссылка для вступления", callback_data="get_queue_link")], [button(text="✏️ Изменить название", callback_data="edit_queue_name")], - [button(text="🫂 Список участников", callback_data="participants")], + [button(text="🫂 Список участников", callback_data="get_queue_users")], [button(text="❌ Удалить очередь", callback_data="delete_queue")], [button(text="⬅️ В меню", callback_data="to_menu")], ] @@ -48,3 +49,11 @@ def edit_name() -> keyboard: [button(text="❌ Отмена", callback_data="cancel")], ] ) + +def queue_users(queue_id: str) -> keyboard: + return keyboard( + keyboard=[ + [button(text="🔃 Поменять позиции", callback_data="change_positions")], + [button(text="⬅️ Назад", callback_data=f"q:{queue_id}")], + ] + ) diff --git a/bot/app/textbook.py b/bot/app/textbook.py index 531cbbd..a3111d7 100644 --- a/bot/app/textbook.py +++ b/bot/app/textbook.py @@ -17,6 +17,8 @@ edit_queue_name_success = "Имя очереди изменено!" edit_name_error = ( 'Новое имя не подходит под условия. Напиши подходящее, или нажми кнопку "❌ Отмена"' ) - +queue_users_list = "В очереди {name} следующие участники:\n\n{users_str}" +link_template = "https://t.me/q_ue_bot?start={link}" +joined_queue = "Ты присоединился к очереди {name}\nТвоя позиция: {position}\n\nКогда придет твоя очередь, я сообщу" about = "Бот для очередей.\n\nРазработчик - ollyhearn.\nЯ всегда открыт для вопросов и предложений: @OllyHearn\n\nv0.1.1"