218 lines
7.9 KiB
Python
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}") |