feat: улучшен чат - все видят сообщения + быстрое удаление
All checks were successful
continuous-integration/drone/push Build is passing

- Все пользователи видят сообщения друг друга (как в обычном чате)
- Админ получает все сообщения для модерации
- Быстрое удаление: админ отвечает на сообщение словом 'удалить'/'del'/'-'
- Удаление происходит у всех получателей автоматически
- Команда удаления самоудаляется через 3 секунды
- Сохранена админ-панель для управления сообщениями
This commit is contained in:
2025-11-22 20:05:16 +09:00
parent 8e692d2f61
commit 931235ff36

View File

@@ -109,6 +109,73 @@ async def handle_text_message(message: Message):
logger = logging.getLogger(__name__)
logger.info(f"[CHAT] handle_text_message вызван: user={message.from_user.id}, text={message.text[:50] if message.text else 'None'}")
# БЫСТРОЕ УДАЛЕНИЕ: Если админ отвечает на сообщение словом "удалить"/"del"/"-"
if message.reply_to_message and is_admin(message.from_user.id):
if message.text and message.text.lower().strip() in ['удалить', 'del', '-']:
async with async_session_maker() as session:
# Ищем сообщение в БД по telegram_message_id
msg_to_delete = await ChatMessageService.get_message_by_telegram_id(
session,
telegram_message_id=message.reply_to_message.message_id
)
if msg_to_delete:
# Получаем админа
admin = await UserService.get_user_by_telegram_id(
session,
message.from_user.id
)
# Помечаем как удаленное
success = await ChatMessageService.mark_as_deleted(
session,
msg_to_delete.id,
admin.id if admin else None
)
if success:
# Удаляем у всех получателей
deleted_count = 0
if msg_to_delete.forwarded_message_ids:
for user_tg_id, tg_msg_id in msg_to_delete.forwarded_message_ids.items():
try:
await message.bot.delete_message(
chat_id=int(user_tg_id),
message_id=tg_msg_id
)
deleted_count += 1
except Exception as e:
logger.warning(f"Не удалось удалить {tg_msg_id} у {user_tg_id}: {e}")
# Удаляем оригинал у отправителя
try:
await message.bot.delete_message(
chat_id=msg_to_delete.sender.telegram_id,
message_id=msg_to_delete.telegram_message_id
)
deleted_count += 1
except Exception as e:
logger.warning(f"Не удалось удалить оригинал: {e}")
# Удаляем команду админа
try:
await message.delete()
except:
pass
# Отправляем уведомление (самоудаляющееся)
notification = await message.answer(f"✅ Сообщение удалено у {deleted_count} получателей")
await asyncio.sleep(3)
try:
await notification.delete()
except:
pass
return
else:
await message.answer("❌ Сообщение не найдено в БД")
return
# Проверяем является ли это командой
if message.text and message.text.startswith('/'):
# Список команд, которые НЕ нужно пересылать
@@ -231,8 +298,12 @@ async def handle_photo_message(message: Message):
photo = message.photo[-1]
if settings.mode == 'broadcast':
# НЕ исключаем отправителя - админ должен видеть все сообщения
forwarded_ids, success, fail = await broadcast_message_with_scheduler(message, exclude_user_id=None)
# Отправляем только админам
forwarded_ids, success, fail = await broadcast_message_with_scheduler(
message,
exclude_user_id=message.from_user.id,
admin_only=True
)
await ChatMessageService.save_message(
session,
@@ -246,7 +317,7 @@ async def handle_photo_message(message: Message):
# Показываем статистику только админам
if is_admin(message.from_user.id):
await message.answer(f"✅ Фото разослано: {success} получателей")
await message.answer(f"✅ Фото отправлено админам: {success}")
elif settings.mode == 'forward':
if settings.forward_chat_id: