diff --git a/src/dutylog/application/bot/user_dialogs/main_menu_dialog.py b/src/dutylog/application/bot/user_dialogs/main_menu_dialog.py index db1d295..c66a4ea 100644 --- a/src/dutylog/application/bot/user_dialogs/main_menu_dialog.py +++ b/src/dutylog/application/bot/user_dialogs/main_menu_dialog.py @@ -4,6 +4,7 @@ from dutylog.application.bot.user_dialogs.user_menu.main_menu import main_menu_w from dutylog.application.bot.user_dialogs.user_menu.history import history_window from dutylog.application.bot.user_dialogs.user_menu.top_residents import top_residents_window from dutylog.application.bot.user_dialogs.user_menu.faq import faq_window +from dutylog.application.bot.user_dialogs.user_menu.feedback import feedback_window main_menu_dialog = Dialog( @@ -11,4 +12,5 @@ main_menu_dialog = Dialog( history_window, top_residents_window, faq_window, + feedback_window, ) diff --git a/src/dutylog/application/bot/user_dialogs/states.py b/src/dutylog/application/bot/user_dialogs/states.py index 1a5935f..a86356b 100644 --- a/src/dutylog/application/bot/user_dialogs/states.py +++ b/src/dutylog/application/bot/user_dialogs/states.py @@ -6,6 +6,7 @@ class MainMenuSG(StatesGroup): history = State() top_residents = State() faq = State() + feedback = State() class AdminMenuSG(StatesGroup): diff --git a/src/dutylog/application/bot/user_dialogs/user_menu/feedback.py b/src/dutylog/application/bot/user_dialogs/user_menu/feedback.py new file mode 100644 index 0000000..ddb8c19 --- /dev/null +++ b/src/dutylog/application/bot/user_dialogs/user_menu/feedback.py @@ -0,0 +1,60 @@ +from aiogram import Bot +from aiogram.types import Message +from aiogram_dialog import Window, DialogManager +from aiogram_dialog.widgets.text import Const +from aiogram_dialog.widgets.kbd import SwitchTo +from aiogram_dialog.widgets.input import MessageInput +from dishka import FromDishka +from dishka.integrations.aiogram_dialog import inject + +from dutylog.application.bot.user_dialogs.states import MainMenuSG +from dutylog.infrastructure.database.repositories.users_repository import UsersRepository +from dutylog.infrastructure.database.repositories.residents_repository import ResidentsRepository +from dutylog.infrastructure.utils.config import Config + + +@inject +async def on_feedback_message( + message: Message, + widget: MessageInput, + dialog_manager: DialogManager, + users_repository: FromDishka[UsersRepository], + residents_repository: FromDishka[ResidentsRepository], + config: FromDishka[Config], +) -> None: + assert message.bot + bot: Bot = message.bot + + user = await users_repository.get_user_by_id(message.from_user.id) + resident = await residents_repository.get_resident_by_user_id(message.from_user.id) + + username = f"@{user.username}" if user and user.username else "без username" + name = resident.real_name if resident and resident.real_name else (user.first_name if user and user.first_name else "Неизвестно") + + meta = ( + f"📬 Обратная связь\n\n" + f"👤 {name} ({username})\n" + f"🆔 {message.from_user.id}" + ) + + await bot.send_message(config.bot.creator_id, meta) + await bot.copy_message( + chat_id=config.bot.creator_id, + from_chat_id=message.chat.id, + message_id=message.message_id, + ) + + await message.answer("✅ Сообщение отправлено. Спасибо за обратную связь!") + await dialog_manager.switch_to(MainMenuSG.main) + + +feedback_window = Window( + Const( + "💬 Обратная связь\n\n" + "Напишите ваше сообщение — предложение по улучшению, вопрос, жалоба или что угодно ещё.\n\n" + "🔒 Сообщение полностью анонимно." + ), + MessageInput(on_feedback_message), + SwitchTo(Const("◀️ Назад"), id="back_from_feedback", state=MainMenuSG.main), + state=MainMenuSG.feedback, +) diff --git a/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py b/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py index 9f6cf6a..994239d 100644 --- a/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py +++ b/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py @@ -137,6 +137,12 @@ main_menu_window = Window( state=MainMenuSG.faq, when="is_regular_user", ), + SwitchTo( + Const("💬 Обратная связь"), + id="feedback_btn", + state=MainMenuSG.feedback, + when="is_regular_user", + ), state=MainMenuSG.main, getter=get_main_menu_data, )