From e315648bc5d17d111b7207009ed80e15aee38bf2 Mon Sep 17 00:00:00 2001 From: ollyhearn Date: Thu, 8 Jun 2023 20:33:05 +0300 Subject: [PATCH] a --- bot/app/bot.py | 123 ++++++++++++++++++++++++++++++++++++------- bot/app/keyboards.py | 16 ++++++ bot/app/textbook.py | 10 +++- 3 files changed, 128 insertions(+), 21 deletions(-) diff --git a/bot/app/bot.py b/bot/app/bot.py index c6f415a..fc0f867 100644 --- a/bot/app/bot.py +++ b/bot/app/bot.py @@ -33,6 +33,8 @@ bot = AsyncTeleBot(token, state_storage=StatePickleStorage()) class States(StatesGroup): default = State() + changing_name = State() + changing_queue_name = State() def get_queue_stats_text(queue: Queue) -> str: @@ -45,24 +47,33 @@ async def start(msg: Message): if msg.chat.type == "private": user = session.query(User).filter_by(id=msg.from_user.id).first() if not user: - new_user = User( + user = User( id=msg.from_user.id, name=msg.from_user.first_name, username=msg.from_user.username, ) - session.add(new_user) + session.add(user) session.commit() await bot.send_message(chat_id=msg.chat.id, text=textbook.start) + await asyncio.sleep(2) await bot.set_state(user_id=msg.from_user.id, state=States.default) - await bot.send_message( - chat_id=msg.chat.id, text=textbook.menu, reply_markup=keyboards.menu() - ) + if len(msg.text.split()) > 1: + pass + else: + await bot.send_message( + chat_id=msg.chat.id, text=textbook.menu.format(name=user.name), reply_markup=keyboards.menu() + ) + @bot.callback_query_handler(func=lambda c: c.data == "to_menu") async def to_menu_handler(call: types.CallbackQuery): + user = session.query(User).filter_by(id=call.from_user.id).first() await bot.set_state(user_id=call.from_user.id, state=States.default) - await bot.send_message( - chat_id=call.message.chat.id, text=textbook.menu, reply_markup=keyboards.menu() + await bot.edit_message_text( + chat_id=call.message.chat.id, + message_id=call.message.id, + text=textbook.menu.format(name=user.name), + reply_markup=keyboards.menu(), ) @bot.callback_query_handler(func=lambda c: c.data == "new_queue") @@ -71,7 +82,7 @@ async def new_queue_handler(call: types.CallbackQuery): if user: if len(user.owns_queues) < 4: queue = Queue(owner_id=call.from_user.id) - sessio.add(queue) + session.add(queue) session.commit() await bot.answer_callback_query( callback_query_id=call.id, @@ -99,8 +110,8 @@ async def my_queues_handler(call: types.CallbackQuery): @bot.callback_query_handler(func=lambda c: c.data[:2] == "q:") -async def edit_queue_handler(call: types.CallbackQuery): - queue_id = call.data[:2] +async def queue_handler(call: types.CallbackQuery, queue_id: str = None): + queue_id = call.data[2:] if not queue_id else queue_id queue = session.query(Queue).filter_by(id=queue_id).first() if not queue: await bot.answer_callback_query( @@ -110,7 +121,7 @@ async def edit_queue_handler(call: types.CallbackQuery): async with bot.retrieve_data( user_id=call.from_user.id, chat_id=call.message.chat.id ) as state_data: - state_data["queue"] = call.data[2:] + state_data["queue_id"] = queue_id await bot.edit_message_text( chat_id=call.message.chat.id, message_id=call.message.id, @@ -120,16 +131,85 @@ async def edit_queue_handler(call: types.CallbackQuery): await bot.answer_callback_query(callback_query_id=call.id) -@bot.message_handler(commands=["new_queue"]) -async def nq(msg: Message): - user = session.query(User).filter_by(id=msg.from_user.id).first() - queue = Queue(owner_id=user.id) - session.add(queue) - session.commit() - await bot.send_message( - chat_id=msg.chat.id, text=f"Создана новая очередь: {queue.id}" +@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 + ) + 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) + + +@bot.callback_query_handler(func=lambda c: c.data == "settings") +async def settings(call: types.CallbackQuery): + await bot.set_state(user_id=call.from_user.id, state=States.default) + await bot.edit_message_text( + chat_id=call.message.chat.id, + message_id=call.message.id, + text=textbook.settings, + reply_markup=keyboards.settings(), + ) + + + + + +@bot.callback_query_handler(func=lambda c: c.data == "edit_name") +async def edit_name_handler(call: types.CallbackQuery): + await bot.set_state(user_id=call.from_user.id, state=States.changing_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_name) +async def edit_name_cancel_handler(call: types.CallbackQuery): + await settings(call) + + +@bot.message_handler(content_types=["text"], state=States.changing_name) +async def update_name(msg: Message): + if len(msg.text) > 40 or "\n" in msg.text: + await bot.send_message( + chat_id=msg.chat.id, text=textbook.edit_name_error + ) + return None + user = session.query(User).filter_by(id=msg.from_user.id).first() + setattr(user, "name", msg.text) + session.commit() + await bot.send_message( + chat_id=msg.chat.id, text=textbook.edit_name_success + ) + await asyncio.sleep(1) + await start(msg) @bot.message_handler(commands=["take_part"]) async def tp(msg: Message): @@ -160,6 +240,11 @@ async def q(msg: Message): else: await bot.send_message(chat_id=msg.chat.id, text="Очередь не найдена!") +@bot.message_handler(commands=["mystate"]) +async def mystate(msg): + state = await bot.get_state(user_id=msg.from_user.id) + await bot.send_message(chat_id=msg.from_user.id, text=state) + async def main(): a = asyncio.create_task(bot.polling(non_stop=True)) diff --git a/bot/app/keyboards.py b/bot/app/keyboards.py index 67d9eb3..739f06a 100644 --- a/bot/app/keyboards.py +++ b/bot/app/keyboards.py @@ -10,6 +10,7 @@ def menu() -> keyboard: keyboard=[ [button(text="➕ Новая очередь", callback_data="new_queue")], [button(text="📋 Мои очереди", callback_data="my_queues")], + [button(text="🔧 Настройки", callback_data="settings")], [button(text="ℹ️ О боте", callback_data="about")], ] ) @@ -30,3 +31,18 @@ def queue_menu() -> keyboard: [button(text="⬅️ В меню", callback_data="to_menu")], ] ) + +def settings() -> keyboard: + return keyboard( + keyboard=[ + [button(text="✏️ Поменять свое имя", callback_data="edit_name")], + [button(text="⬅️ В меню", callback_data="to_menu")], + ] + ) + +def edit_name() -> keyboard: + return keyboard( + keyboard=[ + [button(text="❌ Отмена", callback_data="settings")], + ] + ) diff --git a/bot/app/textbook.py b/bot/app/textbook.py index 5858355..beaa471 100644 --- a/bot/app/textbook.py +++ b/bot/app/textbook.py @@ -1,9 +1,15 @@ start = "Привет! Я помогу тебе вести очередность людей! Это бывает очень полезно для сдачи работ, к примеру, когда люди договариваются в разных чатах, а ближе к сдаче получается путаница. Ты можешь создавать очереди, отправлять ссылки на вступление, менять очередноcть, создавать очереди в групповых чатах и т.д.!" start_group = "Привет, я QUEUEBOT 2.0, помогаю создавать очереди в твоих групповых чатах!\n\nЧтобы пользоваться мной в этом чате, пользователь с правами админа должен настроить меня, комманда /settings, также не забудь выдать мне права администратора, чтобы я мог видеть список участников этой группы!" -menu = "Главное меню" +menu = "Привет, {name}! Ты в главном меню" new_queue_created = ( 'Создана новая очередь: {id}. Редактировать ее можно в меню "➕ Новая очередь"' ) queue_limit = "Ты достиг лимита очередей (4). Удали свои очереди, или воспользуйся другим аккаунтом!" -my_queues_list = "У тебя {count} очереди/ей" +my_queues_list = "У тебя {count} очередь/и/ей" error = "Произошла непредвиденная ошибка!" +queue_operational_error = "Произошла ошибка! Либо вы не являетесь владельцем очереди, либо данные устарели и вам следует заново выбрать очередь в меню!" +edit_queue_name = "Введи новое имя очереди, имя должно быть не длинее 40 символов и не должно содержать переносов строки" +settings = "🛠 Меню настроек" +edit_name = "Ты можешь поменять свое имя, которое будет отображаться в очередях. По умолчанию используется твое имя в Телеграме. Имя должно быть не длинее 40 символов и не иметь переносов строки. Пришли мне новое имя, или нажми кнопку \"❌ Отмена\"" +edit_name_success = "Имя изменено!" +edit_name_error = "Новое имя не подходит под условия. Напиши подходящее, или нажми кнопку \"❌ Отмена\""