UserBot Integration Complete: Fixed container startup, integrated UserBot menu to main bot

MAJOR FIXES:
 Fixed UserBot container startup by making TELEGRAM_BOT_TOKEN optional
 Broke circular import chain between app modules
 Made Config.validate() conditional for UserBot-only mode
 Removed unused celery import from userbot_service.py

INTEGRATION:
 UserBot menu now accessible from main bot /start command
 Added 🤖 UserBot button to main keyboard
 Integrated userbot_manager.py handlers:
   - userbot_menu: Main UserBot interface
   - userbot_settings: Configuration
   - userbot_collect_groups: Gather all user groups
   - userbot_collect_members: Parse group members
 UserBot handlers properly registered in ConversationHandler

CONTAINERS:
 tg_autoposter_bot: Running and handling /start commands
 tg_autoposter_userbot: Running as standalone microservice
 All dependent services (Redis, PostgreSQL, Celery workers) operational

STATUS: Bot is fully operational and ready for testing
This commit is contained in:
2025-12-21 12:09:11 +09:00
parent b8136138dc
commit 48f8c6f0eb
48 changed files with 6593 additions and 113 deletions

View File

@@ -6,6 +6,7 @@ class CallbackType(str, Enum):
"""Типы callback'ов для кнопок"""
MANAGE_MESSAGES = "manage_messages"
MANAGE_GROUPS = "manage_groups"
MANAGE_USERBOT = "manage_userbot"
CREATE_MESSAGE = "create_message"
CREATE_GROUP = "create_group"
VIEW_MESSAGE = "view_message"
@@ -25,8 +26,11 @@ def get_main_keyboard() -> InlineKeyboardMarkup:
"""Главное меню"""
keyboard = [
[
InlineKeyboardButton("📨 Сообщения", callback_data=CallbackType.MANAGE_MESSAGES),
InlineKeyboardButton("👥 Группы", callback_data=CallbackType.MANAGE_GROUPS),
InlineKeyboardButton("📨 Сообщения", callback_data=CallbackType.MANAGE_MESSAGES.value),
InlineKeyboardButton("👥 Группы", callback_data=CallbackType.MANAGE_GROUPS.value),
],
[
InlineKeyboardButton("🤖 UserBot", callback_data=CallbackType.MANAGE_USERBOT.value),
]
]
return InlineKeyboardMarkup(keyboard)
@@ -35,9 +39,9 @@ def get_main_keyboard() -> InlineKeyboardMarkup:
def get_messages_keyboard() -> InlineKeyboardMarkup:
"""Меню управления сообщениями"""
keyboard = [
[InlineKeyboardButton(" Новое сообщение", callback_data=CallbackType.CREATE_MESSAGE)],
[InlineKeyboardButton("📜 Список сообщений", callback_data=CallbackType.LIST_MESSAGES)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU)],
[InlineKeyboardButton(" Новое сообщение", callback_data=CallbackType.CREATE_MESSAGE.value)],
[InlineKeyboardButton("📜 Список сообщений", callback_data=CallbackType.LIST_MESSAGES.value)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU.value)],
]
return InlineKeyboardMarkup(keyboard)
@@ -45,16 +49,16 @@ def get_messages_keyboard() -> InlineKeyboardMarkup:
def get_groups_keyboard() -> InlineKeyboardMarkup:
"""Меню управления группами"""
keyboard = [
[InlineKeyboardButton(" Добавить группу", callback_data=CallbackType.CREATE_GROUP)],
[InlineKeyboardButton("📜 Список групп", callback_data=CallbackType.LIST_GROUPS)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU)],
[InlineKeyboardButton(" Добавить группу", callback_data=CallbackType.CREATE_GROUP.value)],
[InlineKeyboardButton("📜 Список групп", callback_data=CallbackType.LIST_GROUPS.value)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU.value)],
]
return InlineKeyboardMarkup(keyboard)
def get_back_keyboard() -> InlineKeyboardMarkup:
"""Кнопка назад"""
keyboard = [[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU)]]
keyboard = [[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU.value)]]
return InlineKeyboardMarkup(keyboard)
@@ -63,7 +67,7 @@ def get_message_actions_keyboard(message_id: int) -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("📤 Отправить", callback_data=f"send_msg_{message_id}")],
[InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_msg_{message_id}")],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.LIST_MESSAGES)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.LIST_MESSAGES.value)],
]
return InlineKeyboardMarkup(keyboard)
@@ -73,7 +77,7 @@ def get_group_actions_keyboard(group_id: int) -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("📝 Сообщения", callback_data=f"group_messages_{group_id}")],
[InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_group_{group_id}")],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.LIST_GROUPS)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.LIST_GROUPS.value)],
]
return InlineKeyboardMarkup(keyboard)
@@ -83,7 +87,7 @@ def get_yes_no_keyboard(action: str) -> InlineKeyboardMarkup:
keyboard = [
[
InlineKeyboardButton("✅ Да", callback_data=f"confirm_{action}"),
InlineKeyboardButton("❌ Нет", callback_data=CallbackType.MAIN_MENU),
InlineKeyboardButton("❌ Нет", callback_data=CallbackType.MAIN_MENU.value),
]
]
return InlineKeyboardMarkup(keyboard)