Files

218 lines
7.9 KiB
Python

import telebot
import requests
import sys
import os
import threading
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
from telebot import apihelper
from config import TOKEN
from database import get_user
from handlers.registration import process_registration, is_in_registration
from handlers.menu import show_main_menu, handle_menu_choice
from keyboards.reply_keyboards import get_main_menu_keyboard
# === НАСТРОЙКА ДЛЯ ОБХОДА БЛОКИРОВОК ===
session = requests.Session()
retry = Retry(total=5, backoff_factor=1)
adapter = HTTPAdapter(max_retries=retry)
session.mount('https://', adapter)
apihelper.session = session
apihelper.CONNECT_TIMEOUT = 30
apihelper.READ_TIMEOUT = 30
# === ИНИЦИАЛИЗАЦИЯ БОТА ===
bot = telebot.TeleBot(TOKEN)
# === ФЛАГ ДЛЯ УПРАВЛЕНИЯ БОТОМ ===
bot_running = True
# === КОМАНДА /start ===
@bot.message_handler(commands=['start'])
def start(message):
user_id = message.from_user.id
user = get_user(user_id)
if user:
bot.send_message(
user_id,
f"👋 С возвращением, {user[2]}!",
reply_markup=get_main_menu_keyboard()
)
return
# Начинаем регистрацию
from handlers.registration import user_data as reg_data
reg_data[user_id] = {'step': 1}
bot.send_message(
user_id,
"👋 Привет! Я твой бизнес-помощник.\n\n"
"Давай познакомимся! Как тебя зовут?\n"
"(Напиши своё имя)"
)
# === КОМАНДА /stop - ОСТАНОВИТЬ БОТА (ДЛЯ ВСЕХ) ===
@bot.message_handler(commands=['stop'])
def stop_bot(message):
user_id = message.from_user.id
global bot_running
bot_running = False
bot.send_message(user_id, "🛑 Вы остановилибота...")
print(f"🛑 Бот остановлен пользователем {user_id}")
# Останавливаем бота
bot.stop_polling()
os._exit(0)
# === КОМАНДА /restart - ПЕРЕЗАПУСТИТЬ БОТА (ДЛЯ ВСЕХ) ===
@bot.message_handler(commands=['restart'])
def restart_bot(message):
user_id = message.from_user.id
bot.send_message(user_id, "🔄 Перезапускаю бота...")
print(f"🔄 Перезапуск бота пользователем {user_id}")
# Перезапускаем
bot.stop_polling()
os.execv(sys.executable, ['python'] + sys.argv)
# === КОМАНДА /status - СТАТУС БОТА (ДЛЯ ВСЕХ) ===
@bot.message_handler(commands=['status'])
def status_bot(message):
user_id = message.from_user.id
import datetime
now = datetime.datetime.now().strftime("%d.%m.%Y %H:%M:%S")
# Проверяем, есть ли PIAPI_API_KEY
try:
from config import PIAPI_API_KEY
piapi_status = "подключен ✅" if PIAPI_API_KEY else "не подключен ⚠️"
except:
piapi_status = "не подключен ⚠️"
status_text = f"""
📊 **СТАТУС БОТА**
🟢 Состояние: **Активен** ✅
📅 Текущее время: {now}
📋 **Информация:**
• Бот запущен и работает
• База данных: подключена ✅
• PiAPI: {piapi_status}
💡 **Команды управления:**
/stop - остановить бота
/restart - перезапустить бота
/status - этот статус
"""
bot.send_message(user_id, status_text, parse_mode='Markdown')
# === КОМАНДА /help - ПОМОЩЬ ===
@bot.message_handler(commands=['help'])
def help_command(message):
user_id = message.from_user.id
help_text = """
🤖 **ПОМОЩЬ ПО БОТУ**
📋 **Основные команды:**
/start - начать работу или открыть меню
/help - показать эту справку
/status - статус бота
/stop - остановить бота
/restart - перезапустить бота
📱 **Меню после регистрации:**
📋 Мой профиль - посмотреть свои данные
✏️ Обновить описание - изменить описание бизнеса
📊 Статистика - статистика
💡 Предложить контент - сгенерировать пост для соцсетей
⚙️ Настройки - настройки бота
🗂 Личный кабинет - расширенный профиль, пост в своём стиле, контент-план, история постов и статистика
💡 **Как использовать:**
1. Напиши /start
2. Пройди регистрацию
3. Используй кнопки меню
4. Нажми "💡 Предложить контент" для генерации поста
"""
bot.send_message(user_id, help_text, parse_mode='Markdown')
# === ОБРАБОТКА ВСЕХ СООБЩЕНИЙ ===
@bot.message_handler(func=lambda message: True)
def handle_messages(message):
global bot_running
if not bot_running:
bot.send_message(message.chat.id, "🛑 Бот остановлен. Напиши /restart для перезапуска.")
return
user_id = message.from_user.id
text = message.text
# Проверяем, зарегистрирован ли пользователь
user = get_user(user_id)
if user:
# Если пользователь в процессе обновления описания
from handlers.registration import user_data as reg_data
if user_id in reg_data and reg_data[user_id].get('step') == 'edit_description':
from database import update_user_description
update_user_description(user_id, text)
del reg_data[user_id]
bot.send_message(
user_id,
"✅ Описание обновлено!",
reply_markup=get_main_menu_keyboard()
)
return
# Обрабатываем выбор в меню
if handle_menu_choice(message, bot):
return
# Если ничего не подошло - показываем меню
bot.send_message(
user_id,
"Используй кнопки меню 👇",
reply_markup=get_main_menu_keyboard()
)
return
# Если пользователь НЕ зарегистрирован - регистрируем
if is_in_registration(user_id):
process_registration(message, bot)
else:
bot.send_message(
user_id,
"❌ Ты не зарегистрирован. Напиши /start"
)
# === ЗАПУСК БОТА ===
if __name__ == '__main__':
from cabinet_service.runner import run as run_cabinet_service
cabinet_thread = threading.Thread(target=run_cabinet_service, daemon=True)
cabinet_thread.start()
print("🗂 Сервис личного кабинета запущен в фоне")
print("🤖 БОТ ЗАПУЩЕН!")
print("📋 Команды:")
print(" /start - начать работу")
print(" /help - помощь")
print(" /status - статус бота")
print(" /stop - остановить бота")
print(" /restart - перезапустить бота")
print("✅ Используй кнопки для навигации")
try:
bot.infinity_polling(timeout=30)
except KeyboardInterrupt:
print("🛑 Бот остановлен вручную (Ctrl+C)")
except Exception as e:
print(f"❌ Ошибка: {e}")