This commit is contained in:
2026-03-18 10:16:39 +03:00
parent b9cd26abf1
commit a7667c703b
2 changed files with 47 additions and 9 deletions
+2
View File
@@ -12,6 +12,7 @@ from dutylog.application.bot.user_handlers import router as user_router
from dutylog.application.bot.user_dialogs import main_menu_dialog from dutylog.application.bot.user_dialogs import main_menu_dialog
from dutylog.application.bot.admin_dialogs import admin_menu_dialog from dutylog.application.bot.admin_dialogs import admin_menu_dialog
from dutylog.application.bot.user_dialogs.registration_dialog import registration_dialog from dutylog.application.bot.user_dialogs.registration_dialog import registration_dialog
from dutylog.application.bot.user_dialogs.user_menu.feedback import feedback_router
from dutylog.infrastructure.ioc import ( from dutylog.infrastructure.ioc import (
ConfigProvider, ConfigProvider,
DatabaseProvider, DatabaseProvider,
@@ -46,6 +47,7 @@ async def main():
) )
dp.include_router(user_router) dp.include_router(user_router)
dp.include_router(feedback_router)
dp.include_router(main_menu_dialog) dp.include_router(main_menu_dialog)
dp.include_router(admin_menu_dialog) dp.include_router(admin_menu_dialog)
dp.include_router(registration_dialog) dp.include_router(registration_dialog)
@@ -1,5 +1,7 @@
from aiogram import Bot from aiogram import Bot, Router, F
from aiogram.types import Message from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
from aiogram_dialog import Window, DialogManager from aiogram_dialog import Window, DialogManager
from aiogram_dialog.widgets.text import Const from aiogram_dialog.widgets.text import Const
from aiogram_dialog.widgets.kbd import SwitchTo from aiogram_dialog.widgets.kbd import SwitchTo
@@ -13,6 +15,13 @@ from dutylog.infrastructure.database.repositories.residents_repository import Re
from dutylog.infrastructure.utils.config import Config from dutylog.infrastructure.utils.config import Config
class FeedbackReplySG(StatesGroup):
waiting_reply = State()
feedback_router = Router()
@inject @inject
async def on_feedback_message( async def on_feedback_message(
message: Message, message: Message,
@@ -22,8 +31,7 @@ async def on_feedback_message(
residents_repository: FromDishka[ResidentsRepository], residents_repository: FromDishka[ResidentsRepository],
config: FromDishka[Config], config: FromDishka[Config],
) -> None: ) -> None:
assert message.bot bot: Bot = dialog_manager.middleware_data["bot"]
bot: Bot = message.bot
user = await users_repository.get_user_by_id(message.from_user.id) 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) resident = await residents_repository.get_resident_by_user_id(message.from_user.id)
@@ -31,13 +39,21 @@ async def on_feedback_message(
username = f"@{user.username}" if user and user.username else "без username" 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 "Неизвестно") name = resident.real_name if resident and resident.real_name else (user.first_name if user and user.first_name else "Неизвестно")
meta = ( reply_markup = InlineKeyboardMarkup(inline_keyboard=[[
InlineKeyboardButton(
text="↩️ Ответить",
callback_data=f"feedback_reply:{message.from_user.id}",
)
]])
await bot.send_message(
config.bot.creator_id,
f"📬 <b>Обратная связь</b>\n\n" f"📬 <b>Обратная связь</b>\n\n"
f"👤 {name} ({username})\n" f"👤 {name} ({username})\n"
f"🆔 <code>{message.from_user.id}</code>" f"🆔 <code>{message.from_user.id}</code>",
reply_markup=reply_markup,
) )
await bot.send_message(config.bot.creator_id, meta)
await bot.copy_message( await bot.copy_message(
chat_id=config.bot.creator_id, chat_id=config.bot.creator_id,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
@@ -48,11 +64,31 @@ async def on_feedback_message(
await dialog_manager.switch_to(MainMenuSG.main) await dialog_manager.switch_to(MainMenuSG.main)
@feedback_router.callback_query(F.data.startswith("feedback_reply:"))
async def on_reply_click(callback: CallbackQuery, state: FSMContext) -> None:
user_id = int(callback.data.split(":")[1])
await state.set_state(FeedbackReplySG.waiting_reply)
await state.update_data(reply_to_user_id=user_id)
await callback.message.answer("✏️ Напишите ответ пользователю:")
await callback.answer()
@feedback_router.message(FeedbackReplySG.waiting_reply)
async def on_reply_message(message: Message, state: FSMContext) -> None:
data = await state.get_data()
user_id = data["reply_to_user_id"]
await message.bot.send_message(user_id, "✅ <b>Ответ от администрации</b> ⬇️")
await message.copy_to(user_id)
await state.clear()
await message.answer("✅ Ответ отправлен пользователю.")
feedback_window = Window( feedback_window = Window(
Const( Const(
"💬 <b>Обратная связь</b>\n\n" "📬 <b>Обратная связь</b>\n\n"
"Напишите ваше сообщение — предложение по улучшению, вопрос, жалоба или что угодно ещё.\n\n" "Напишите ваше сообщение — предложение по улучшению, вопрос, жалоба или что угодно ещё.\n\n"
"<i>🔒 Сообщение полностью анонимно.</i>" "<i>🔒 Сообщение анонимно для других пользователей и передаётся только администрации.</i>"
), ),
MessageInput(on_feedback_message), MessageInput(on_feedback_message),
SwitchTo(Const("◀️ Назад"), id="back_from_feedback", state=MainMenuSG.main), SwitchTo(Const("◀️ Назад"), id="back_from_feedback", state=MainMenuSG.main),