-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
111 lines (89 loc) · 5.61 KB
/
bot.py
File metadata and controls
111 lines (89 loc) · 5.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""Точка входа Telegram бота — инициализация, регистрация обработчиков, запуск."""
import logging
from telegram import Update, BotCommand
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, ContextTypes
from src.bot.handlers import start_command, help_command, settings_command, quote_command, button_callback, favorites_command, favorites_callback
from src.bot.admin import get_add_quote_handler, get_delete_quote_handler, get_edit_quote_handler, get_admin_users_handler, get_admin_quote_stats_handler, get_broadcast_handler
from src.bot.library_handlers import books_command, library_callback
from src.bot.scheduler import setup_scheduler
import config
# Настройка логирования
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
async def post_init(application: Application):
"""Настройка команд меню бота после инициализации"""
bot_commands = [
BotCommand("start", "Начать работу с ботом"),
BotCommand("settings", "Настроить подписки"),
BotCommand("favorites", "Мои избранные цитаты"),
BotCommand("books", "Библиотека книг"),
BotCommand("quote", "Получить случайную цитату"),
BotCommand("help", "Помощь и информация"),
]
# Админские команды (видны только администраторам)
admin_commands = [
BotCommand("start", "Начать работу с ботом"),
BotCommand("settings", "Настроить подписки"),
BotCommand("favorites", "Мои избранные цитаты"),
BotCommand("books", "Библиотека книг"),
BotCommand("quote", "Получить случайную цитату"),
BotCommand("help", "Помощь и информация"),
BotCommand("admin_add", "➕ Добавить цитату"),
BotCommand("admin_edit", "✏️ Редактировать цитату"),
BotCommand("admin_delete", "🗑 Удалить цитату"),
BotCommand("admin_users", "👥 Статистика пользователей"),
BotCommand("admin_quote_stats", "📊 Статистика по избранному"),
BotCommand("broadcast", "📢 Рассылка сообщений"),
]
# Устанавливаем команды для всех пользователей
await application.bot.set_my_commands(bot_commands)
# Устанавливаем админские команды для каждого администратора
from telegram import BotCommandScopeChat
for admin_id in config.ADMIN_USER_IDS:
await application.bot.set_my_commands(
admin_commands,
scope=BotCommandScopeChat(chat_id=admin_id)
)
logger.info(f"Bot menu commands set successfully! Admin commands for {len(config.ADMIN_USER_IDS)} admin(s)")
def main():
"""Запуск бота"""
# Проверка конфигурации
if not config.TELEGRAM_BOT_TOKEN:
logger.error("TELEGRAM_BOT_TOKEN is not set. Please check your .env file.")
return
# Создаём приложение
application = Application.builder().token(config.TELEGRAM_BOT_TOKEN).post_init(post_init).build()
# Регистрируем обработчики
application.add_handler(CommandHandler("start", start_command))
application.add_handler(CommandHandler("help", help_command))
application.add_handler(CommandHandler("settings", settings_command))
application.add_handler(CommandHandler("quote", quote_command))
application.add_handler(CommandHandler("favorites", favorites_command))
application.add_handler(CommandHandler("books", books_command))
# Регистрируем админские обработчики диалогов (должны быть до общего callback обработчика)
application.add_handler(get_add_quote_handler())
application.add_handler(get_delete_quote_handler())
application.add_handler(get_edit_quote_handler())
application.add_handler(get_admin_users_handler())
application.add_handler(get_admin_quote_stats_handler())
application.add_handler(get_broadcast_handler())
# Регистрируем callback обработчик для настроек и подписок (с паттерном, чтобы не перехватывать админские callback-и)
application.add_handler(CallbackQueryHandler(button_callback, pattern='^(open_settings|add_sub_|remove_sub_|change_time_|select_time_|cancel_subscription)'))
# Регистрируем callback обработчик для избранного
application.add_handler(CallbackQueryHandler(favorites_callback, pattern='^(fav_|unfav_|favpage_|favdel_)'))
# Регистрируем callback обработчик для библиотеки
application.add_handler(CallbackQueryHandler(library_callback, pattern='^lib_'))
# Настраиваем планировщик
scheduler = setup_scheduler(application)
logger.info("Bot started successfully!")
logger.info("Scheduler is active. Quotes will be sent at:")
logger.info(" - Morning: 8:00")
logger.info(" - Day: 14:00")
logger.info(" - Evening: 20:00")
# Запускаем бота
application.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == '__main__':
main()