0.7 Теперь появился логгер на старты
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
# Игнорирование локального окружения и пользовательских конфигураций IDE
|
# Игнорирование локального окружения и пользовательских конфигураций IDE
|
||||||
.*
|
.*
|
||||||
|
.*/
|
||||||
.idea
|
.idea
|
||||||
.venv/
|
.venv/
|
||||||
*.iml
|
*.iml
|
||||||
@@ -19,6 +20,7 @@ Thumbs.db
|
|||||||
|
|
||||||
|
|
||||||
# Игнорирование файлов логов
|
# Игнорирование файлов логов
|
||||||
|
BotLogs/
|
||||||
*.log
|
*.log
|
||||||
*.logs
|
*.logs
|
||||||
|
|
||||||
|
|||||||
2
.idea/PRIMOWORLD.iml
generated
2
.idea/PRIMOWORLD.iml
generated
@@ -13,6 +13,8 @@
|
|||||||
<sourceFolder url="file://$MODULE_DIR$/BotLibrary/timer" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/BotLibrary/timer" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/BotLibrary/validators" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/BotLibrary/validators" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/SQLite3" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/SQLite3" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/BotCode" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/BotLibrary/samples" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/Test" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/Test" isTestSource="true" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||||
</content>
|
</content>
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# BotCode/routers/commands/cmd_class/__init__.py
|
|
||||||
# Инициализация модуля cmd_class, для пользовательских классов команд
|
|
||||||
|
|
||||||
# Экспортирование модулей во внешние слои проекта
|
|
||||||
from .user_cmd_class import *
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# BotCode/routers/commands/user_cmd_class.py
|
|
||||||
# Класс-шаблон для создания новых команд
|
|
||||||
|
|
||||||
from aiogram import Router, types
|
|
||||||
from aiogram.filters import Command
|
|
||||||
from BotLibrary import *
|
|
||||||
|
|
||||||
# Класс-шаблон для команд
|
|
||||||
class CommandHandler:
|
|
||||||
def __init__(self, name: str, keywords : list,
|
|
||||||
description: str = "Описание команды", text_msg : str = "Сообщение",
|
|
||||||
keyboard = None, prefix = BotVar.prefix, callbackdata = None,
|
|
||||||
ignore_case : bool = True, activate_keywoards : bool = True,
|
|
||||||
activate_commands : bool = True, activate_callback : bool = True,
|
|
||||||
):
|
|
||||||
"""
|
|
||||||
Универсальный обработчик команд для бота.
|
|
||||||
|
|
||||||
:param name: Имя команды (например, "help").
|
|
||||||
:param description: Описание команды.
|
|
||||||
:param keywords: Список ключевых слов, которые активируют команду.
|
|
||||||
:param text_msg: Текст сообщения, который отправляется пользователю.
|
|
||||||
:param keyboard: Клавиатура, если требуется.
|
|
||||||
"""
|
|
||||||
self.router = Router(name=f"{name}_router")
|
|
||||||
self.name = name
|
|
||||||
self.log_type = name.capitalize()
|
|
||||||
self.description = description
|
|
||||||
self.keywords = keywords
|
|
||||||
self.callbackdata = callbackdata
|
|
||||||
self.text_msg = text_msg
|
|
||||||
self.keyboard = keyboard
|
|
||||||
|
|
||||||
# Привязываем хэндлер к роутеру
|
|
||||||
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)
|
|
||||||
if activate_callback:
|
|
||||||
self.router.message(F.text.lower().in_(callbackdata))(self.handler)
|
|
||||||
|
|
||||||
|
|
||||||
async def handler(self, message: types.Message):
|
|
||||||
"""Основной хэндлер команды."""
|
|
||||||
try:
|
|
||||||
Logs.info(log_type=self.name.capitalize(), user=username(message), text=f"использовал(а) команду /{self.name}")
|
|
||||||
await message.reply(
|
|
||||||
text=self.text_msg,
|
|
||||||
reply_markup=self.keyboard() if self.keyboard else None,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Проверка на ошибку
|
|
||||||
except Exception as e:
|
|
||||||
Logs.error(log_type=self.name.capitalize(), user=username(message), text=f"Ошибка команды: {e}")
|
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
# BotCode/routers/commands/user_cmd/help_cmd.py
|
# BotCode/routers/commands/user_cmd/help_cmd.py
|
||||||
# Работа с командой /help, для вывода помощи пользователю
|
# Работа с командой /help, для вывода помощи пользователю
|
||||||
|
|
||||||
from ..cmd_class.user_cmd_class import CommandHandler
|
from BotLibrary.samples.user_cmd_class import CommandHandler
|
||||||
|
|
||||||
# Создание команды /help с нужными параметрами
|
# Создание команды /help с нужными параметрами
|
||||||
help_cmd = CommandHandler(
|
help_cmd = CommandHandler(
|
||||||
name="help",
|
name="help",
|
||||||
description="Получить помощь",
|
description="Получить помощь",
|
||||||
keywords=["help", "info", "помощь", "инфо", "информация", "рудз", "штащ", "byaj", "gjvjom", "byajhvfwbz"],
|
keywords=["help", "info", "помощь", "инфо", "информация", "рудз", "штащ", "byaj", "gjvjom", "byajhvfwbz"],
|
||||||
|
callbackdata="keywords",
|
||||||
text_msg="Привет! Это команда помощи. Тут ты можешь узнать, как пользоваться ботом.",
|
text_msg="Привет! Это команда помощи. Тут ты можешь узнать, как пользоваться ботом.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# BotCode/routers/commands/user_cmd/start_cmd.py
|
# BotCode/routers/commands/user_cmd/start_cmd.py
|
||||||
# # Работа с командой /start, для запуска бота
|
# # Работа с командой /start, для запуска бота
|
||||||
|
|
||||||
from ..cmd_class.user_cmd_class import CommandHandler
|
from BotLibrary.samples.user_cmd_class import CommandHandler
|
||||||
from BotCode.keyboards import get_start_kb
|
from BotCode.keyboards import get_start_kb
|
||||||
|
|
||||||
# Создание команды /start с нужными параметрами
|
# Создание команды /start с нужными параметрами
|
||||||
@@ -10,6 +10,8 @@ start_cmd = CommandHandler(
|
|||||||
description="Добро пожаловать!",
|
description="Добро пожаловать!",
|
||||||
keywords=["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы",
|
keywords=["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы",
|
||||||
"ыефке", "cnfhn", "pfgecr", "gecr", "щт", "drk", "restart", "куыефке"],
|
"ыефке", "cnfhn", "pfgecr", "gecr", "щт", "drk", "restart", "куыефке"],
|
||||||
|
callbackdata="keywords",
|
||||||
text_msg="Старт!",
|
text_msg="Старт!",
|
||||||
keyboard=get_start_kb,
|
keyboard=get_start_kb,
|
||||||
|
chat_action=True
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,7 +13,21 @@ class Logs:
|
|||||||
"""Класс для логирования с разными уровнями через loguru."""
|
"""Класс для логирования с разными уровнями через loguru."""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def debug(text: str = "Логирование!", log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
def start(text: str = "Логирование!", system: str = "PRIMO",
|
||||||
|
log_type: str = "AEP", user: str = "@Console", message: Message = None) -> None:
|
||||||
|
"""
|
||||||
|
Логирует сообщение на уровне DEBUG.
|
||||||
|
|
||||||
|
:param text: Сообщение для логирования.
|
||||||
|
:param log_type: Тип лога (например, "Logs").
|
||||||
|
:param user: Имя пользователя или источник вызова лога.
|
||||||
|
:param message: Сообщение от пользователя, если необходимо извлечь имя.
|
||||||
|
"""
|
||||||
|
logger.bind(system=system, user=user, log_type=log_type).log("START", text)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def debug(text: str = "Логирование!", system : str = "DEBUG",
|
||||||
|
log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
||||||
"""
|
"""
|
||||||
Логирует сообщение на уровне DEBUG.
|
Логирует сообщение на уровне DEBUG.
|
||||||
|
|
||||||
@@ -24,10 +38,11 @@ class Logs:
|
|||||||
"""
|
"""
|
||||||
if message:
|
if message:
|
||||||
user = username(message)
|
user = username(message)
|
||||||
logger.bind(log_type=log_type, user=user).debug(text)
|
logger.bind(system=system, log_type=log_type, user=user).debug(text)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def info(text: str = "Логирование!", log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
def info(text: str = "Логирование!", system : str = "PRIMO",
|
||||||
|
log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
||||||
"""
|
"""
|
||||||
Логирует сообщение на уровне INFO.
|
Логирует сообщение на уровне INFO.
|
||||||
|
|
||||||
@@ -38,10 +53,11 @@ class Logs:
|
|||||||
"""
|
"""
|
||||||
if message:
|
if message:
|
||||||
user = username(message)
|
user = username(message)
|
||||||
logger.bind(log_type=log_type, user=user).info(text)
|
logger.bind(system=system, log_type=log_type, user=user).info(text)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def warning(text: str = "Логирование!", log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
def warning(text: str = "Логирование!", system : str = "WARNING",
|
||||||
|
log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
||||||
"""
|
"""
|
||||||
Логирует сообщение на уровне WARNING.
|
Логирует сообщение на уровне WARNING.
|
||||||
|
|
||||||
@@ -52,10 +68,11 @@ class Logs:
|
|||||||
"""
|
"""
|
||||||
if message:
|
if message:
|
||||||
user = username(message)
|
user = username(message)
|
||||||
logger.bind(log_type=log_type, user=user).warning(text)
|
logger.bind(system=system, log_type=log_type, user=user).warning(text)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def error(text: str = "Логирование!", log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
def error(text: str = "Логирование!", system : str = "ERROR",
|
||||||
|
log_type: str = "Logs", user: str = "@Console", message: Message = None) -> None:
|
||||||
"""
|
"""
|
||||||
Логирует сообщение на уровне ERROR.
|
Логирует сообщение на уровне ERROR.
|
||||||
|
|
||||||
@@ -66,4 +83,4 @@ class Logs:
|
|||||||
"""
|
"""
|
||||||
if message:
|
if message:
|
||||||
user = username(message)
|
user = username(message)
|
||||||
logger.bind(log_type=log_type, user=user).error(text)
|
logger.bind(system=system, log_type=log_type, user=user).error(text)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
from ProjectsFiles import BotLogs
|
from ProjectsFiles import BotLogs, ProjectPath
|
||||||
|
|
||||||
|
|
||||||
# Создание обычного логгера + логгер в файл
|
# Создание обычного логгера + логгер в файл
|
||||||
@@ -16,8 +16,18 @@ async def setup_logger() -> None:
|
|||||||
"""
|
"""
|
||||||
logger.remove() # Удаляем все логгеры
|
logger.remove() # Удаляем все логгеры
|
||||||
|
|
||||||
|
if BotLogs.permission or BotLogs.permission_to_file:
|
||||||
|
# Добавляем новый уровень START
|
||||||
|
logger.level("START", no=25, color="white", icon="🔸")
|
||||||
|
|
||||||
# Настройка логирования в консоль для каждого уровня
|
# Настройка логирования в консоль для каждого уровня
|
||||||
if BotLogs.permission:
|
if BotLogs.permission:
|
||||||
|
logger.add(sys.stderr,
|
||||||
|
colorize=True,
|
||||||
|
format=BotLogs.start_text,
|
||||||
|
level="START",
|
||||||
|
filter=lambda record: record["level"].name == "START"
|
||||||
|
)
|
||||||
logger.add(sys.stderr,
|
logger.add(sys.stderr,
|
||||||
colorize=True,
|
colorize=True,
|
||||||
format=BotLogs.debug_text,
|
format=BotLogs.debug_text,
|
||||||
@@ -39,21 +49,40 @@ async def setup_logger() -> None:
|
|||||||
level="ERROR",
|
level="ERROR",
|
||||||
filter=lambda record: record["level"].name == "ERROR")
|
filter=lambda record: record["level"].name == "ERROR")
|
||||||
|
|
||||||
# Добавление логгера для записи в файл (закомментированное, по необходимости активируется)
|
# Добавление логгера для записи в файл
|
||||||
if BotLogs.permission_to_file:
|
if BotLogs.permission_to_file:
|
||||||
# Uncomment and adjust if file logging is required
|
logger.add(ProjectPath.start_log_file,
|
||||||
# logger.add(ProjectPath.log_file,
|
rotation=BotLogs.max_size,
|
||||||
# rotation=BotLogs.max_size,
|
format=BotLogs.start_text,
|
||||||
# format=BotLogs.info_text,
|
backtrace=True,
|
||||||
# backtrace=True,
|
diagnose=True,
|
||||||
# diagnose=True,
|
level="START",
|
||||||
# level="INFO",
|
filter=lambda record: record["level"].name == "START")
|
||||||
# filter=lambda record: record["level"].name == "INFO")
|
logger.add(ProjectPath.debug_log_file,
|
||||||
# logger.add(ProjectPath.log_error_file,
|
rotation=BotLogs.max_size,
|
||||||
# rotation=BotLogs.max_size,
|
format=BotLogs.debug_text,
|
||||||
# format=BotLogs.error_text,
|
backtrace=True,
|
||||||
# backtrace=True,
|
diagnose=True,
|
||||||
# diagnose=True,
|
level="DEBUG",
|
||||||
# level="ERROR",
|
filter=lambda record: record["level"].name == "DEBUG")
|
||||||
# filter=lambda record: record["level"].name == "ERROR")
|
logger.add(ProjectPath.info_log_file,
|
||||||
return
|
rotation=BotLogs.max_size,
|
||||||
|
format=BotLogs.info_text,
|
||||||
|
backtrace=True,
|
||||||
|
diagnose=True,
|
||||||
|
level="INFO",
|
||||||
|
filter=lambda record: record["level"].name == "INFO")
|
||||||
|
logger.add(ProjectPath.warning_log_file,
|
||||||
|
rotation=BotLogs.max_size,
|
||||||
|
format=BotLogs.warning_text,
|
||||||
|
backtrace=True,
|
||||||
|
diagnose=True,
|
||||||
|
level="WARNING",
|
||||||
|
filter=lambda record: record["level"].name == "WARNING")
|
||||||
|
logger.add(ProjectPath.error_log_file,
|
||||||
|
rotation=BotLogs.max_size,
|
||||||
|
format=BotLogs.error_text,
|
||||||
|
backtrace=True,
|
||||||
|
diagnose=True,
|
||||||
|
level="ERROR",
|
||||||
|
filter=lambda record: record["level"].name == "ERROR")
|
||||||
|
|||||||
5
BotLibrary/samples/__init__.py
Normal file
5
BotLibrary/samples/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# BotLibrary/samples/__init__.py
|
||||||
|
# Инициализация пакета samples, для создания шаблонов
|
||||||
|
|
||||||
|
# Экспортирование модулей во внешние слои проекта
|
||||||
|
from .user_cmd_class import *
|
||||||
121
BotLibrary/samples/user_cmd_class.py
Normal file
121
BotLibrary/samples/user_cmd_class.py
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
# BotCode/routers/commands/user_cmd_class.py
|
||||||
|
# Класс-шаблон для создания новых команд
|
||||||
|
|
||||||
|
from aiogram import Router, types, F
|
||||||
|
from aiogram.enums import ChatAction
|
||||||
|
from aiogram.filters import Command
|
||||||
|
|
||||||
|
from ProjectsFiles import BotVar
|
||||||
|
from BotLibrary.validators import username
|
||||||
|
from BotLibrary.loggers import Logs
|
||||||
|
|
||||||
|
# Настройки экспорта в модули
|
||||||
|
__all__ = ("CommandHandler", )
|
||||||
|
|
||||||
|
# Класс-шаблон для команд
|
||||||
|
class CommandHandler:
|
||||||
|
def __init__(self, name: str, keywords : list, chat_action : bool = False,
|
||||||
|
description: str = "Описание команды", text_msg : str = "Сообщение",
|
||||||
|
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,
|
||||||
|
):
|
||||||
|
|
||||||
|
self.router = Router(name=f"{name}_router")
|
||||||
|
self.name = name
|
||||||
|
self.log_type = name.capitalize()
|
||||||
|
self.description = description
|
||||||
|
|
||||||
|
self.keywords = keywords
|
||||||
|
self.text_msg = text_msg
|
||||||
|
self.parse_mode = parse_mode
|
||||||
|
self.keyboard = keyboard
|
||||||
|
self.chat_action = chat_action
|
||||||
|
self.disable_notification = disable_notification
|
||||||
|
|
||||||
|
self.media = media.lower()
|
||||||
|
self.path_to_media = path_to_media
|
||||||
|
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)
|
||||||
|
if activate_keywoards:
|
||||||
|
self.router.message(F.text.lower().in_(keywords))(self.handler)
|
||||||
|
if activate_callback:
|
||||||
|
self.router.message(F.text.lower().in_(callbackdata))(self.handler)
|
||||||
|
|
||||||
|
|
||||||
|
async def handler(self, message: types.Message):
|
||||||
|
"""Основной хэндлер команды."""
|
||||||
|
try:
|
||||||
|
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,
|
||||||
|
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.TYPING,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if self.media == "photo":
|
||||||
|
await message.reply_photo(
|
||||||
|
photo="https://vos-mo.ru/upload/iblock/329/g0s939ge8o1n8xp7rcqnw9kkz9mcfrg2/risunok.jpg",
|
||||||
|
caption=self.text_msg)
|
||||||
|
if self.chat_action:
|
||||||
|
await message.bot.send_chat_action(
|
||||||
|
chat_id=message.chat.id,
|
||||||
|
action=ChatAction.UPLOAD_PHOTO,
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.media == "gif":
|
||||||
|
await message.reply_animation(
|
||||||
|
animation="https://vos-mo.ru/upload/iblock/329/g0s939ge8o1n8xp7rcqnw9kkz9mcfrg2/risunok.jpg")
|
||||||
|
if self.chat_action:
|
||||||
|
await message.bot.send_chat_action(
|
||||||
|
chat_id=message.chat.id,
|
||||||
|
action=ChatAction.UPLOAD_VIDEO,
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.media == "video":
|
||||||
|
if self.chat_action:
|
||||||
|
await message.bot.send_chat_action(
|
||||||
|
chat_id=message.chat.id,
|
||||||
|
action=ChatAction.UPLOAD_VIDEO,
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.media == "videonote":
|
||||||
|
if self.chat_action:
|
||||||
|
await message.bot.send_chat_action(
|
||||||
|
chat_id=message.chat.id,
|
||||||
|
action=ChatAction.UPLOAD_VIDEO_NOTE,
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.media == "audio":
|
||||||
|
if self.chat_action:
|
||||||
|
await message.bot.send_chat_action(
|
||||||
|
chat_id=message.chat.id,
|
||||||
|
action=ChatAction.UPLOAD_VOICE,
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.media == "file":
|
||||||
|
if self.chat_action:
|
||||||
|
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}")
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
# Создание и настройка бота в одном файле
|
# Создание и настройка бота в одном файле
|
||||||
|
|
||||||
from aiogram import Dispatcher, Bot, F
|
from aiogram import Dispatcher, Bot, F
|
||||||
from aiogram.enums import ParseMode
|
|
||||||
from aiogram.client.default import DefaultBotProperties
|
from aiogram.client.default import DefaultBotProperties
|
||||||
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
|
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
|
||||||
|
|
||||||
@@ -34,12 +33,15 @@ dp["database"] = None
|
|||||||
|
|
||||||
# Настройки для бота
|
# Настройки для бота
|
||||||
bot_properties = DefaultBotProperties(
|
bot_properties = DefaultBotProperties(
|
||||||
parse_mode=ParseMode.HTML, # Устанавливаем формат HTML для всех сообщений
|
parse_mode=BotVar.parse_mode, # Устанавливаем формат HTML для всех сообщений
|
||||||
disable_notification=True, # Отключаем уведомления при отправке сообщений
|
disable_notification=BotVar.disable_notification, # Отключаем уведомления при отправке сообщений
|
||||||
protect_content=True, # Защищаем содержимое сообщений от копирования
|
protect_content=BotVar.protect_content, # Защищаем содержимое сообщений от копирования
|
||||||
allow_sending_without_reply=True, # Разрешаем отправлять сообщения без ответа на другое сообщение
|
allow_sending_without_reply=BotVar.allow_sending_without_reply, # Разрешаем отправлять сообщения без ответа на другое сообщение
|
||||||
link_preview_is_disabled=True, # Отключаем предварительный просмотр ссылок
|
link_preview_is_disabled=BotVar.link_preview_is_disabled, # Отключаем предварительный просмотр ссылок
|
||||||
show_caption_above_media=False, # Показываем подпись выше медиа
|
link_preview_prefer_small_media=BotVar.link_preview_prefer_small_media,
|
||||||
|
link_preview_prefer_large_media=BotVar.link_preview_prefer_large_media,
|
||||||
|
link_preview_show_above_text=BotVar.link_preview_show_above_text,
|
||||||
|
show_caption_above_media=BotVar.show_caption_above_media, # Показываем подпись выше медиа
|
||||||
)
|
)
|
||||||
|
|
||||||
# Создание экземпляра бота
|
# Создание экземпляра бота
|
||||||
|
|||||||
@@ -6,9 +6,15 @@ from ProjectsFiles import ProjectPath, TypeDirectory
|
|||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
# Настройка экспорта из модуля
|
# Настройка экспорта из модуля
|
||||||
__all__ = ("create_directories", "setup_directories")
|
__all__ = ("create_directories", "setup_directories", "create_directory")
|
||||||
|
|
||||||
|
|
||||||
|
# Функция создания директории
|
||||||
|
async def create_directory(directory : str) -> None:
|
||||||
|
os.makedirs(directory)
|
||||||
|
|
||||||
|
|
||||||
|
# Функция создания поддиректорий
|
||||||
async def create_directories(base_directory: str, subdirectories: List[str]) -> None:
|
async def create_directories(base_directory: str, subdirectories: List[str]) -> None:
|
||||||
"""
|
"""
|
||||||
Создает указанные поддиректории в указанной базовой директории, если они еще не существуют.
|
Создает указанные поддиректории в указанной базовой директории, если они еще не существуют.
|
||||||
@@ -26,6 +32,7 @@ async def create_directories(base_directory: str, subdirectories: List[str]) ->
|
|||||||
print(f"Создана директория: {directory_path}")
|
print(f"Создана директория: {directory_path}")
|
||||||
|
|
||||||
|
|
||||||
|
# Функция установки начальных директорий
|
||||||
async def setup_directories() -> None:
|
async def setup_directories() -> None:
|
||||||
"""
|
"""
|
||||||
Настройка начальных пустых директорий для проекта.
|
Настройка начальных пустых директорий для проекта.
|
||||||
|
|||||||
@@ -4,3 +4,5 @@
|
|||||||
# Экспортирование модулей во внешние слои проекта
|
# Экспортирование модулей во внешние слои проекта
|
||||||
from .config import *
|
from .config import *
|
||||||
from .primoenv import *
|
from .primoenv import *
|
||||||
|
from .logs_config import *
|
||||||
|
from .project_path import *
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
# ProjectsFiles/config.py
|
# ProjectsFiles/config.py
|
||||||
# Файл-хранилище всех конфигов и настроек для бота
|
# Файл-хранилище всех конфигов и настроек для бота
|
||||||
|
|
||||||
from typing import List, Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
# Список разрешений для бота
|
# Список разрешений для бота
|
||||||
class Permissions:
|
class Permissions:
|
||||||
"""
|
"""
|
||||||
Класс для хранения настроек разрешений бота.
|
Класс для хранения настроек разрешений бота.
|
||||||
"""
|
"""
|
||||||
bot_edit : bool = False # Разрешение на изменение имени, описания и виджета (True/False)
|
bot_edit : bool = True # Разрешение на изменение имени, описания и виджета (True/False)
|
||||||
delete_webhook : bool = True # Разрешение на удаление веб-хука (True/False)
|
delete_webhook : bool = True # Разрешение на удаление веб-хука (True/False)
|
||||||
|
|
||||||
logging : bool = True # Разрешение на вывод логов в консоль (True/False)
|
logging : bool = True # Разрешение на вывод логов в консоль (True/False)
|
||||||
logging_to_file : bool = False # Разрешение на вывод логов в файл (True/False)
|
logging_to_file : bool = True # Разрешение на вывод логов в файл (True/False)
|
||||||
msg_logging : bool = False # Логирование сообщений в консоль (В разработке)
|
msg_logging : bool = False # Логирование сообщений в консоль (В разработке)
|
||||||
|
|
||||||
start_info_console : bool = True # Вывод информации о боте в начале (True/False)
|
start_info_console : bool = True # Вывод информации о боте в начале (True/False)
|
||||||
@@ -58,73 +58,12 @@ class BotVar:
|
|||||||
time_format : str = "%Y-%m-%d %H:%M:%S"
|
time_format : str = "%Y-%m-%d %H:%M:%S"
|
||||||
prefix : Tuple[str, ...] = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?')
|
prefix : Tuple[str, ...] = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?')
|
||||||
|
|
||||||
|
parse_mode : str = "HTML" # Устанавливаем формат HTML для всех сообщений
|
||||||
# Класс для хранения типов директорий
|
disable_notification : bool = False # Отключаем уведомления при отправке сообщений
|
||||||
class TypeDirectory:
|
protect_content : bool = False # Защищаем содержимое сообщений от копирования
|
||||||
"""
|
allow_sending_without_reply : bool = True # Разрешаем отправлять сообщения без ответа на другое сообщение
|
||||||
Класс для хранения типов сообщений и директорий, которые нужно создать.
|
link_preview_is_disabled : bool = False # Отключаем предварительный просмотр ссылок
|
||||||
"""
|
link_preview_prefer_small_media : bool = False
|
||||||
# Типы сообщений и список директорий для создания
|
link_preview_prefer_large_media : bool = True
|
||||||
private_msg : str = "Личные"
|
link_preview_show_above_text : bool = False
|
||||||
group_msg : str = "Группы"
|
show_caption_above_media : bool = False # Показываем подпись выше медиа
|
||||||
|
|
||||||
# Названия директорий-хранилищ
|
|
||||||
avatar : str = "Avatar"
|
|
||||||
photo : str = "Photo"
|
|
||||||
video : str = "Video"
|
|
||||||
videonote : str = "VideoNote"
|
|
||||||
gif : str = "GIF"
|
|
||||||
files : str = "Document"
|
|
||||||
voice : str = "Voice"
|
|
||||||
media_directories : List[str] = [avatar, photo, video, videonote, gif, files, voice]
|
|
||||||
|
|
||||||
|
|
||||||
# Класс создания директорий проекта
|
|
||||||
class ProjectPath:
|
|
||||||
"""
|
|
||||||
Класс для хранения путей к проектам и логам.
|
|
||||||
"""
|
|
||||||
BotLogs : str = "BotLogs"
|
|
||||||
personal_media : str = "ProjectsFiles/media"
|
|
||||||
|
|
||||||
|
|
||||||
# Настройки логирования бота
|
|
||||||
class BotLogs:
|
|
||||||
"""
|
|
||||||
Класс для хранения параметров логирования: шаблоны логов, разрешения, размеры файлов и т. д.
|
|
||||||
"""
|
|
||||||
# Разрешение на ведение логов
|
|
||||||
permission : bool = Permissions.logging
|
|
||||||
permission_to_file : bool = Permissions.logging_to_file
|
|
||||||
permission_msg : bool = Permissions.msg_logging
|
|
||||||
|
|
||||||
# Максимальный размер лог-файла
|
|
||||||
max_size : str = "500 MB"
|
|
||||||
|
|
||||||
# Шаблон логов для отладки
|
|
||||||
debug_text : str = (
|
|
||||||
"<cyan>{time:YYYY-MM-DD HH:mm:ss}</cyan> <red>|</red> "
|
|
||||||
"<magenta>DEBUG-{extra[log_type]}</magenta> <red>|</red> "
|
|
||||||
"<yellow>{extra[user]} |</yellow> <level>{message}</level>"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Шаблон логов для информации
|
|
||||||
info_text : str = (
|
|
||||||
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
|
|
||||||
"<blue>PRIMO-{extra[log_type]}</blue> <red>|</red> "
|
|
||||||
"<red>{extra[user]} |</red> <level>{message}</level>"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Шаблон логов для предупреждений
|
|
||||||
warning_text : str = (
|
|
||||||
"<yellow>{time:YYYY-MM-DD HH:mm:ss}</yellow> <red>|</red> "
|
|
||||||
"<yellow>WARNING-{extra[log_type]}</yellow> <red>|</red> "
|
|
||||||
"<red>{extra[user]} |</red> <level>{message}</level>"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Шаблон логов для ошибок
|
|
||||||
error_text : str = (
|
|
||||||
"<level>{time:YYYY-MM-DD HH:mm:ss} | "
|
|
||||||
"<bold>ERROR-{extra[log_type]}</bold> | "
|
|
||||||
"{extra[user]} | {message}</level>"
|
|
||||||
)
|
|
||||||
|
|||||||
53
ProjectsFiles/configs/logs_config.py
Normal file
53
ProjectsFiles/configs/logs_config.py
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# ProjectsFiles/configs/logs_config.py
|
||||||
|
# Конфиги настройки логов
|
||||||
|
|
||||||
|
from .config import Permissions
|
||||||
|
|
||||||
|
# Настройки логирования бота
|
||||||
|
class BotLogs:
|
||||||
|
"""
|
||||||
|
Класс для хранения параметров логирования: шаблоны логов, разрешения, размеры файлов и т. д.
|
||||||
|
"""
|
||||||
|
# Разрешение на ведение логов
|
||||||
|
permission : bool = Permissions.logging
|
||||||
|
permission_to_file : bool = Permissions.logging_to_file
|
||||||
|
permission_msg : bool = Permissions.msg_logging
|
||||||
|
|
||||||
|
# Максимальный размер лог-файла
|
||||||
|
max_size : str = "500 MB"
|
||||||
|
|
||||||
|
|
||||||
|
# Шаблон логов для старта
|
||||||
|
start_text: str = (
|
||||||
|
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
|
||||||
|
"<blue>{extra[system]}-{extra[log_type]}</blue> <red>|</red> "
|
||||||
|
"<red>{extra[user]} |</red> <bold>{message}</bold>"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Шаблон логов для отладки
|
||||||
|
debug_text : str = (
|
||||||
|
"<cyan>{time:YYYY-MM-DD HH:mm:ss}</cyan> <red>|</red> "
|
||||||
|
"<magenta>{extra[system]}-{extra[log_type]}</magenta> <red>|</red> "
|
||||||
|
"<yellow>{extra[user]} |</yellow> <level>{message}</level>"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Шаблон логов для информации
|
||||||
|
info_text : str = (
|
||||||
|
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
|
||||||
|
"<blue>{extra[system]}-{extra[log_type]}</blue> <red>|</red> "
|
||||||
|
"<red>{extra[user]} |</red> <level>{message}</level>"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Шаблон логов для предупреждений
|
||||||
|
warning_text : str = (
|
||||||
|
"<yellow>{time:YYYY-MM-DD HH:mm:ss}</yellow> <red>|</red> "
|
||||||
|
"<yellow>{extra[system]}-{extra[log_type]}</yellow> <red>|</red> "
|
||||||
|
"<red>{extra[user]} |</red> <level>{message}</level>"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Шаблон логов для ошибок
|
||||||
|
error_text : str = (
|
||||||
|
"<level>{time:YYYY-MM-DD HH:mm:ss} | "
|
||||||
|
"<bold>{extra[system]}-{extra[log_type]}</bold> | "
|
||||||
|
"{extra[user]} | {message}</level>"
|
||||||
|
)
|
||||||
40
ProjectsFiles/configs/project_path.py
Normal file
40
ProjectsFiles/configs/project_path.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# ProjectsFiles/configs/project_path.py
|
||||||
|
# Хранилище всех важных директорий
|
||||||
|
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
# Класс для хранения типов директорий
|
||||||
|
class TypeDirectory:
|
||||||
|
"""
|
||||||
|
Класс для хранения типов сообщений и директорий, которые нужно создать.
|
||||||
|
"""
|
||||||
|
# Типы сообщений и список директорий для создания
|
||||||
|
private_msg : str = "Личные"
|
||||||
|
group_msg : str = "Группы"
|
||||||
|
|
||||||
|
# Названия директорий-хранилищ
|
||||||
|
avatar : str = "Avatar"
|
||||||
|
photo : str = "Photo"
|
||||||
|
video : str = "Video"
|
||||||
|
videonote : str = "VideoNote"
|
||||||
|
gif : str = "GIF"
|
||||||
|
files : str = "Document"
|
||||||
|
voice : str = "Voice"
|
||||||
|
media_directories : List[str] = [avatar, photo, video, videonote, gif, files, voice]
|
||||||
|
|
||||||
|
|
||||||
|
# Класс создания директорий проекта
|
||||||
|
class ProjectPath:
|
||||||
|
"""
|
||||||
|
Класс для хранения путей к проектам и логам.
|
||||||
|
"""
|
||||||
|
BotLogs : str = "BotLogs"
|
||||||
|
start_log_file: str = f"{BotLogs}/start.log"
|
||||||
|
debug_log_file: str = f"{BotLogs}/debug.log"
|
||||||
|
info_log_file : str = f"{BotLogs}/info.log"
|
||||||
|
warning_log_file: str = f"{BotLogs}/warning.log"
|
||||||
|
error_log_file: str = f"{BotLogs}/error.log"
|
||||||
|
logs_path : List[str] = [debug_log_file, info_log_file, warning_log_file, error_log_file]
|
||||||
|
|
||||||
|
|
||||||
|
personal_media : str = "ProjectsFiles/media"
|
||||||
2
main.py
2
main.py
@@ -11,7 +11,7 @@ async def main():
|
|||||||
# Функция создания логеров и получения информации о боте
|
# Функция создания логеров и получения информации о боте
|
||||||
await setup_logger()
|
await setup_logger()
|
||||||
await bot_get_info()
|
await bot_get_info()
|
||||||
logger.bind(log_type="AEP", user="@Console").info(f"Начало запуска бота @{BotInfo.username}...")
|
Logs.start(text=f"Начало запуска бота @{BotInfo.username}...")
|
||||||
|
|
||||||
# Создание пустых директорий
|
# Создание пустых директорий
|
||||||
await setup_directories()
|
await setup_directories()
|
||||||
|
|||||||
Reference in New Issue
Block a user