Initial local state

This commit is contained in:
2026-07-15 07:17:25 +05:00
commit 68221821a5
78 changed files with 10318 additions and 0 deletions
+196
View File
@@ -0,0 +1,196 @@
# - *- coding: utf- 8 - *-
import asyncio
import os
import sys
import colorama
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.enums import ParseMode
from tgbot.data.config import BOT_DATABASE_EXPORT, BOT_SCHEDULER, BOT_TOKEN, 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.bot_models import ARS
from tgbot.utils.misc_functions import (
autobackup_admin,
autosettings_unix,
check_bot_username,
check_mail,
check_update,
startup_notify,
update_profit_day,
update_profit_month,
update_profit_week,
)
# Включение мгновенного вывода консоли
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: Bot, arSession: ARS):
# Автоматический сброс ежемесячной статистики
BOT_SCHEDULER.add_job(
update_profit_month,
trigger="cron",
day=1,
hour=0,
minute=0,
second=5,
id="update_profit_month",
replace_existing=True,
coalesce=True,
misfire_grace_time=60,
)
# Автоматический сброс еженедельной статистики
BOT_SCHEDULER.add_job(
update_profit_week,
trigger="cron",
day_of_week="mon",
hour=0,
minute=0,
second=10,
id="update_profit_week",
replace_existing=True,
coalesce=True,
misfire_grace_time=60,
)
# Автоматический сброс ежедневной статистики
BOT_SCHEDULER.add_job(
update_profit_day,
trigger="cron",
hour=0,
minute=0,
second=15,
args=(bot,),
id="update_profit_day",
replace_existing=True,
coalesce=True,
misfire_grace_time=60,
)
# Автоматический бэкап БД (если включено)
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,
)
# Ежедневная проверка обновлений
BOT_SCHEDULER.add_job(
check_update,
trigger="cron",
hour=0,
args=(bot, arSession),
id="check_update",
replace_existing=True,
coalesce=True,
misfire_grace_time=60,
)
# Ежедневная проверка важных пушей
BOT_SCHEDULER.add_job(
check_mail,
trigger="cron",
hour=12,
args=(bot, arSession),
id="check_mail",
replace_existing=True,
coalesce=True,
misfire_grace_time=60,
)
if not BOT_SCHEDULER.running:
BOT_SCHEDULER.start()
# Запуск миграций, роутеров и polling
async def main():
validate_bot_config()
await prepare_database()
dp = Dispatcher()
arSession = AsyncRequestSession()
proxy = ""
session = AiohttpSession(proxy=proxy) if len(proxy) > 1 else AiohttpSession()
bot = Bot(
token=BOT_TOKEN,
session=session,
default=DefaultBotProperties(
parse_mode=ParseMode.HTML
),
)
register_all_middlewares(dp)
register_all_routers(dp)
try:
await autosettings_unix()
await set_commands(bot)
await check_bot_username(bot)
await check_update(bot, arSession)
await check_mail(bot, arSession)
await startup_notify(bot, arSession)
await scheduler_start(bot, arSession)
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)
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()
await bot.session.close()
await close_database()
if __name__ == "__main__":
try:
asyncio.run(main())
except (KeyboardInterrupt, SystemExit):
bot_logger.warning("Бот остановлен")
finally:
if sys.platform.startswith("win"):
os.system("cls")
else:
os.system("clear")