Initial commit

This commit is contained in:
Lolzteam
2026-07-30 10:22:59 +00:00
commit 8953b2f4bc
48 changed files with 2564 additions and 0 deletions
+103
View File
@@ -0,0 +1,103 @@
# - *- coding: utf- 8 - *-
import asyncio
import sys
import colorama
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from tgbot.data.config import BOT_DATABASE_EXPORT, BOT_TOKEN, BOT_SCHEDULER, get_admins, validate_bot_config
from tgbot.database.core import close_database
from tgbot.database.repository import prepare_database
from tgbot.middlewares import register_all_middlewares
from tgbot.routers import register_all_routers
from tgbot.services.api_session import AsyncRequestSession
from tgbot.utils.misc.bot_commands import set_commands
from tgbot.utils.misc.bot_logging import bot_logger
from tgbot.utils.misc_functions import autobackup_admin, startup_notify
# Включаем мгновенный вывод print() без flush=True в каждом вызове
def configure_console_output() -> None:
for stream in (sys.stdout, sys.stderr):
if hasattr(stream, "reconfigure"):
stream.reconfigure(line_buffering=True, write_through=True)
configure_console_output()
colorama.init()
# Запуск задач по расписанию
async def scheduler_start(bot):
if BOT_DATABASE_EXPORT:
BOT_SCHEDULER.add_job(
autobackup_admin,
trigger="cron",
hour=0,
args=(bot,),
id="autobackup_admin",
replace_existing=True,
coalesce=True,
misfire_grace_time=60,
)
if not BOT_SCHEDULER.running:
BOT_SCHEDULER.start()
# Запуск бота и базовой обвязки
async def main():
validate_bot_config()
await prepare_database() # Проверка готовности БД
dp = Dispatcher() # Диспетчер событий
arSession = AsyncRequestSession() # Общая сессия aiohttp
bot = Bot( # Образ Бота
token=BOT_TOKEN,
default=DefaultBotProperties(
parse_mode=ParseMode.HTML
),
)
register_all_middlewares(dp) # Подключение мидлварей
register_all_routers(dp) # Подключение роутера
try:
await set_commands(bot) # Обновление команды в Telegram
await startup_notify(bot) # Сообщаем админам о старте
await scheduler_start(bot) # Подключение задач по расписанию
bot_info = await bot.get_me()
bot_logger.info("Бот запущен: @%s", bot_info.username)
print(colorama.Fore.LIGHTYELLOW_EX + f"~~~~~ Бот запущен - @{bot_info.username} ~~~~~")
print(colorama.Fore.LIGHTBLUE_EX + "~~~~~ TG developer - @djimbox ~~~~~")
print(colorama.Fore.RESET)
if len(get_admins()) == 0:
print("***** УКАЖИТЕ BOT_ADMIN_IDS В .env *****")
await bot.delete_webhook() # Сбрасывание вебхука, если он был
await bot.get_updates(offset=-1) # Чистка старых апдейтов
# Запуск бота (polling режим)
await dp.start_polling(
bot,
arSession=arSession,
allowed_updates=dp.resolve_used_update_types(),
)
finally:
if BOT_SCHEDULER.running:
BOT_SCHEDULER.shutdown(wait=False)
await arSession.close() # Закрытие сессии aiohttp
await bot.session.close() # Закрытие сессии API Telegram
await close_database() # Закрытие соединений с БД
if __name__ == "__main__":
try:
asyncio.run(main())
except (KeyboardInterrupt, SystemExit):
bot_logger.warning("Бот остановлен")