Третья часть: сделаны обработчики команд

This commit is contained in:
Verum
2025-02-22 23:14:48 +07:00
parent 705a23b84f
commit 410b8eff59
10 changed files with 113 additions and 9 deletions

View File

@@ -3,6 +3,8 @@
from aiogram import Router from aiogram import Router
from .routers import router as all_routers from .routers import router as all_routers
from .inline import *
from .keyboards import *
# Объявление главного роутера # Объявление главного роутера
router = Router(name="main_router") router = Router(name="main_router")

View File

@@ -2,3 +2,5 @@
# Инициализация модуля keyboards, для создания клавиатур # Инициализация модуля keyboards, для создания клавиатур
# Экспортирование модулей во внешние слои проекта # Экспортирование модулей во внешние слои проекта
from .inline_kb import *
from .reply_kb import *

View File

@@ -2,3 +2,4 @@
# Инициализация модуля inline_kb, для inline-клавиатур # Инициализация модуля inline_kb, для inline-клавиатур
# Экспортирование модулей во внешние слои проекта # Экспортирование модулей во внешние слои проекта
from start_inline_kb import get_start_kb

View File

@@ -0,0 +1,19 @@
# BotCode/keyboards/inline_kb/start_inline_kb.py
# Создания инлайн-клавиатуры на команду: /start
from aiogram.types import InlineKeyboardMarkup
from BotLibrary import ikb
# Создание роутера и настройка экспорта
__all__ = ("get_start_kb",)
# Функция создания клавиатуры на команду: /actor
def get_start_kb() -> InlineKeyboardMarkup:
# Добавляем кнопки, группируя их по строкам
ikb.button(text="Посмотреть инфо-канал", url="https://t.me/laveilinfo")
ikb.button(text="Отправить анкету", url="https://t.me/laveilinfo")
ikb.button(text="Предложить союз", url="https://t.me/laveilinfo")
ikb.adjust(1)
return ikb.as_markup()

View File

@@ -2,12 +2,14 @@
# # Работа с командой /start, для запуска бота # # Работа с командой /start, для запуска бота
from .user_cmd_class import CommandHandler from .user_cmd_class import CommandHandler
from BotCode.keyboards import get_start_kb
# Создание команды /start с нужными параметрами # Создание команды /start с нужными параметрами
start_cmd = CommandHandler( start_cmd = CommandHandler(
name="start", name="start",
description="Запустить бота", description="Добро пожаловать!",
keywords=["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы", keywords=["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы",
"ыефке", "cnfhn", "pfgecr", "gecr", "щт", "drk", "restart", "куыефке"], "ыефке", "cnfhn", "pfgecr", "gecr", "щт", "drk", "restart", "куыефке"],
text_msg="Старт!", text_msg="Старт!",
keyboard=get_start_kb,
) )

View File

@@ -7,10 +7,11 @@ from BotLibrary import *
# Класс-шаблон для команд # Класс-шаблон для команд
class CommandHandler: class CommandHandler:
def __init__(self, name: str, description: str, def __init__(self, name: str, keywords : list,
keywords: list, text_msg: str, description: str = "Описание команды", text_msg : str = "Сообщение",
keyboard = None, prefix = BotVar.prefix, keyboard = None, prefix = BotVar.prefix,
ignore_case = True, ignore_case : bool = True, activate_keywoards : bool = True,
activate_commands : bool = True,
): ):
""" """
Универсальный обработчик команд для бота. Универсальный обработчик команд для бота.
@@ -30,9 +31,9 @@ class CommandHandler:
self.keyboard = keyboard self.keyboard = keyboard
# Привязываем хэндлер к роутеру # Привязываем хэндлер к роутеру
self.router.message( if activate_commands:
Command(*keywords, prefix=prefix, ignore_case=ignore_case) self.router.message(Command(*keywords, prefix=prefix, ignore_case=ignore_case))(self.handler)
)(self.handler) if activate_keywoards:
self.router.message(F.text.lower().in_(keywords))(self.handler) self.router.message(F.text.lower().in_(keywords))(self.handler)

View File

@@ -0,0 +1,13 @@
# BotCode/routers/servey/__init__.py
# Инициализация пакета servey, для работы с последствиями
from aiogram import Router
# Объявление роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="servey_head_router")
# Идет самым последним, если другие роутеры не сработали
router.include_routers(
)

View File

@@ -0,0 +1,52 @@
from aiogram import Router, types
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import StatesGroup, State
from BotLibrary import *
# Настройка роутера
router = Router(name="anketa_router")
# Определение состояния для работы с админом
class AdmAnswer(StatesGroup):
waiting_for_message = State() # Состояние ожидания сообщения от администратора
# Обработчик callback-запроса (нажатие на кнопку "Ответить пользователю")
@router.callback_query(lambda c: c.data.startswith("answer_user_"))
async def handle_respond_button(callback_query: types.CallbackQuery, state: FSMContext):
# Извлекаем ID пользователя из callback_data
user_id = int(callback_query.data.split("_")[2])
# Сохраняем ID пользователя для дальнейшего использования
await state.update_data(user_id=user_id)
# Устанавливаем состояние для ожидания сообщения от администратора
await state.set_state(AdmAnswer.waiting_for_message)
# Отправляем админу запрос на ввод сообщения
await callback_query.message.answer("Напишите сообщение, которое вы хотите отправить пользователю:")
# Убираем кнопку из сообщения
await callback_query.answer()
# Обработчик для получения сообщения от администратора и отправки его пользователю
@router.message(AdmAnswer.waiting_for_message)
async def handle_admin_message(message: types.Message, state: FSMContext):
user_data = await state.get_data()
user_id = user_data.get("user_id")
if user_id:
try:
# Отправляем сообщение пользователю
await bot.send_message(user_id, f"Администратор: {message.text}")
# Подтверждаем админу, что сообщение отправлено
await message.answer("Сообщение успешно отправлено пользователю.")
except Exception as e:
await message.answer(f"Произошла ошибка при отправке сообщения: {e}")
finally:
# Сбрасываем состояние
await state.clear()
else:
# Если данные отсутствуют, информируем администратора
await message.answer("Произошла ошибка. Попробуйте снова.")

View File

@@ -3,3 +3,4 @@
# Экспортирование модулей во внешние слои проекта # Экспортирование модулей во внешние слои проекта
from .email_valid import * from .email_valid import *
from .username import *

View File

@@ -0,0 +1,11 @@
# BotLibrary/validators/username.py
# Получение юзера пользователя
from aiogram.types import message
# Настройка экспорта из модуля
__all__ = ("username",)
# Функция получения юзера или id пользователя
def username(message: message.Message):
return f"@{message.from_user.username or message.from_user.id}"