3.0 Выпуск в PrimoRU
This commit is contained in:
@@ -1,153 +1,115 @@
|
||||
# BotLibrary/system/bot_edit.py
|
||||
# Под-пакет установки настроек бота
|
||||
|
||||
from aiogram.types import ChatAdministratorRights
|
||||
from aiogram import Bot
|
||||
from ProjectsFiles import BotEdit
|
||||
from .bots import bot
|
||||
|
||||
# Настройка логирования
|
||||
log_type = "Edit"
|
||||
|
||||
# Настройка экспорта из модуля
|
||||
__all__ = ("set_adm_rights", "set_bot_name", "set_bot_description", "set_bot_short_description")
|
||||
__all__ = ("BotRights",)
|
||||
|
||||
# Функция установки прав администратора
|
||||
async def set_adm_rights(anonym: bool = BotEdit.is_anonymous,
|
||||
manage_chat: bool = BotEdit.manage_chat,
|
||||
delete_msg: bool = BotEdit.delete_messages,
|
||||
manage_video_chats: bool = BotEdit.manage_video_chats,
|
||||
restrict_members: bool = BotEdit.restrict_members,
|
||||
promote_members: bool = BotEdit.promote_members,
|
||||
change_info: bool = BotEdit.change_info,
|
||||
invite_users: bool = BotEdit.invite_users,
|
||||
post_stories: bool = BotEdit.post_stories,
|
||||
edit_stories: bool = BotEdit.edit_stories,
|
||||
delete_stories: bool = BotEdit.delete_stories,
|
||||
post_messages: bool = BotEdit.post_messages,
|
||||
edit_messages: bool = BotEdit.edit_messages,
|
||||
pin_messages: bool = BotEdit.pin_messages,
|
||||
manage_topics: bool = BotEdit.manage_topics,) -> None:
|
||||
class BotRights:
|
||||
"""
|
||||
Устанавливает права администратора для бота, если они отличаются от текущих.
|
||||
Все через конфиги!!!
|
||||
|
||||
:param anonym: Позволяет ли боту быть анонимным.
|
||||
:param manage_chat: Разрешение на управление чатом.
|
||||
:param delete_msg: Разрешение на удаление сообщений.
|
||||
:param manage_video_chats: Разрешение на управление видеочатами.
|
||||
:param restrict_members: Разрешение на ограничение участников (мут, бан).
|
||||
:param promote_members: Разрешение на назначение администраторов.
|
||||
:param change_info: Разрешение на изменение информации о группе/канале.
|
||||
:param invite_users: Разрешение на приглашение новых участников.
|
||||
:param post_stories: Разрешение на публикацию историй.
|
||||
:param edit_stories: Разрешение на редактирование историй.
|
||||
:param delete_stories: Разрешение на удаление историй.
|
||||
:param post_messages: Разрешение на публикацию сообщений (только для каналов).
|
||||
:param edit_messages: Разрешение на редактирование сообщений (только для каналов).
|
||||
:param pin_messages: Разрешение на закрепление сообщений.
|
||||
:param manage_topics: Разрешение на управление темами (в супергруппах).
|
||||
|
||||
:return: Изменение прав администратора
|
||||
Класс для установки прав администратора и метаинформации бота (имя, описания).
|
||||
"""
|
||||
rights = ChatAdministratorRights(
|
||||
is_anonymous=anonym,
|
||||
can_manage_chat=manage_chat,
|
||||
can_delete_messages=delete_msg,
|
||||
can_manage_video_chats=manage_video_chats,
|
||||
can_restrict_members=restrict_members,
|
||||
can_promote_members=promote_members,
|
||||
can_change_info=change_info,
|
||||
can_invite_users=invite_users,
|
||||
can_post_stories=post_stories,
|
||||
can_edit_stories=edit_stories,
|
||||
can_delete_stories=delete_stories,
|
||||
can_post_messages=post_messages,
|
||||
can_edit_messages=edit_messages,
|
||||
can_pin_messages=pin_messages,
|
||||
can_manage_topics=manage_topics,
|
||||
)
|
||||
@staticmethod
|
||||
async def set_administrator_rights(bot: Bot) -> None:
|
||||
"""
|
||||
Установка прав администратора в чатах.
|
||||
|
||||
# Применяем права только в случае изменения
|
||||
current_rights = await bot.get_my_default_administrator_rights()
|
||||
if current_rights != rights:
|
||||
await bot.set_my_default_administrator_rights(rights)
|
||||
else:
|
||||
return
|
||||
:param bot: Базовый объект бота.
|
||||
:return: Измененные права по конфигу.
|
||||
"""
|
||||
from aiogram.types import ChatAdministratorRights
|
||||
rights: ChatAdministratorRights = ChatAdministratorRights(
|
||||
is_anonymous=BotEdit.is_anonymous,
|
||||
can_manage_chat=BotEdit.manage_chat,
|
||||
can_delete_messages=BotEdit.delete_messages,
|
||||
can_manage_video_chats=BotEdit.manage_video_chats,
|
||||
can_restrict_members=BotEdit.restrict_members,
|
||||
can_promote_members=BotEdit.promote_members,
|
||||
can_change_info=BotEdit.change_info,
|
||||
can_invite_users=BotEdit.invite_users,
|
||||
can_post_stories=BotEdit.post_stories,
|
||||
can_edit_stories=BotEdit.edit_stories,
|
||||
can_delete_stories=BotEdit.delete_stories,
|
||||
can_post_messages=BotEdit.post_messages,
|
||||
can_edit_messages=BotEdit.edit_messages,
|
||||
can_pin_messages=BotEdit.pin_messages,
|
||||
can_manage_topics=BotEdit.manage_topics,
|
||||
)
|
||||
|
||||
current_rights: ChatAdministratorRights = await bot.get_my_default_administrator_rights()
|
||||
if current_rights != rights:
|
||||
await bot.set_my_default_administrator_rights(rights)
|
||||
|
||||
# Функция установки имени бота с проверкой на ограничения
|
||||
async def set_bot_name(new_name: str = BotEdit.name) -> None:
|
||||
"""
|
||||
Устанавливает имя бота, если оно отличается от текущего и соответствует ограничениям.
|
||||
@staticmethod
|
||||
async def set_name(bot: Bot) -> None:
|
||||
"""
|
||||
Установка имени бота.
|
||||
|
||||
:param new_name: Новое имя бота (config)
|
||||
:return: Имя бота
|
||||
"""
|
||||
# Импортируем Logs внутри функции, чтобы избежать циклического импорта
|
||||
from ..loggers.custom_loggers import Logs
|
||||
:param bot: Базовый объект бота.
|
||||
:return: Измененное имя бота.
|
||||
"""
|
||||
current_name: str = (await bot.get_me()).first_name
|
||||
new_name: str = str(BotEdit.name)
|
||||
|
||||
# Получаем текущее имя бота
|
||||
current_name = (await bot.get_me()).first_name
|
||||
if not (1 <= len(new_name) <= 32):
|
||||
from ..loggers import Logs
|
||||
Logs.error(log_type="SET_NAME", user="BOT", text="Имя бота должно быть от 1 до 32 символов.")
|
||||
return
|
||||
|
||||
# Проверка длины имени
|
||||
if len(new_name) < 1 or len(new_name) > 32:
|
||||
Logs.error(log_type=log_type, user="NAME_BOT", text="Имя бота должно быть от 1 до 32 символов.")
|
||||
return # Выходим из функции, если имя некорректно
|
||||
if current_name != new_name:
|
||||
await bot.set_my_name(new_name)
|
||||
|
||||
# Проверяем, совпадает ли текущее имя с тем, которое мы хотим установить
|
||||
if current_name != new_name:
|
||||
await bot.set_my_name(new_name)
|
||||
else:
|
||||
return
|
||||
@staticmethod
|
||||
async def set_description(bot: Bot) -> None:
|
||||
"""
|
||||
Установка описания бота.
|
||||
|
||||
:param bot: Базовый объект бота.
|
||||
:return: Измененное описание бота.
|
||||
"""
|
||||
from aiogram.types import BotDescription
|
||||
current_description: BotDescription = await bot.get_my_description()
|
||||
new_description: str = str(BotEdit.description)
|
||||
|
||||
# Функция установки описания бота с проверкой на ограничения
|
||||
async def set_bot_description(new_description: str = BotEdit.description) -> None:
|
||||
"""
|
||||
Устанавливает описание бота, если оно отличается от текущего и соответствует ограничениям.
|
||||
if not (0 < len(new_description) <= 255):
|
||||
from ..loggers import Logs
|
||||
Logs.error(log_type="SET_DESCRIPTION", user="BOT", text="Описание должно быть от 1 до 255 символов.")
|
||||
return
|
||||
|
||||
:param new_description: Новое описание для бота (config)
|
||||
:return: Описание бота
|
||||
"""
|
||||
# Импортируем Logs внутри функции, чтобы избежать циклического импорта
|
||||
from ..loggers.custom_loggers import Logs
|
||||
if current_description != new_description:
|
||||
await bot.set_my_description(description=new_description)
|
||||
|
||||
# Получаем текущее описание бота
|
||||
current_description = await bot.get_my_description()
|
||||
@staticmethod
|
||||
async def set_short_description(bot: Bot) -> None:
|
||||
"""
|
||||
Установка описания виджета.
|
||||
|
||||
# Проверка длины описания
|
||||
if len(new_description) > 255 or len(new_description)==0:
|
||||
Logs.error(log_type=log_type, user="DISCRIPT", text="Короткое описание бота не может превышать 255 символов или быть равно 0.")
|
||||
return # Выходим из функции, если описание некорректно
|
||||
:param bot: Базовый объект бота.
|
||||
:return: Измененное описание виджета бота.
|
||||
"""
|
||||
from aiogram.types import BotShortDescription
|
||||
current_short_description: BotShortDescription = await bot.get_my_short_description()
|
||||
new_short_description: str = str(BotEdit.short_description)
|
||||
|
||||
# Проверяем, совпадает ли текущее описание с тем, которое мы хотим установить
|
||||
if current_description != new_description:
|
||||
await bot.set_my_description(description=new_description)
|
||||
else:
|
||||
return
|
||||
if not (0 < len(new_short_description) <= 512):
|
||||
from ..loggers import Logs
|
||||
Logs.error(log_type="SET_SHORT_DESCRIPTION", user="BOT", text="Короткое описание должно быть от 1 до 512 символов.")
|
||||
return
|
||||
|
||||
if current_short_description != new_short_description:
|
||||
await bot.set_my_short_description(short_description=new_short_description)
|
||||
|
||||
# Функция установки короткого описания бота с проверкой на ограничения
|
||||
async def set_bot_short_description(new_short_description: str = BotEdit.short_description) -> None:
|
||||
"""
|
||||
Устанавливает короткое описание бота, если оно отличается от текущего и соответствует ограничениям.
|
||||
@staticmethod
|
||||
async def all(bot: Bot) -> None:
|
||||
"""
|
||||
Применяет все настройки: права, имя, описание и короткое описание.
|
||||
|
||||
:param new_short_description: Новое описание виджета для бота (config)
|
||||
:return: Короткое описание бота
|
||||
"""
|
||||
# Импортируем Logs внутри функции, чтобы избежать циклического импорта
|
||||
from ..loggers.custom_loggers import Logs
|
||||
|
||||
# Получаем текущее короткое описание бота
|
||||
current_short_description = await bot.get_my_short_description()
|
||||
|
||||
# Проверка длины короткого описания
|
||||
if len(new_short_description) > 512 or len(new_short_description) == 0:
|
||||
Logs.error(log_type=log_type, user="SHORT_DISCRIPT", text="Описание виджета не может превышать 512 символов или быть равно 0.")
|
||||
return # Выходим из функции, если короткое описание некорректно
|
||||
|
||||
# Проверяем, совпадает ли текущее короткое описание с тем, которое мы хотим установить
|
||||
if current_short_description != new_short_description:
|
||||
await bot.set_my_short_description(short_description=new_short_description)
|
||||
else:
|
||||
return
|
||||
:param bot: Базовый объект бота.
|
||||
:return: Изменение всех основных параметров бота.
|
||||
"""
|
||||
await BotRights.set_administrator_rights(bot)
|
||||
await BotRights.set_name(bot)
|
||||
await BotRights.set_description(bot)
|
||||
await BotRights.set_short_description(bot)
|
||||
|
||||
@@ -17,23 +17,14 @@ dp = Dispatcher()
|
||||
dp["started_at"] = get_host_time()
|
||||
dp["started_at_city"] = get_city_time()
|
||||
dp["is_active"] = True # Флаг активности бота
|
||||
dp["logs"] = []
|
||||
dp["users"] = {}
|
||||
dp["admins"] = {}
|
||||
dp["sessions"] = {}
|
||||
dp["task_queue"] = []
|
||||
dp["configs"] = {"max_connections": 100, "retry_interval": 5, "time_format": BotVar.time_format}
|
||||
dp["metrics"] = {"messages_received": 0, "messages_sent": 0, "errors": 0}
|
||||
dp["modules"] = {}
|
||||
dp["state"] = {}
|
||||
dp["scheduler"] = []
|
||||
dp["handlers"] = {"on_message": [], "on_error": []}
|
||||
dp["storage"] = {}
|
||||
dp["database"] = "SQLite3"
|
||||
|
||||
|
||||
# Создание экземпляра бота и его настройка
|
||||
bot = Bot(token=bot_token, default=DefaultBotProperties(
|
||||
bot: Bot = Bot(token=bot_token, default=DefaultBotProperties(
|
||||
parse_mode=BotVar.parse_mode,
|
||||
disable_notification=BotVar.disable_notification,
|
||||
protect_content=BotVar.protect_content,
|
||||
@@ -57,27 +48,31 @@ class BotInfo:
|
||||
"""
|
||||
id: int = None
|
||||
first_name: str = None
|
||||
bot_owner: str = BotVar
|
||||
last_name: str = None
|
||||
username: str = None
|
||||
description: str = None
|
||||
short_description: str = None
|
||||
can_join_groups: bool = False
|
||||
can_read_all_group_messages: bool = False
|
||||
description: str = ''
|
||||
short_description: str = ''
|
||||
language_code: str = BotVar.language
|
||||
prefix: str = BotVar.prefix
|
||||
bot_owner: str = BotVar
|
||||
is_premium: bool = False
|
||||
added_to_attachment_menu: bool = False
|
||||
supports_inline_queries: bool = False
|
||||
can_connect_to_business: bool = False
|
||||
has_main_web_app: bool = False
|
||||
can_join_groups: bool = False
|
||||
can_read_all_group_messages: bool = False
|
||||
|
||||
@classmethod
|
||||
def update(cls, bot_info) -> None:
|
||||
async def info(cls, bots: Bot = bot) -> dict:
|
||||
"""
|
||||
Обновляет данные о боте.
|
||||
:param bot_info: Объект с данными о боте, полученные через API Telegram.
|
||||
Получает информацию о боте через API и обновляет данные в классе.
|
||||
|
||||
:param bots: Объект бота
|
||||
:return: Словарь с данными о боте
|
||||
"""
|
||||
bot_info = await bots.get_me()
|
||||
|
||||
cls.id = bot_info.id
|
||||
cls.first_name = bot_info.first_name
|
||||
cls.last_name = bot_info.last_name
|
||||
@@ -93,31 +88,28 @@ class BotInfo:
|
||||
cls.can_join_groups = getattr(bot_info, 'can_join_groups', False)
|
||||
cls.can_read_all_group_messages = getattr(bot_info, 'can_read_all_group_messages', False)
|
||||
|
||||
return cls.to_dict()
|
||||
|
||||
# Функция получения информации о боте
|
||||
async def bot_get_info(bots: Bot = bot) -> dict:
|
||||
"""
|
||||
Получает информацию о боте и обновляет данные в классе BotInfo.
|
||||
:param bots: Получение объекта бота в функцию.
|
||||
:return: Словарь с данными о боте.
|
||||
"""
|
||||
bot_info_data = await bots.get_me()
|
||||
BotInfo.update(bot_info_data)
|
||||
return {
|
||||
'bot_info': bot_info_data,
|
||||
'id': bot_info_data.id,
|
||||
'first_name': bot_info_data.first_name,
|
||||
'last_name': bot_info_data.last_name,
|
||||
'username': bot_info_data.username,
|
||||
'description': getattr(bot_info_data, 'description', ''),
|
||||
'short_description': getattr(bot_info_data, 'short_description', ''),
|
||||
'language_code': bot_info_data.language_code,
|
||||
'prefix': BotVar.prefix,
|
||||
'is_premium': bot_info_data.is_premium,
|
||||
'added_to_attachment_menu': bot_info_data.added_to_attachment_menu,
|
||||
'supports_inline_queries': bot_info_data.supports_inline_queries,
|
||||
'can_connect_to_business': bot_info_data.can_connect_to_business,
|
||||
'has_main_web_app': bot_info_data.has_main_web_app,
|
||||
'can_join_groups': getattr(bot_info_data, 'can_join_groups', False),
|
||||
'can_read_all_group_messages': getattr(bot_info_data, 'can_read_all_group_messages', False),
|
||||
}
|
||||
@classmethod
|
||||
def to_dict(cls) -> dict:
|
||||
"""
|
||||
Возвращает текущие данные в виде словаря.
|
||||
"""
|
||||
return {
|
||||
'id': cls.id,
|
||||
'first_name': cls.first_name,
|
||||
'last_name': cls.last_name,
|
||||
'username': cls.username,
|
||||
'description': cls.description,
|
||||
'short_description': cls.short_description,
|
||||
'language_code': cls.language_code,
|
||||
'prefix': cls.prefix,
|
||||
'bot_owner': cls.bot_owner,
|
||||
'is_premium': cls.is_premium,
|
||||
'added_to_attachment_menu': cls.added_to_attachment_menu,
|
||||
'supports_inline_queries': cls.supports_inline_queries,
|
||||
'can_connect_to_business': cls.can_connect_to_business,
|
||||
'has_main_web_app': cls.has_main_web_app,
|
||||
'can_join_groups': cls.can_join_groups,
|
||||
'can_read_all_group_messages': cls.can_read_all_group_messages,
|
||||
}
|
||||
|
||||
@@ -2,51 +2,47 @@
|
||||
# Создание пустых директорий при первом запуске
|
||||
|
||||
import os
|
||||
from ProjectsFiles import ProjectPath, TypeDirectory
|
||||
from typing import List
|
||||
from ProjectsFiles import ProjectPath, TypeDirectory
|
||||
|
||||
# Настройка экспорта из модуля
|
||||
__all__ = ("create_directories", "setup_directories", "create_directory")
|
||||
__all__ = ("Directory",)
|
||||
|
||||
class Directory:
|
||||
@staticmethod
|
||||
async def create_directory(directory: str) -> None:
|
||||
"""
|
||||
Создает директории, если они еще не существуют.
|
||||
|
||||
# Функция создания директории
|
||||
async def create_directory(directory : str) -> None:
|
||||
"""
|
||||
Создает директории, если они еще не существуют.
|
||||
:param directory: Путь к базовой директории.
|
||||
:return: Создание директорий по определенному пути.
|
||||
"""
|
||||
os.makedirs(directory, exist_ok=True)
|
||||
|
||||
:param directory: Путь к базовой директории.
|
||||
:return: Создание директорий по определенному пути.
|
||||
"""
|
||||
os.makedirs(directory)
|
||||
@staticmethod
|
||||
async def create_directories(base_directory: str, subdirectories: List[str]) -> None:
|
||||
"""
|
||||
Создает указанные поддиректории в указанной базовой директории.
|
||||
|
||||
:param base_directory: Путь к базовой директории.
|
||||
:param subdirectories: Список поддиректорий, которые необходимо создать.
|
||||
:return: Создание директорий по определенному пути.
|
||||
"""
|
||||
# Создание директорий и файлов в каждой из них
|
||||
for subdirectory in subdirectories:
|
||||
directory_path = os.path.join(base_directory, subdirectory)
|
||||
|
||||
# Функция создания поддиректорий
|
||||
async def create_directories(base_directory: str, subdirectories: List[str]) -> None:
|
||||
"""
|
||||
Создает указанные поддиректории в указанной базовой директории.
|
||||
# Проверка, существует ли директория, если нет - создаём
|
||||
os.makedirs(directory_path, exist_ok=True)
|
||||
|
||||
:param base_directory: Путь к базовой директории.
|
||||
:param subdirectories: Список поддиректорий, которые необходимо создать.
|
||||
:return: Создание директорий по определенному пути.
|
||||
"""
|
||||
# Создание директорий и файлов в каждой из них
|
||||
for subdirectory in subdirectories:
|
||||
directory_path = os.path.join(base_directory, subdirectory)
|
||||
@staticmethod
|
||||
async def setup() -> None:
|
||||
"""
|
||||
Настройка начальных пустых директорий для проекта.
|
||||
|
||||
# Проверка, существует ли директория, если нет - создаём
|
||||
if not os.path.exists(directory_path):
|
||||
os.makedirs(directory_path)
|
||||
|
||||
|
||||
# Функция установки начальных директорий
|
||||
async def setup_directories() -> None:
|
||||
"""
|
||||
Настройка начальных пустых директорий для проекта.
|
||||
|
||||
:return: Создание системы директорий по определенному пути.
|
||||
"""
|
||||
# Создание директорий для медиа файлов
|
||||
await create_directories(ProjectPath.personal_media, TypeDirectory.media_directories)
|
||||
await create_directories(ProjectPath.received_media, TypeDirectory.media_directories)
|
||||
await create_directories(ProjectPath.received_avatars, TypeDirectory.avatar_directories)
|
||||
# await create_directories(ProjectPath.msg, TypeDirectory.msg_directories)
|
||||
:return: Создание системы директорий по определенному пути.
|
||||
"""
|
||||
# Создание директорий для медиа файлов
|
||||
await Directory.create_directories(ProjectPath.personal_media, TypeDirectory.media_directories)
|
||||
await Directory.create_directories(ProjectPath.received_media, TypeDirectory.media_directories)
|
||||
await Directory.create_directories(ProjectPath.received_avatars, TypeDirectory.avatar_directories)
|
||||
|
||||
Reference in New Issue
Block a user