refactor
Some checks failed
continuous-integration/drone/pr Build is failing

This commit is contained in:
2026-02-17 00:22:42 +09:00
parent ca0c63a89c
commit 0fdad07d82
36 changed files with 4384 additions and 368 deletions

View File

@@ -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
# Если не ключевое слово, пропускаем дальше для обработки как обычное сообщение чата
# Остальная логика обработки сообщений чата будет ниже
# Настройки для планировщика рассылки