diff --git a/BotCode/__init__.py b/BotCode/__init__.py index 3cb87d2..bb99a36 100644 --- a/BotCode/__init__.py +++ b/BotCode/__init__.py @@ -3,6 +3,8 @@ from aiogram import Router from .routers import router as all_routers +from .inline import * +from .keyboards import * # Объявление главного роутера router = Router(name="main_router") diff --git a/BotCode/keyboards/__init__.py b/BotCode/keyboards/__init__.py index b10e1c0..2ab5421 100644 --- a/BotCode/keyboards/__init__.py +++ b/BotCode/keyboards/__init__.py @@ -2,3 +2,5 @@ # Инициализация модуля keyboards, для создания клавиатур # Экспортирование модулей во внешние слои проекта +from .inline_kb import * +from .reply_kb import * diff --git a/BotCode/keyboards/inline_kb/__init__.py b/BotCode/keyboards/inline_kb/__init__.py index 2c86324..80b74a0 100644 --- a/BotCode/keyboards/inline_kb/__init__.py +++ b/BotCode/keyboards/inline_kb/__init__.py @@ -2,3 +2,4 @@ # Инициализация модуля inline_kb, для inline-клавиатур # Экспортирование модулей во внешние слои проекта +from start_inline_kb import get_start_kb diff --git a/BotCode/keyboards/inline_kb/start_inline_kb.py b/BotCode/keyboards/inline_kb/start_inline_kb.py new file mode 100644 index 0000000..ed51029 --- /dev/null +++ b/BotCode/keyboards/inline_kb/start_inline_kb.py @@ -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() \ No newline at end of file diff --git a/BotCode/routers/commands/user_cmd/start_cmd.py b/BotCode/routers/commands/user_cmd/start_cmd.py index f9789e1..1645179 100644 --- a/BotCode/routers/commands/user_cmd/start_cmd.py +++ b/BotCode/routers/commands/user_cmd/start_cmd.py @@ -2,12 +2,14 @@ # # Работа с командой /start, для запуска бота from .user_cmd_class import CommandHandler +from BotCode.keyboards import get_start_kb # Создание команды /start с нужными параметрами start_cmd = CommandHandler( name="start", - description="Запустить бота", + description="Добро пожаловать!", keywords=["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы", "ыефке", "cnfhn", "pfgecr", "gecr", "щт", "drk", "restart", "куыефке"], text_msg="Старт!", + keyboard=get_start_kb, ) diff --git a/BotCode/routers/commands/user_cmd/user_cmd_class.py b/BotCode/routers/commands/user_cmd/user_cmd_class.py index d576970..b0849d9 100644 --- a/BotCode/routers/commands/user_cmd/user_cmd_class.py +++ b/BotCode/routers/commands/user_cmd/user_cmd_class.py @@ -7,10 +7,11 @@ from BotLibrary import * # Класс-шаблон для команд class CommandHandler: - def __init__(self, name: str, description: str, - keywords: list, text_msg: str, - keyboard=None, prefix = BotVar.prefix, - ignore_case = True, + def __init__(self, name: str, keywords : list, + description: str = "Описание команды", text_msg : str = "Сообщение", + keyboard = None, prefix = BotVar.prefix, + ignore_case : bool = True, activate_keywoards : bool = True, + activate_commands : bool = True, ): """ Универсальный обработчик команд для бота. @@ -30,10 +31,10 @@ class CommandHandler: self.keyboard = keyboard # Привязываем хэндлер к роутеру - self.router.message( - Command(*keywords, prefix=prefix, ignore_case=ignore_case) - )(self.handler) - self.router.message(F.text.lower().in_(keywords))(self.handler) + if activate_commands: + self.router.message(Command(*keywords, prefix=prefix, ignore_case=ignore_case))(self.handler) + if activate_keywoards: + self.router.message(F.text.lower().in_(keywords))(self.handler) async def handler(self, message: types.Message): diff --git a/BotCode/servey/__init__.py b/BotCode/servey/__init__.py new file mode 100644 index 0000000..d97f91a --- /dev/null +++ b/BotCode/servey/__init__.py @@ -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( + +) diff --git a/BotCode/servey/adm_answer.py b/BotCode/servey/adm_answer.py new file mode 100644 index 0000000..6cf9764 --- /dev/null +++ b/BotCode/servey/adm_answer.py @@ -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("Произошла ошибка. Попробуйте снова.") diff --git a/BotLibrary/validators/__init__.py b/BotLibrary/validators/__init__.py index 1cefde8..6707043 100644 --- a/BotLibrary/validators/__init__.py +++ b/BotLibrary/validators/__init__.py @@ -3,3 +3,4 @@ # Экспортирование модулей во внешние слои проекта from .email_valid import * +from .username import * diff --git a/BotLibrary/validators/username.py b/BotLibrary/validators/username.py new file mode 100644 index 0000000..9c5d692 --- /dev/null +++ b/BotLibrary/validators/username.py @@ -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}"