This commit is contained in:
@@ -4,6 +4,8 @@ from aiogram.types import Message, CallbackQuery, InlineKeyboardMarkup, InlineKe
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.fsm.state import State, StatesGroup
|
||||
from aiogram.filters import StateFilter, Command
|
||||
|
||||
from src.filters.case_insensitive import CaseInsensitiveCommand
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
import asyncio
|
||||
from typing import List, Dict, Optional, Set, Any
|
||||
@@ -43,9 +45,9 @@ def _contains_account_numbers(text: str) -> bool:
|
||||
router = Router(name='chat_router')
|
||||
|
||||
|
||||
@router.message(Command("chat"))
|
||||
@router.message(CaseInsensitiveCommand("chat"))
|
||||
async def enter_chat_command(message: Message, state: FSMContext):
|
||||
"""Войти в режим чата через команду /chat"""
|
||||
"""Войти в режим чата через команду /chat (регистронезависимо)"""
|
||||
await enter_chat(message, state)
|
||||
|
||||
|
||||
@@ -58,6 +60,8 @@ async def enter_chat_callback(callback: CallbackQuery, state: FSMContext):
|
||||
|
||||
async def enter_chat(message: Message, state: FSMContext):
|
||||
"""Общая функция входа в чат"""
|
||||
from src.utils.keyboards import get_chat_reply_keyboard
|
||||
|
||||
await state.set_state(ChatStates.in_chat)
|
||||
|
||||
keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
||||
@@ -65,19 +69,28 @@ async def enter_chat(message: Message, state: FSMContext):
|
||||
[InlineKeyboardButton(text="🏠 В главное меню", callback_data="back_to_main")]
|
||||
])
|
||||
|
||||
# Обычная клавиатура для чата
|
||||
reply_keyboard = get_chat_reply_keyboard()
|
||||
|
||||
await message.answer(
|
||||
"💬 <b>Вы вошли в режим чата</b>\n\n"
|
||||
"Теперь все ваши сообщения будут рассылаться участникам.\n"
|
||||
"Вы можете отправлять текст, фото, видео, документы и стикеры.\n\n"
|
||||
"Для выхода нажмите кнопку ниже или отправьте /exit",
|
||||
reply_markup=keyboard,
|
||||
reply_markup=reply_keyboard, # Обычная клавиатура
|
||||
parse_mode="HTML"
|
||||
)
|
||||
|
||||
# Inline клавиатура отдельным сообщением
|
||||
await message.answer(
|
||||
"Выберите действие:",
|
||||
reply_markup=keyboard
|
||||
)
|
||||
|
||||
|
||||
@router.message(Command("exit"), StateFilter(ChatStates.in_chat))
|
||||
@router.message(CaseInsensitiveCommand("exit"), StateFilter(ChatStates.in_chat))
|
||||
async def exit_chat_command(message: Message, state: FSMContext):
|
||||
"""Выйти из режима чата через команду /exit"""
|
||||
"""Выйти из режима чата через команду /exit (регистронезависимо)"""
|
||||
await exit_chat(message, state)
|
||||
|
||||
|
||||
@@ -90,19 +103,71 @@ async def exit_chat_callback(callback: CallbackQuery, state: FSMContext):
|
||||
|
||||
async def exit_chat(message: Message, state: FSMContext):
|
||||
"""Общая функция выхода из чата"""
|
||||
from src.utils.keyboards import get_main_reply_keyboard
|
||||
from src.core.config import ADMIN_IDS
|
||||
from src.core.services import UserService
|
||||
from src.core.database import async_session_maker
|
||||
|
||||
await state.clear()
|
||||
|
||||
# Получаем информацию о пользователе
|
||||
async with async_session_maker() as session:
|
||||
user = await UserService.get_user_by_telegram_id(session, message.from_user.id)
|
||||
is_registered = user.is_registered if user else False
|
||||
is_admin_user = message.from_user.id in ADMIN_IDS
|
||||
|
||||
keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="💬 Войти в чат", callback_data="enter_chat")],
|
||||
[InlineKeyboardButton(text="🏠 В главное меню", callback_data="back_to_main")]
|
||||
])
|
||||
|
||||
# Обычная клавиатура
|
||||
reply_keyboard = get_main_reply_keyboard(is_admin=is_admin_user, is_registered=is_registered)
|
||||
|
||||
await message.answer(
|
||||
"✅ <b>Вы вышли из режима чата</b>\n\n"
|
||||
"Ваши сообщения больше не будут рассылаться.",
|
||||
reply_markup=keyboard,
|
||||
reply_markup=reply_keyboard, # Обычная клавиатура
|
||||
parse_mode="HTML"
|
||||
)
|
||||
|
||||
# Inline клавиатура отдельным сообщением
|
||||
await message.answer(
|
||||
"Выберите действие:",
|
||||
reply_markup=keyboard
|
||||
)
|
||||
|
||||
|
||||
@router.message(StateFilter(ChatStates.in_chat), F.text)
|
||||
async def check_exit_keywords(message: Message, state: FSMContext):
|
||||
"""Проверка на ключевые слова для выхода из чата"""
|
||||
text = message.text.strip().lower()
|
||||
|
||||
# Проверяем ключевые слова для выхода
|
||||
exit_keywords = ['/start', 'start', 'старт', '/exit']
|
||||
|
||||
if text in exit_keywords:
|
||||
if text in ['/start', 'start', 'старт']:
|
||||
# Выходим из чата и показываем главное меню
|
||||
await state.clear()
|
||||
|
||||
from src.components.ui import UserUI
|
||||
keyboard = UserUI.get_main_menu_keyboard(message.from_user.id)
|
||||
|
||||
await message.answer(
|
||||
"🏠 <b>Главное меню</b>\n\n"
|
||||
"Вы вышли из режима чата.",
|
||||
reply_markup=keyboard,
|
||||
parse_mode="HTML"
|
||||
)
|
||||
return # Не обрабатываем дальше
|
||||
else:
|
||||
# Для /exit просто выходим
|
||||
await exit_chat(message, state)
|
||||
return
|
||||
|
||||
# Если не ключевое слово, пропускаем дальше для обработки как обычное сообщение чата
|
||||
# Остальная логика обработки сообщений чата будет ниже
|
||||
|
||||
|
||||
# Настройки для планировщика рассылки
|
||||
|
||||
Reference in New Issue
Block a user