diff --git a/src/handlers/chat_handlers.py b/src/handlers/chat_handlers.py index 2f96ce9..2c6954a 100644 --- a/src/handlers/chat_handlers.py +++ b/src/handlers/chat_handlers.py @@ -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: