Skip to content

Commit

Permalink
fix/removing-messages-once-pushed
Browse files Browse the repository at this point in the history
Реализовано удаление сообщений с кнопками при вызове хэндлеров этих кнопок. Тикет #121

Добавлен файл src.bot.utils.py, где добавлен декоратор для оборачивания функций, в которых реализуется отправка новых сообщений с инлайн-клавиатурами.

Для хэндлеров форм обратной связи декоратор пока не довлен, так как их работа не может быть завершена корректно.

Co-authored-by: ConstConstantin <[email protected]>
Co-authored-by: Nikita <[email protected]>
  • Loading branch information
3 people authored Jul 17, 2023
1 parent 4e2769f commit 2279c50
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 7 deletions.
2 changes: 2 additions & 0 deletions src/bot/handlers/categories.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
from src.bot.keyboards import get_categories_keyboard, get_open_tasks_and_menu_keyboard
from src.bot.services.category import CategoryService
from src.bot.services.user import UserService
from src.bot.utils import delete_previous_message
from src.core.logging.utils import logger_decor


@logger_decor
@delete_previous_message
async def categories_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_service = UserService()
category_service = CategoryService()
Expand Down
4 changes: 4 additions & 0 deletions src/bot/handlers/menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from src.bot.constants import callback_data, commands, enum, patterns
from src.bot.keyboards import get_back_menu, get_menu_keyboard, get_no_mailing_keyboard
from src.bot.services.user import UserService
from src.bot.utils import delete_previous_message
from src.core.logging.utils import logger_decor
from src.core.services.email import EmailProvider
from src.settings import settings
Expand All @@ -27,6 +28,7 @@


@logger_decor
@delete_previous_message
async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Возвращает в меню."""
await context.bot.send_message(
Expand All @@ -37,6 +39,7 @@ async def menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):


@logger_decor
@delete_previous_message
async def set_mailing(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Включение/выключение подписки пользователя на почтовую рассылку."""
telegram_id = update.effective_user.id
Expand Down Expand Up @@ -119,6 +122,7 @@ async def web_app_data(update: Update):


@logger_decor
@delete_previous_message
async def about_project(update: Update, context: ContextTypes.DEFAULT_TYPE):
await context.bot.send_message(
chat_id=update.effective_chat.id,
Expand Down
2 changes: 2 additions & 0 deletions src/bot/handlers/registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from src.bot.constants import callback_data, commands
from src.bot.keyboards import get_confirm_keyboard, get_start_keyboard
from src.bot.services.user import UserService
from src.bot.utils import delete_previous_message
from src.core.logging.utils import logger_decor


Expand Down Expand Up @@ -34,6 +35,7 @@ async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):


@logger_decor
@delete_previous_message
async def confirm_chosen_categories(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = get_confirm_keyboard()

Expand Down
3 changes: 3 additions & 0 deletions src/bot/handlers/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
)
from src.bot.services.category import CategoryService
from src.bot.services.task import TaskService
from src.bot.utils import delete_previous_message
from src.core.logging.utils import logger_decor
from src.core.utils import display_tasks

Expand Down Expand Up @@ -70,6 +71,7 @@ async def back_subcategory_callback(update: Update, context: ContextTypes.DEFAUL


@logger_decor
@delete_previous_message
async def view_task_callback(update: Update, context: CallbackContext, limit: int = 3):
task_service = TaskService()
tasks_to_show, offset, page_number = await task_service.get_user_tasks_by_page(
Expand All @@ -84,6 +86,7 @@ async def view_task_callback(update: Update, context: CallbackContext, limit: in
await show_next_tasks(update, context, limit, offset, page_number)


@delete_previous_message
async def show_next_tasks(update: Update, context: CallbackContext, limit: int, offset: int, page_number: int):
task_service = TaskService()
remaining_tasks = await task_service.get_remaining_user_tasks_count(limit, offset)
Expand Down
24 changes: 24 additions & 0 deletions src/bot/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from collections.abc import Awaitable, Callable
from functools import wraps
from typing import ParamSpec, TypeVar

from telegram import Update

ReturnType = TypeVar("ReturnType")
ParameterTypes = ParamSpec("ParameterTypes")


def delete_previous_message(
coroutine: Callable[ParameterTypes, Awaitable[ReturnType]]
) -> Callable[ParameterTypes, Awaitable[ReturnType]]:
"""Декоратор для функций, отправляющих новые сообщения с inline-кнопками.
После выполнения оборачиваемой функции удаляет сообщение с inline-кнопкой,
нажатие на которую повлекло вызов оборачиваемой функции."""

@wraps(coroutine)
async def wrapper(update: Update, *args: ParameterTypes.args, **kwargs: ParameterTypes.kwargs) -> ReturnType:
result = await coroutine(update, *args, **kwargs)
await update.callback_query.message.delete()
return result

return wrapper
27 changes: 20 additions & 7 deletions src/core/logging/utils.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
from collections.abc import Awaitable, Callable
from functools import wraps
from typing import ParamSpec, TypeVar

import structlog

ReturnType = TypeVar("ReturnType")
ParameterTypes = ParamSpec("ParameterTypes")

async def logging_updates(*args, **kwargs):
await log.ainfo("Следующие Updates не были пойманы ни одним из обработчиков", args=args, kwargs=kwargs)
log = structlog.get_logger()


log = structlog.get_logger()
async def logging_updates(*args, **kwargs):
await log.ainfo("Следующие Updates не были пойманы ни одним из обработчиков", args=args, kwargs=kwargs)


def logger_decor(func):
async def wrapper(*args, **kwargs):
await log.ainfo(f"Запущенна функция {func.__name__}", args=args, kwargs=kwargs)
return await func(*args, **kwargs)
def logger_decor(
coroutine: Callable[ParameterTypes, Awaitable[ReturnType]]
) -> Callable[ParameterTypes, Awaitable[ReturnType]]:
@wraps(coroutine)
async def wrapper(*args: ParameterTypes.args, **kwargs: ParameterTypes.kwargs) -> ReturnType:
await log.ainfo(
f"Запущенна функция {coroutine.__name__}",
args=args,
kwargs=kwargs,
)
return await coroutine(*args, **kwargs)

return wrapper

0 comments on commit 2279c50

Please sign in to comment.