diff --git a/.gitignore b/.gitignore index bf694fc..1ef2eb5 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,7 @@ htmlcov/ .nox/ .pytest_cache/ .mypy_cache/ +test/ +tests/ +Test/ +Tests/ diff --git a/bot/__init__.py b/bot/__init__.py index 7d3ce67..f61f236 100644 --- a/bot/__init__.py +++ b/bot/__init__.py @@ -1,2 +1,3 @@ from .core import * from .handlers import * +from .middlewares import * diff --git a/bot/core/bots.py b/bot/core/bots.py index 92378cc..99092e7 100644 --- a/bot/core/bots.py +++ b/bot/core/bots.py @@ -1,5 +1,4 @@ from datetime import datetime -from time import sleep from aiogram import Bot, Dispatcher from aiogram.client.default import DefaultBotProperties @@ -202,7 +201,7 @@ class BotInfo: @staticmethod - def start_info_out() -> str: + def start_info_out(out: bool = True) -> str: bot_time: str = f"Бот @{BotInfo.username} запущен в {datetime.now().strftime("%S:%M:%H %d-%m-%Y")}\n" bot_name: str = f"Основное имя: {BotInfo.first_name}\n" bot_postname: str = f" Доп. имя: {BotInfo.last_name}\n" @@ -221,9 +220,9 @@ class BotInfo: f"{bot_added_to_attachment_menu} {bot_supports_inline_queries} {bot_can_connect_to_business} " f"{bot_has_main_web_app}") - # Печатаем все данные в консоль с задержкой в 1 секунду - sleep(1) - print(f"\033[34m{bot_all_info}\033[0m") + # Печатаем все данные в консоль + if out: + print(f"\033[34m{bot_all_info}\033[0m") # Записываем информацию в файл try: @@ -257,4 +256,3 @@ class BotInfo: await cls.set_description(bots=bots) await cls.set_short_description(bots=bots) await cls.set_name(bots=bots) - cls.start_info_out() diff --git a/count.py b/count.py new file mode 100644 index 0000000..0cfd1f3 --- /dev/null +++ b/count.py @@ -0,0 +1,44 @@ +from pathlib import Path +from typing import Dict + + +def count_python_lines(project_path: str = ".", exclude: str = ".venv") -> Dict[str, int]: + """ + Подсчитывает количество строк кода во всех Python (.py) файлах проекта. + + Args: + project_path (str): Путь к директории проекта. По умолчанию — текущая папка. + exclude (str): Имя директории, которую нужно исключить (например, .venv). + + Returns: + Dict[str, int]: Словарь с двумя ключами: + - "files": количество найденных файлов .py + - "lines": общее количество строк во всех .py файлах + """ + root: Path = Path(project_path) + total_lines: int = 0 + file_count: int = 0 + + # Рекурсивный обход всех файлов + for file_path in root.rglob("*.py"): + # Игнорируем .venv и любые подпапки внутри него + if exclude in file_path.parts: + continue + + try: + with file_path.open("r", encoding="utf-8") as f: + # Считаем количество строк в файле + line_count = sum(1 for _ in f) + total_lines += line_count + file_count += 1 + except (UnicodeDecodeError, PermissionError): + # Иногда могут встретиться битые файлы или без прав доступа + continue + + return {"files": file_count, "lines": total_lines} + + +if __name__ == "__main__": + stats = count_python_lines() + print(f"📊 Найдено файлов: {stats['files']}") + print(f"📄 Всего строк кода: {stats['lines']}") diff --git a/main.py b/main.py index 7c04a17..3d04daa 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,8 @@ from asyncio import run -from bot import BotInfo, bot, dp, router -from bot.core import server -from bot.middlewares import setup_middlewares -from database import db from configs import Webhook +from database import db +from bot import BotInfo, bot, dp, router, server, setup_middlewares from middleware.loggers import setup_logging, loggers @@ -40,11 +38,13 @@ async def main() -> None: # Выбор режима работы: webhook или polling if Webhook.WEBHOOK: - loggers.info(f"Запуск бота @{BotInfo.username} в режиме вебхука...\n") + loggers.info(f"Запуск бота @{BotInfo.username} в режиме webhook...") + BotInfo.start_info_out() await server.serve() else: - loggers.info(f"Бот @{BotInfo.username} запущен в режиме polling...\n") + loggers.info(f"Бот @{BotInfo.username} запущен в режиме polling...") + BotInfo.start_info_out() await dp.start_polling(bot) except Exception as e: