From 47896a0597cfd9fc25f596b0efccb975e7f48293 Mon Sep 17 00:00:00 2001 From: Verum Date: Tue, 25 Feb 2025 08:44:06 +0700 Subject: [PATCH] =?UTF-8?q?0.9.=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BD=D1=8B=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D1=8B,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D1=82=D1=8C=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=BC=D0=B5=D0=B4=D0=B8=D0=B0=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B5..=20=D0=BD=D0=B0=D0=B4?= =?UTF-8?q?=D0=B5=D1=8E=D1=81=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/PRIMOWORLD.iml | 2 +- .../routers/commands/user_cmd/start_cmd.py | 20 +- BotLibrary/samples/user_cmd_class.py | 296 +++++++++++------- {Test/GUI => GUI}/__init__.py | 0 {Test/GUI => GUI}/console.py | 0 {Test/GUI => GUI}/console_0.py | 0 Test/__init__.py | 4 - 7 files changed, 189 insertions(+), 133 deletions(-) rename {Test/GUI => GUI}/__init__.py (100%) rename {Test/GUI => GUI}/console.py (100%) rename {Test/GUI => GUI}/console_0.py (100%) diff --git a/.idea/PRIMOWORLD.iml b/.idea/PRIMOWORLD.iml index 0e26cf7..7594385 100644 --- a/.idea/PRIMOWORLD.iml +++ b/.idea/PRIMOWORLD.iml @@ -16,9 +16,9 @@ - + diff --git a/BotCode/routers/commands/user_cmd/start_cmd.py b/BotCode/routers/commands/user_cmd/start_cmd.py index 14ebf36..6a24508 100644 --- a/BotCode/routers/commands/user_cmd/start_cmd.py +++ b/BotCode/routers/commands/user_cmd/start_cmd.py @@ -3,21 +3,17 @@ from BotLibrary import CommandHandler from BotCode.keyboards import get_start_kb -user = "2" -# Создание команды /start + +# Создание команды /start с несколькими медиа start_cmd = CommandHandler( name="start", description="Добро пожаловать!", - keywords=["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы", - "ыефке", "cnfhn", "pfgecr", "gecr", "щт", "drk", "restart", "куыефке"], - callbackdata="keywords", + keywords=["start"], keyboard=get_start_kb, media="photo", - path_to_media="ProjectsFiles/media/Banners/start_banner.jpg", - tg_links=True, - text_msg=f""" -Здравствуй, дорогой Путник. -Мое имя - Эми! Я - ваш путеводитель в этом прекрасном месте! -Вы готовы отправиться в этот дивный мир? -""", + path_to_media=[ + "ProjectsFiles/media/Banners/start_banner.jpg", + ], + tg_links=False, + text_msg="Привет! Вот группа фото!", ) diff --git a/BotLibrary/samples/user_cmd_class.py b/BotLibrary/samples/user_cmd_class.py index 46a9ce5..f670c24 100644 --- a/BotLibrary/samples/user_cmd_class.py +++ b/BotLibrary/samples/user_cmd_class.py @@ -4,6 +4,7 @@ from aiogram import Router, types, F from aiogram.enums import ChatAction from aiogram.filters import Command +from aiogram.types import InputMediaPhoto from BotLibrary import valid_url from ProjectsFiles import BotVar @@ -13,16 +14,16 @@ from BotLibrary.loggers import Logs # Настройки экспорта в модули __all__ = ("CommandHandler",) + # Класс-шаблон для команд class CommandHandler: - def __init__(self, text_msg, name: str, keywords : list, chat_action : bool = False, - description: str = "Описание команды", tg_links : bool = False, - keyboard = None, prefix = BotVar.prefix, callbackdata = None, - ignore_case : bool = True, activate_keywoards : bool = True, - activate_commands : bool = True, activate_callback : bool = True, - media : str = "message", path_to_media : str = None, parse_mode : str = BotVar.parse_mode, - disable_notification : bool = False, - ): + def __init__(self, text_msg, name: str, keywords: list, chat_action: bool = False, + description: str = "Описание команды", tg_links: bool = False, + keyboard=None, prefix=BotVar.prefix, callbackdata=None, + ignore_case: bool = True, activate_keywoards: bool = True, + activate_commands: bool = True, activate_callback: bool = True, + media: str = "message", path_to_media=None, parse_mode: str = BotVar.parse_mode, + disable_notification: bool = False): self.router = Router(name=f"{name}_router") self.name = name @@ -37,14 +38,20 @@ class CommandHandler: self.disable_notification = disable_notification self.media = media.lower() - self.path_to_media = path_to_media + # Поддержка до 10 медиафайлов через список + if path_to_media is None: + self.path_to_media = [] + elif isinstance(path_to_media, (str, types.FSInputFile)): + self.path_to_media = [path_to_media] + elif isinstance(path_to_media, list): + self.path_to_media = path_to_media[:10] # Ограничение до 10 элементов self.tg_links = tg_links + if callbackdata == "keywords": self.callbackdata = keywords else: self.callbackdata = callbackdata - # Привязываем хэндлер к роутеру if activate_commands: self.router.message(Command(*keywords, prefix=prefix, ignore_case=ignore_case))(self.handler) @@ -53,15 +60,14 @@ class CommandHandler: if activate_callback: self.router.message(F.text.lower().in_(callbackdata))(self.handler) - async def handler(self, message: types.Message): """Основной хэндлер команды.""" try: - url : bool = valid_url(self.path_to_media) if self.tg_links: self.text_msg = self.text_msg.replace("", str(message.from_user.id)) Logs.info(log_type=self.log_type, user=username(message), text=f"использовал(а) команду /{self.name}") + if self.media == "message": await message.reply( text=self.text_msg, @@ -75,122 +81,180 @@ class CommandHandler: action=ChatAction.TYPING, ) else: - if self.media == "photo": - if url: - await message.reply_photo(photo=self.path_to_media, - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - else: - await message.reply_photo(photo=types.FSInputFile(path=self.path_to_media), - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) + if self.media == "photo" and len(self.path_to_media) > 1: + # Отправка медиагруппы для фотографий + media_group = [] + for media_path in self.path_to_media: + url = valid_url(media_path) + if url: + media_group.append(InputMediaPhoto(media=media_path)) + else: + media_group.append(InputMediaPhoto(media=types.FSInputFile(path=media_path))) + # Добавляем подпись и клавиатуру к последнему элементу + media_group[-1].caption = self.text_msg + media_group[-1].parse_mode = self.parse_mode + + await message.reply_media_group( + media=media_group, + disable_notification=self.disable_notification + ) + # Отправка клавиатуры отдельным сообщением, если есть + if self.keyboard: + await message.reply( + text=" ", + reply_markup=self.keyboard(), + disable_notification=self.disable_notification + ) if self.chat_action: await message.bot.send_chat_action( chat_id=message.chat.id, action=ChatAction.UPLOAD_PHOTO, ) + else: + # Одиночное медиа или другие типы + for idx, media_path in enumerate(self.path_to_media): + is_last = idx == len(self.path_to_media) - 1 + url = valid_url(media_path) - elif self.media == "gif": - if url: - await message.reply_animation(animation=self.path_to_media, - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - else: - await message.reply_animation(animation=types.FSInputFile(path=self.path_to_media), - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - if self.chat_action: - await message.bot.send_chat_action( - chat_id=message.chat.id, - action=ChatAction.UPLOAD_VIDEO, - ) + if self.media == "photo": + if url: + await message.reply_photo( + photo=media_path, + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + else: + await message.reply_photo( + photo=types.FSInputFile(path=media_path), + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + if self.chat_action and is_last: + await message.bot.send_chat_action( + chat_id=message.chat.id, + action=ChatAction.UPLOAD_PHOTO, + ) + elif self.media == "gif": + if url: + await message.reply_animation( + animation=media_path, + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + else: + await message.reply_animation( + animation=types.FSInputFile(path=media_path), + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + if self.chat_action and is_last: + await message.bot.send_chat_action( + chat_id=message.chat.id, + action=ChatAction.UPLOAD_VIDEO, + ) - elif self.media == "video": - if url: - await message.reply_video(video=self.path_to_media, - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - else: - await message.reply_video(video=types.FSInputFile(path=self.path_to_media), - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - if self.chat_action: - await message.bot.send_chat_action( - chat_id=message.chat.id, - action=ChatAction.UPLOAD_VIDEO, - ) + elif self.media == "video": + if url: + await message.reply_video( + video=media_path, + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + else: + await message.reply_video( + video=types.FSInputFile(path=media_path), + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + if self.chat_action and is_last: + await message.bot.send_chat_action( + chat_id=message.chat.id, + action=ChatAction.UPLOAD_VIDEO, + ) - elif self.media == "videonote": - if url: - await message.reply_video_note(video_note=self.path_to_media, - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - else: - await message.reply_video_note(video_note=types.FSInputFile(path=self.path_to_media), - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - if self.chat_action: - await message.bot.send_chat_action( - chat_id=message.chat.id, - action=ChatAction.UPLOAD_VIDEO_NOTE, - ) + elif self.media == "videonote": + if url: + await message.reply_video_note( + video_note=media_path, + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + else: + await message.reply_video_note( + video_note=types.FSInputFile(path=media_path), + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + if self.chat_action and is_last: + await message.bot.send_chat_action( + chat_id=message.chat.id, + action=ChatAction.UPLOAD_VIDEO_NOTE, + ) - elif self.media == "audio": - if url: - await message.reply_audio(audio=self.path_to_media, - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - else: - await message.reply_audio(audio=types.FSInputFile(path=self.path_to_media), - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - if self.chat_action: - await message.bot.send_chat_action( - chat_id=message.chat.id, - action=ChatAction.UPLOAD_VOICE, - ) + elif self.media == "audio": + if url: + await message.reply_audio( + audio=media_path, + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + else: + await message.reply_audio( + audio=types.FSInputFile(path=media_path), + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + if self.chat_action and is_last: + await message.bot.send_chat_action( + chat_id=message.chat.id, + action=ChatAction.UPLOAD_VOICE, + ) - elif self.media == "file": - if url: - await message.reply_document(document=self.path_to_media, - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - else: - await message.reply_document(document=types.FSInputFile(path=self.path_to_media), - caption=self.text_msg, - reply_markup=self.keyboard() if self.keyboard else None, - parse_mode=self.parse_mode, - disable_notification=self.disable_notification) - if self.chat_action: - await message.bot.send_chat_action( - chat_id=message.chat.id, - action=ChatAction.UPLOAD_DOCUMENT, - ) + elif self.media == "file": + if url: + await message.reply_document( + document=media_path, + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + else: + await message.reply_document( + document=types.FSInputFile(path=media_path), + caption=self.text_msg if is_last else None, + reply_markup=self.keyboard() if is_last and self.keyboard else None, + parse_mode=self.parse_mode, + disable_notification=self.disable_notification + ) + if self.chat_action and is_last: + await message.bot.send_chat_action( + chat_id=message.chat.id, + action=ChatAction.UPLOAD_DOCUMENT, + ) # Проверка на ошибку except Exception as e: - Logs.error(log_type=self.log_type, user=username(message), text=f"Ошибка команды: {e}") + Logs.error(log_type=self.log_type, user=username(message), text=f"Ошибка команды: {e}") \ No newline at end of file diff --git a/Test/GUI/__init__.py b/GUI/__init__.py similarity index 100% rename from Test/GUI/__init__.py rename to GUI/__init__.py diff --git a/Test/GUI/console.py b/GUI/console.py similarity index 100% rename from Test/GUI/console.py rename to GUI/console.py diff --git a/Test/GUI/console_0.py b/GUI/console_0.py similarity index 100% rename from Test/GUI/console_0.py rename to GUI/console_0.py diff --git a/Test/__init__.py b/Test/__init__.py index b37c6a3..c10beb9 100644 --- a/Test/__init__.py +++ b/Test/__init__.py @@ -3,10 +3,6 @@ # Импортируем библиотеки для экспорта from aiogram import Router -from .commands import * -from .GUI import * -from .old_files import * - # Создание роутера "test_router" router = Router(name="test_router")