checkpoint
This commit is contained in:
110
bot/app/bot.py
110
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):
|
||||
|
||||
@ -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}")],
|
||||
]
|
||||
)
|
||||
|
||||
@ -17,6 +17,8 @@ edit_queue_name_success = "Имя очереди изменено!"
|
||||
edit_name_error = (
|
||||
'Новое имя не подходит под условия. Напиши подходящее, или нажми кнопку "❌ Отмена"'
|
||||
)
|
||||
|
||||
queue_users_list = "В очереди <b>{name}</b> следующие участники:\n\n{users_str}"
|
||||
link_template = "https://t.me/q_ue_bot?start={link}"
|
||||
joined_queue = "Ты присоединился к очереди <b>{name}</b>\nТвоя позиция: <b>{position}</b>\n\nКогда придет твоя очередь, я сообщу"
|
||||
|
||||
about = "Бот для очередей.\n\nРазработчик - ollyhearn.\nЯ всегда открыт для вопросов и предложений: @OllyHearn\n\nv0.1.1"
|
||||
|
||||
Reference in New Issue
Block a user