fix: исправлена блокировка broadcast и отключена статистика для обычных пользователей
- Исправлен порядок роутеров: account_router перемещён после chat_router - Добавлен фильтр is_delete_trigger для quick_delete (перехватывал все сообщения) - Статистика доставки теперь показывается только админам - Обычные пользователи больше не видят 'Сообщение разослано' после отправки
This commit is contained in:
8
main.py
8
main.py
@@ -118,10 +118,12 @@ async def main():
|
|||||||
dp.include_router(admin_chat_router) # Админские команды чата
|
dp.include_router(admin_chat_router) # Админские команды чата
|
||||||
dp.include_router(redraw_router) # Повторные розыгрыши
|
dp.include_router(redraw_router) # Повторные розыгрыши
|
||||||
dp.include_router(p2p_chat_router) # P2P чат между пользователями
|
dp.include_router(p2p_chat_router) # P2P чат между пользователями
|
||||||
dp.include_router(account_router) # Пользовательские счета
|
|
||||||
|
|
||||||
# 3. Chat router ПОСЛЕДНИМ (ловит все необработанные сообщения)
|
# 3. Chat router для broadcast (ловит все необработанные сообщения)
|
||||||
dp.include_router(chat_router) # Пользовательский чат (последним - ловит все сообщения)
|
dp.include_router(chat_router) # Пользовательский чат (broadcast всем)
|
||||||
|
|
||||||
|
# 4. Account router ПОСЛЕДНИМ (обнаружение счетов для админов)
|
||||||
|
dp.include_router(account_router) # Пользовательские счета + обнаружение для админов
|
||||||
|
|
||||||
# Запускаем polling
|
# Запускаем polling
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -105,6 +105,10 @@ async def forward_to_channel(message: Message, channel_id: str) -> tuple[bool, O
|
|||||||
@router.message(F.text)
|
@router.message(F.text)
|
||||||
async def handle_text_message(message: Message):
|
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('/'):
|
if message.text and message.text.startswith('/'):
|
||||||
# Список команд, которые НЕ нужно пересылать
|
# Список команд, которые НЕ нужно пересылать
|
||||||
@@ -171,11 +175,13 @@ async def handle_text_message(message: Message):
|
|||||||
forwarded_ids=forwarded_ids
|
forwarded_ids=forwarded_ids
|
||||||
)
|
)
|
||||||
|
|
||||||
await message.answer(
|
# Показываем статистику доставки только админам
|
||||||
f"✅ Сообщение разослано!\n"
|
if is_admin(message.from_user.id):
|
||||||
f"📤 Доставлено: {success}\n"
|
await message.answer(
|
||||||
f"❌ Не доставлено: {fail}"
|
f"✅ Сообщение разослано!\n"
|
||||||
)
|
f"📤 Доставлено: {success}\n"
|
||||||
|
f"❌ Не доставлено: {fail}"
|
||||||
|
)
|
||||||
|
|
||||||
elif settings.mode == 'forward':
|
elif settings.mode == 'forward':
|
||||||
# Режим пересылки в канал
|
# Режим пересылки в канал
|
||||||
@@ -237,7 +243,9 @@ async def handle_photo_message(message: Message):
|
|||||||
forwarded_ids=forwarded_ids
|
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':
|
elif settings.mode == 'forward':
|
||||||
if settings.forward_chat_id:
|
if settings.forward_chat_id:
|
||||||
@@ -289,7 +297,9 @@ async def handle_video_message(message: Message):
|
|||||||
forwarded_ids=forwarded_ids
|
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':
|
elif settings.mode == 'forward':
|
||||||
if settings.forward_chat_id:
|
if settings.forward_chat_id:
|
||||||
@@ -341,7 +351,9 @@ async def handle_document_message(message: Message):
|
|||||||
forwarded_ids=forwarded_ids
|
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':
|
elif settings.mode == 'forward':
|
||||||
if settings.forward_chat_id:
|
if settings.forward_chat_id:
|
||||||
@@ -393,7 +405,9 @@ async def handle_animation_message(message: Message):
|
|||||||
forwarded_ids=forwarded_ids
|
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':
|
elif settings.mode == 'forward':
|
||||||
if settings.forward_chat_id:
|
if settings.forward_chat_id:
|
||||||
@@ -444,7 +458,9 @@ async def handle_sticker_message(message: Message):
|
|||||||
forwarded_ids=forwarded_ids
|
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':
|
elif settings.mode == 'forward':
|
||||||
if settings.forward_chat_id:
|
if settings.forward_chat_id:
|
||||||
@@ -494,7 +510,9 @@ async def handle_voice_message(message: Message):
|
|||||||
forwarded_ids=forwarded_ids
|
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':
|
elif settings.mode == 'forward':
|
||||||
if settings.forward_chat_id:
|
if settings.forward_chat_id:
|
||||||
|
|||||||
@@ -65,7 +65,18 @@ async def delete_message_callback(callback: CallbackQuery):
|
|||||||
await callback.answer(f"❌ Ошибка: {str(e)}", show_alert=True)
|
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):
|
async def quick_delete_replied_message(message: Message):
|
||||||
"""
|
"""
|
||||||
Быстрое удаление сообщения по reply с триггерными словами или emoji
|
Быстрое удаление сообщения по reply с триггерными словами или emoji
|
||||||
@@ -79,18 +90,6 @@ async def quick_delete_replied_message(message: Message):
|
|||||||
if not is_admin(message.from_user.id):
|
if not is_admin(message.from_user.id):
|
||||||
return # Не админ - пропускаем
|
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:
|
try:
|
||||||
# Удаляем сообщение на которое ответили
|
# Удаляем сообщение на которое ответили
|
||||||
await message.reply_to_message.delete()
|
await message.reply_to_message.delete()
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ async def end_conversation(callback: CallbackQuery, state: FSMContext):
|
|||||||
|
|
||||||
|
|
||||||
@router.callback_query(F.data == "p2p:back_to_menu")
|
@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()
|
await callback.answer()
|
||||||
|
|
||||||
@@ -253,13 +253,17 @@ async def back_to_menu(callback: CallbackQuery):
|
|||||||
fake_message = callback.message
|
fake_message = callback.message
|
||||||
fake_message.from_user = callback.from_user
|
fake_message.from_user = callback.from_user
|
||||||
|
|
||||||
await show_chat_menu(fake_message, None)
|
await show_chat_menu(fake_message, state)
|
||||||
|
|
||||||
|
|
||||||
# Обработчик сообщений в состоянии chatting
|
# Обработчик сообщений в состоянии chatting
|
||||||
@router.message(StateFilter(P2PChatStates.chatting), F.text | F.photo | F.video | F.document)
|
@router.message(StateFilter(P2PChatStates.chatting), F.text | F.photo | F.video | F.document)
|
||||||
async def handle_p2p_message(message: Message, state: FSMContext):
|
async def handle_p2p_message(message: Message, state: FSMContext):
|
||||||
"""Обработка P2P сообщения от пользователя"""
|
"""Обработка 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()
|
data = await state.get_data()
|
||||||
recipient_id = data.get("recipient_id")
|
recipient_id = data.get("recipient_id")
|
||||||
recipient_telegram_id = data.get("recipient_telegram_id")
|
recipient_telegram_id = data.get("recipient_telegram_id")
|
||||||
|
|||||||
Reference in New Issue
Block a user