fix: исправить отступы в main.py и подключить instruct модуль

This commit is contained in:
Денис Кривоченко
2026-07-20 16:27:48 +07:00
parent eedd99e29a
commit 493f4c6aff
+53 -3
View File
@@ -1,8 +1,11 @@
"""
TrueConf Bot KLEVER - Main Entry Point
"""
import sys import sys
import asyncio import asyncio
import logging import logging
import os import os
import psutil import psutil
import time import time
from datetime import datetime from datetime import datetime
@@ -17,20 +20,27 @@ logging.basicConfig(
) )
logging.getLogger('trueconf.client.chatbot').propagate = False logging.getLogger('trueconf.client.chatbot').propagate = False
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Добавляем путь к проекту в sys.path # Добавляем путь к проекту в sys.path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from trueconf import Bot, Dispatcher, Router, Message from trueconf import Bot, Dispatcher, Router, Message
from config.config import * from config.config import *
from utils.states import set_state, clear_state, get_state from utils.states import set_state, clear_state, get_state
from utils import states from utils import states
# 🎯 ИСПРАВЛЕНО: Импортируем оба варианта меню (короткий и приветственный) # 🎯 ИСПРАВЛЕНО: Импортируем оба варианта меню (короткий и приветственный)
from utils.menu import MENU_TEXT, WELCOME_TEXT, MENU_MAP from utils.menu import MENU_TEXT, WELCOME_TEXT, MENU_MAP
# ========================================================= # =========================================================
# 🔄 МОДУЛЬ АВТОМАТИЧЕСКОГО КОНТРОЛЯ СЕССИЙ И ТАЙМАУТОВ # 🔄 МОДУЛЬ АВТОМАТИЧЕСКОГО КОНТРОЛЯ СЕССИЙ И ТАЙМАУТОВ
# =========================================================
USER_LAST_ACTIVITY = {} USER_LAST_ACTIVITY = {}
USER_MENU_SHOWN = {} USER_MENU_SHOWN = {}
DEFAULT_TIMEOUT = 1800 DEFAULT_TIMEOUT = 1800
_orig_get_state = states.get_state _orig_get_state = states.get_state
def patched_get_state(user_id): def patched_get_state(user_id):
current_time = time.time() current_time = time.time()
last_activity = USER_LAST_ACTIVITY.get(user_id) last_activity = USER_LAST_ACTIVITY.get(user_id)
@@ -41,30 +51,49 @@ def patched_get_state(user_id):
logger.info(f"⏳ Сессия пользователя {user_id} сброшена по таймауту бездействия ({session_timeout} сек).") logger.info(f"⏳ Сессия пользователя {user_id} сброшена по таймауту бездействия ({session_timeout} сек).")
USER_LAST_ACTIVITY[user_id] = current_time USER_LAST_ACTIVITY[user_id] = current_time
return _orig_get_state(user_id) return _orig_get_state(user_id)
states.get_state = patched_get_state states.get_state = patched_get_state
get_state = patched_get_state get_state = patched_get_state
# =========================================================
# 🔌 КОРПОРАТИВНЫЕ ШАБЛОНЫ ТЕКСТОВ КЛЕВЕР # 🔌 КОРПОРАТИВНЫЕ ШАБЛОНЫ ТЕКСТОВ КЛЕВЕР
# =========================================================
from utils.texts import UNKNOWN_MAIN_CMD_TEXT from utils.texts import UNKNOWN_MAIN_CMD_TEXT
from utils.stats_logger import log_menu_stats from utils.stats_logger import log_menu_stats
# =========================================================
# ФУНКЦИЯ МОНИТОРИНГА ОПЕРАТИВНОЙ ПАМЯТИ # ФУНКЦИЯ МОНИТОРИНГА ОПЕРАТИВНОЙ ПАМЯТИ
# =========================================================
def log_ram_usage(stage_name: str): def log_ram_usage(stage_name: str):
process = psutil.Process(os.getpid()) process = psutil.Process(os.getpid())
ram_mb = process.memory_info().rss / 1024 / 1024 ram_mb = process.memory_info().rss / 1024 / 1024
logger.info(f"📊 [RAM MONITOR] {stage_name}: {ram_mb:.2f} MB") logger.info(f"📊 [RAM MONITOR] {stage_name}: {ram_mb:.2f} MB")
log_ram_usage("Старт скрипта (базовый вес)") log_ram_usage("Старт скрипта (базовый вес)")
from photo_bot.handlers import router as photo_router, PHOTO_MAIN_MENU_TEXT from photo_bot.handlers import router as photo_router, PHOTO_MAIN_MENU_TEXT
log_ram_usage("После импорта photo_bot") log_ram_usage("После импорта photo_bot")
from service_desk.handlers import router as sd_router, SD_MAIN_MENU_TEXT from service_desk.handlers import router as sd_router, SD_MAIN_MENU_TEXT
log_ram_usage("После импорта service_desk") log_ram_usage("После импорта service_desk")
from transcription_bot.handlers import router as transcription_router, TRANSCRIPTION_MAIN_MENU_TEXT from transcription_bot.handlers import router as transcription_router, TRANSCRIPTION_MAIN_MENU_TEXT
log_ram_usage("После импорта transcription_router (Виспер)") log_ram_usage("После импорта transcription_router (Виспер)")
from search_bot.handlers import router as search_router, SEARCH_MAIN_MENU_TEXT from search_bot.handlers import router as search_router, SEARCH_MAIN_MENU_TEXT
log_ram_usage("После импорта search_router") log_ram_usage("После импорта search_router")
from lk.handlers import router as lk_router from lk.handlers import router as lk_router
from instruct.handlers import router as instruct_router
log_ram_usage("После импорта lk_router (Личный кабинет)") log_ram_usage("После импорта lk_router (Личный кабинет)")
from instruct.handlers import router as instruct_router, INSTRUCT_MAIN_MENU_TEXT
log_ram_usage("После импорта instruct_router (Инструкции)")
# =========================================================
# ГЛАВНЫЙ РОУТЕР # ГЛАВНЫЙ РОУТЕР
# =========================================================
main_router = Router() main_router = Router()
@main_router.message() @main_router.message()
async def main_menu(msg: Message): async def main_menu(msg: Message):
if ENABLE_WHITELIST and msg.from_user.id not in ALLOWED_USERS: if ENABLE_WHITELIST and msg.from_user.id not in ALLOWED_USERS:
@@ -72,12 +101,15 @@ async def main_menu(msg: Message):
return return
user_id = msg.from_user.id user_id = msg.from_user.id
if getattr(msg, "handled", False): if getattr(msg, "handled", False):
return
if get_state(user_id) is not None: if get_state(user_id) is not None:
return
is_attachment = hasattr(msg.type, "name") and msg.type.name == "ATTACHMENT" is_attachment = hasattr(msg.type, "name") and msg.type.name == "ATTACHMENT"
if is_attachment: if is_attachment:
await msg.answer("⚠️ <b>Сначала выберите режим работы из меню.</b>", parse_mode="html") await msg.answer("⚠️ <b>Сначала выберите режим работы из меню.</b>", parse_mode="html")
await msg.answer(WELCOME_TEXT, parse_mode="html") await msg.answer(WELCOME_TEXT, parse_mode="html")
USER_MENU_SHOWN[user_id] = True USER_MENU_SHOWN[user_id] = True
return
menu_shown = USER_MENU_SHOWN.get(user_id, False) menu_shown = USER_MENU_SHOWN.get(user_id, False)
if msg.text: if msg.text:
cmd = msg.text.strip().lower() cmd = msg.text.strip().lower()
@@ -89,30 +121,47 @@ async def main_menu(msg: Message):
await msg.answer(SD_MAIN_MENU_TEXT, parse_mode="html") await msg.answer(SD_MAIN_MENU_TEXT, parse_mode="html")
return return
elif action == "PHOTO": elif action == "PHOTO":
USER_MENU_SHOWN[user_id] = True
set_state(user_id, "PHOTO_MODE") set_state(user_id, "PHOTO_MODE")
log_menu_stats(user_id, "Photo Bot", "Вход") log_menu_stats(user_id, "Photo Bot", "Вход")
await msg.answer(PHOTO_MAIN_MENU_TEXT, parse_mode="html") await msg.answer(PHOTO_MAIN_MENU_TEXT, parse_mode="html")
return
elif action == "TRANSCRIPTION": elif action == "TRANSCRIPTION":
USER_MENU_SHOWN[user_id] = True
set_state(user_id, "TRANSCRIPTION_MODE") set_state(user_id, "TRANSCRIPTION_MODE")
log_menu_stats(user_id, "Speech-to-Text", "Вход") log_menu_stats(user_id, "Speech-to-Text", "Вход")
await msg.answer(TRANSCRIPTION_MAIN_MENU_TEXT, parse_mode="html") await msg.answer(TRANSCRIPTION_MAIN_MENU_TEXT, parse_mode="html")
return
elif action == "SEARCH": elif action == "SEARCH":
USER_MENU_SHOWN[user_id] = True
set_state(user_id, "SEARCH_MODE") set_state(user_id, "SEARCH_MODE")
log_menu_stats(user_id, "Search Bot", "Вход") log_menu_stats(user_id, "Search Bot", "Вход")
await msg.answer(SEARCH_MAIN_MENU_TEXT, parse_mode="html") await msg.answer(SEARCH_MAIN_MENU_TEXT, parse_mode="html")
return
elif action == "LK": elif action == "LK":
USER_MENU_SHOWN[user_id] = True
set_state(user_id, "LK_MODE") set_state(user_id, "LK_MODE")
log_menu_stats(user_id, "Личный кабинет", "Вход") log_menu_stats(user_id, "Личный кабинет", "Вход")
from lk.handlers import send_dynamic_lk_main_menu from lk.handlers import send_dynamic_lk_main_menu
await send_dynamic_lk_main_menu(msg, user_id) await send_dynamic_lk_main_menu(msg, user_id)
return
elif action == "INSTRUCT":
USER_MENU_SHOWN[user_id] = True
set_state(user_id, "INSTRUCT_MODE")
log_menu_stats(user_id, "Инструкции", "Вход")
from instruct.handlers import send_instruct_main_menu
await send_instruct_main_menu(msg, user_id)
return
else: else:
if not menu_shown: if not menu_shown:
USER_MENU_SHOWN[user_id] = True USER_MENU_SHOWN[user_id] = True
await msg.answer(WELCOME_TEXT, parse_mode="html") await msg.answer(WELCOME_TEXT, parse_mode="html")
return return
await msg.answer(UNKNOWN_MAIN_CMD_TEXT, parse_mode="html") await msg.answer(UNKNOWN_MAIN_CMD_TEXT, parse_mode="html")
return
USER_MENU_SHOWN[user_id] = True USER_MENU_SHOWN[user_id] = True
await msg.answer(WELCOME_TEXT, parse_mode="html") await msg.answer(WELCOME_TEXT, parse_mode="html")
async def main(): async def main():
logger.info("Инициализация Dispatcher и подключение роутеров...") logger.info("Инициализация Dispatcher и подключение роутеров...")
dp = Dispatcher() dp = Dispatcher()
@@ -137,6 +186,7 @@ async def main():
asyncio.create_task(send_startup_notification(bot, target_chat)) asyncio.create_task(send_startup_notification(bot, target_chat))
logger.info("Подключение к серверу TrueConf...") logger.info("Подключение к серверу TrueConf...")
await bot.run() await bot.run()
if __name__ == "__main__": if __name__ == "__main__":
try: try:
main_router.message() main_router.message()