This commit is contained in:
ollyhearn
2023-06-08 20:33:05 +03:00
parent 26c78d3550
commit e315648bc5
3 changed files with 128 additions and 21 deletions

View File

@ -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))

View File

@ -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")],
]
)

View File

@ -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 = "Новое имя не подходит под условия. Напиши подходящее, или нажми кнопку \"❌ Отмена\""