Skip to content

Commit

Permalink
Обновление для кнопки menu (#224)
Browse files Browse the repository at this point in the history
Co-authored-by: Konstantin Raikhert <[email protected]>
  • Loading branch information
valerashankorenko and KonstantinRaikhert authored Aug 20, 2024
1 parent be192ab commit 22986d6
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 23 deletions.
97 changes: 75 additions & 22 deletions src/bot/bot_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,25 @@
import time
from typing import Self

from asgiref.sync import sync_to_async
from django.conf import settings
from loguru import logger
from telegram import Update, BotCommand, MenuButtonCommands
from telegram.ext import (
Application, ApplicationBuilder,
CallbackQueryHandler, ConversationHandler,
PersistenceInput, MessageHandler, filters,
)
from bot.handlers import (
start_handler, help_handler, feedback_handler,
success_registration_webapp_handler, schedule_handler,
lesson_end_handler, left_lessons_handler, unknown_command_handler,
)
from bot.handlers.feedback import subject, body
from telegram import (BotCommand, BotCommandScopeChat, MenuButtonCommands,
Update)
from telegram.ext import (Application, ApplicationBuilder,
CallbackQueryHandler, ConversationHandler,
MessageHandler, PersistenceInput, filters)

from bot.handlers import (feedback_handler, help_handler, left_lessons_handler,
lesson_end_handler, schedule_handler, start_handler,
success_registration_webapp_handler,
unknown_command_handler)
from bot.handlers.conversation import help, schedule
from bot.states import UserStates
from bot.handlers.feedback import body, subject
from bot.persistence import DjangoPersistence
from bot.states import UserStates
from bot.utils import add_daily_task
from schooling.models import Student, Teacher

PERSISTENCE_UPDATE_DELAY = 5

Expand Down Expand Up @@ -84,23 +85,65 @@ async def _build_app(self):
lesson_end_handler,
left_lessons_handler,
])
await app.bot.delete_my_commands()
await self._update_bot_commands(app)
logger.info('Bot application built with handlers.')
return app

async def _update_bot_commands(self, app):
"""Update bot commands to be shown in the menu."""
commands = [
BotCommand('start', 'Запустить бот'),
BotCommand('help', 'Помощь'),
BotCommand('feedback', 'Отправить отзыв'),
"""Обновление команд меню бота."""
unregistered_commands = [
BotCommand('start', 'Запустить бота'),
BotCommand('help', 'Необходима регистрация'),
]

teacher_commands = [
BotCommand('start', 'Запустить бота'),
BotCommand('schedule', 'Просмотреть расписание'),
# Сюда добавлять новые комманды
BotCommand('feedback', 'Отправить отзыв'),
BotCommand('help', 'Все доступные команды бота'),
]

student_commands = teacher_commands + [
BotCommand('left_lessons', 'Оставшиеся уроки'),
]

await app.bot.set_my_commands(commands)
await app.bot.set_chat_menu_button(chat_id=None,
menu_button=MenuButtonCommands())
async def set_commands_for_users(users, commands):
for user in users:
try:
# Попробуем установить команды для пользователя
await app.bot.set_my_commands(
commands, scope=BotCommandScopeChat(
chat_id=user.telegram_id))
await app.bot.set_chat_menu_button(
chat_id=user.telegram_id,
menu_button=MenuButtonCommands())
except Exception as e:
if 'Chat not found' in str(e):
logger.warning(
f'Пропуск пользователя '
f'{user.telegram_id}: Чат не найден')
else:
logger.error(
f'Ошибка при установке команд для '
f'пользователя {user.telegram_id}: {e}')

try:
await app.bot.delete_my_commands()
await app.bot.set_my_commands(unregistered_commands)
await app.bot.set_chat_menu_button(
chat_id=None, menu_button=MenuButtonCommands())

teachers = await sync_to_async(list)(Teacher.objects.all())
students = await sync_to_async(list)(Student.objects.all())

await set_commands_for_users(teachers, teacher_commands)
await set_commands_for_users(students, student_commands)

logger.info('Команды бота успешно обновлены для всех ролей.')

except Exception as e:
logger.error(f'Ошибка при обновлении команд бота: {e}')

def _run(self):
"""Run the bot."""
Expand All @@ -121,12 +164,22 @@ async def _start_bot(self):
await self._app.updater.start_polling(allowed_updates=Update.ALL_TYPES)
await self._app.start()
logger.info('Bot is running.')

# Запуск периодического обновления команд
asyncio.create_task(self._periodic_update_bot_commands())

while not self._stop_event.is_set():
await asyncio.sleep(1)

await self._app.stop()
logger.info('Bot stopped.')

async def _periodic_update_bot_commands(self):
"""Периодически обновлять команды бота."""
while not self._stop_event.is_set():
await self._update_bot_commands(self._app)
await asyncio.sleep(10) # Обновлять команды каждые 10 секунд

async def get_app(self):
"""Public method to get the application instance."""
if self._app is None:
Expand Down
5 changes: 4 additions & 1 deletion src/bot/handlers/success_registration.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# TODO: Нам не нужен этот хендлер в виде команды. Он нам нужен как обработчик
from telegram import Update, ReplyKeyboardRemove
from telegram import Bot, Update, ReplyKeyboardRemove
from telegram.ext import ContextTypes, MessageHandler, filters

from bot.messages_texts.constants import REGISTRATION_SUCCESS_MSG
Expand All @@ -25,6 +25,9 @@ async def success_registration_webapp(
chat_id=telegram_id,
message_id=registration_message_id,
)
# Обновляем команды меню для пользователя
bot_instance = Bot()
await bot_instance._update_bot_commands(update.effective_chat)

success_registration_webapp_handler = MessageHandler(
filters.StatusUpdate.WEB_APP_DATA,
Expand Down

0 comments on commit 22986d6

Please sign in to comment.