diff --git a/.bot.pid b/.bot.pid index e22bc6c..79b6477 100644 --- a/.bot.pid +++ b/.bot.pid @@ -1 +1 @@ -992367 +1011501 diff --git a/main.py b/main.py index 6ff516b..5ea5a1e 100644 --- a/main.py +++ b/main.py @@ -118,10 +118,12 @@ async def main(): dp.include_router(admin_chat_router) # Админские команды чата dp.include_router(redraw_router) # Повторные розыгрыши dp.include_router(p2p_chat_router) # P2P чат между пользователями - dp.include_router(account_router) # Пользовательские счета - # 3. Chat router ПОСЛЕДНИМ (ловит все необработанные сообщения) - dp.include_router(chat_router) # Пользовательский чат (последним - ловит все сообщения) + # 3. Chat router для broadcast (ловит все необработанные сообщения) + dp.include_router(chat_router) # Пользовательский чат (broadcast всем) + + # 4. Account router ПОСЛЕДНИМ (обнаружение счетов для админов) + dp.include_router(account_router) # Пользовательские счета + обнаружение для админов # Запускаем polling try: diff --git a/src/handlers/chat_handlers.py b/src/handlers/chat_handlers.py index b667935..d5d4c18 100644 --- a/src/handlers/chat_handlers.py +++ b/src/handlers/chat_handlers.py @@ -105,6 +105,10 @@ async def forward_to_channel(message: Message, channel_id: str) -> tuple[bool, O @router.message(F.text) async def handle_text_message(message: Message): """Обработчик текстовых сообщений""" + import logging + 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'}") + # Проверяем является ли это командой if message.text and message.text.startswith('/'): # Список команд, которые НЕ нужно пересылать @@ -171,11 +175,13 @@ async def handle_text_message(message: Message): forwarded_ids=forwarded_ids ) - await message.answer( - f"✅ Сообщение разослано!\n" - f"📤 Доставлено: {success}\n" - f"❌ Не доставлено: {fail}" - ) + # Показываем статистику доставки только админам + if is_admin(message.from_user.id): + await message.answer( + f"✅ Сообщение разослано!\n" + f"📤 Доставлено: {success}\n" + f"❌ Не доставлено: {fail}" + ) elif settings.mode == 'forward': # Режим пересылки в канал @@ -237,7 +243,9 @@ async def handle_photo_message(message: Message): forwarded_ids=forwarded_ids ) - await message.answer(f"✅ Фото разослано: {success} получателей") + # Показываем статистику только админам + if is_admin(message.from_user.id): + await message.answer(f"✅ Фото разослано: {success} получателей") elif settings.mode == 'forward': if settings.forward_chat_id: @@ -289,7 +297,9 @@ async def handle_video_message(message: Message): forwarded_ids=forwarded_ids ) - await message.answer(f"✅ Видео разослано: {success} получателей") + # Показываем статистику только админам + if is_admin(message.from_user.id): + await message.answer(f"✅ Видео разослано: {success} получателей") elif settings.mode == 'forward': if settings.forward_chat_id: @@ -341,7 +351,9 @@ async def handle_document_message(message: Message): forwarded_ids=forwarded_ids ) - await message.answer(f"✅ Документ разослан: {success} получателей") + # Показываем статистику только админам + if is_admin(message.from_user.id): + await message.answer(f"✅ Документ разослан: {success} получателей") elif settings.mode == 'forward': if settings.forward_chat_id: @@ -393,7 +405,9 @@ async def handle_animation_message(message: Message): forwarded_ids=forwarded_ids ) - await message.answer(f"✅ Анимация разослана: {success} получателей") + # Показываем статистику только админам + if is_admin(message.from_user.id): + await message.answer(f"✅ Анимация разослана: {success} получателей") elif settings.mode == 'forward': if settings.forward_chat_id: @@ -444,7 +458,9 @@ async def handle_sticker_message(message: Message): forwarded_ids=forwarded_ids ) - await message.answer(f"✅ Стикер разослан: {success} получателей") + # Показываем статистику только админам + if is_admin(message.from_user.id): + await message.answer(f"✅ Стикер разослан: {success} получателей") elif settings.mode == 'forward': if settings.forward_chat_id: @@ -494,7 +510,9 @@ async def handle_voice_message(message: Message): forwarded_ids=forwarded_ids ) - await message.answer(f"✅ Голосовое сообщение разослано: {success} получателей") + # Показываем статистику только админам + if is_admin(message.from_user.id): + await message.answer(f"✅ Голосовое сообщение разослано: {success} получателей") elif settings.mode == 'forward': if settings.forward_chat_id: diff --git a/src/handlers/message_management.py b/src/handlers/message_management.py index 495eb19..2764a63 100644 --- a/src/handlers/message_management.py +++ b/src/handlers/message_management.py @@ -65,7 +65,18 @@ async def delete_message_callback(callback: CallbackQuery): await callback.answer(f"❌ Ошибка: {str(e)}", show_alert=True) -@message_admin_router.message(F.reply_to_message) +# Функция-фильтр для проверки триггерных слов +def is_delete_trigger(message: Message) -> bool: + """Проверяет, является ли сообщение триггером для удаления""" + if not message.text: + return False + + text_lower = message.text.lower().strip() + triggers = ["удалить", "delete", "del", "🗑️", "🗑", "❌"] + return any(trigger in text_lower for trigger in triggers) + + +@message_admin_router.message(F.reply_to_message, is_delete_trigger) async def quick_delete_replied_message(message: Message): """ Быстрое удаление сообщения по reply с триггерными словами или emoji @@ -79,18 +90,6 @@ async def quick_delete_replied_message(message: Message): if not is_admin(message.from_user.id): return # Не админ - пропускаем - if not message.text: - return # Нет текста - пропускаем - - # Проверяем триггерные слова/символы - text_lower = message.text.lower().strip() - triggers = ["удалить", "delete", "del", "🗑️", "🗑", "❌"] - - is_trigger = any(trigger in text_lower for trigger in triggers) - - if not is_trigger: - return # Не триггер - пропускаем - try: # Удаляем сообщение на которое ответили await message.reply_to_message.delete() diff --git a/src/handlers/p2p_chat.py b/src/handlers/p2p_chat.py index fcdbee1..c00c343 100644 --- a/src/handlers/p2p_chat.py +++ b/src/handlers/p2p_chat.py @@ -245,7 +245,7 @@ async def end_conversation(callback: CallbackQuery, state: FSMContext): @router.callback_query(F.data == "p2p:back_to_menu") -async def back_to_menu(callback: CallbackQuery): +async def back_to_menu(callback: CallbackQuery, state: FSMContext): """Вернуться в главное меню""" await callback.answer() @@ -253,13 +253,17 @@ async def back_to_menu(callback: CallbackQuery): fake_message = callback.message fake_message.from_user = callback.from_user - await show_chat_menu(fake_message, None) + await show_chat_menu(fake_message, state) # Обработчик сообщений в состоянии chatting @router.message(StateFilter(P2PChatStates.chatting), F.text | F.photo | F.video | F.document) async def handle_p2p_message(message: Message, state: FSMContext): """Обработка P2P сообщения от пользователя""" + import logging + logger = logging.getLogger(__name__) + logger.info(f"[P2P] handle_p2p_message вызван: user={message.from_user.id}, в состоянии P2P chatting") + data = await state.get_data() recipient_id = data.get("recipient_id") recipient_telegram_id = data.get("recipient_telegram_id")