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